B
    CVvgV:  ã               @   s´   d dl Z d dlZd dlZd dlmZ d dlmZ d dlmZ d dl	m
Z
 d dlmZmZmZ d dlmZ d dlmZ d d	lmZ d d
lmZmZmZ d dlmZ G dd„ deƒZdS )é    N)Ú	lru_cache)Úchain)Úsettings)Ú
FieldError)ÚDatabaseErrorÚNotSupportedErrorÚmodels)ÚBaseDatabaseOperations)ÚCol)Útimezone)Ú
parse_dateÚparse_datetimeÚ
parse_time)Úcached_propertyc                   s`  e Zd ZdZdddœZdZdd„ Zdd„ Zd	d
„ Zdd„ Z	dPdd„Z
dQdd„Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zd d!„ Zd"d#„ Zd$d%„ Zd&d'„ Zd(d)„ Zed*d+„ ƒZd,d,d-œd.d/„Zd0d1„ Zd2d3„ Zd4d5„ Z‡ fd6d7„Zd8d9„ Zd:d;„ Z d<d=„ Z!d>d?„ Z"d@dA„ Z#dBdC„ Z$dDdE„ Z%‡ fdFdG„Z&dHdI„ Z'dJdK„ Z(dLdM„ Z)dR‡ fdNdO„	Z*‡  Z+S )SÚDatabaseOperationsÚtextZTEXT)Ú	DateFieldÚDateTimeFieldzEXPLAIN QUERY PLANc             C   s:   t |ƒdkrdS t |ƒdkr.| jjjt |ƒ S t |ƒS dS )zà
        SQLite has a compile-time default (SQLITE_LIMIT_VARIABLE_NUMBER) of
        999 variables per query.

        If there's only a single field to insert, the limit is 500
        (SQLITE_MAX_COMPOUND_SELECT).
        é   iô  N)ÚlenÚ
connectionÚfeaturesZmax_query_params)ÚselfÚfieldsÚobjs© r   úI/tmp/pip-install-o3oxmrkh/Django/django/db/backends/sqlite3/operations.pyÚbulk_batch_size   s
    z"DatabaseOperations.bulk_batch_sizec          
   C   s¢   t jt jt jf}t jt jt jt jf}t||ƒrvxF| 	¡ D ]:}y
|j
}W n ttfk
r^   Y q8X t||ƒr8tdƒ‚q8W t|t jƒrž|jržt|jƒdkržtdƒ‚d S )Nz{You cannot use Sum, Avg, StdDev, and Variance aggregations on date/time fields in sqlite3 since date/time is saved as text.r   zTSQLite doesn't support DISTINCT on aggregate functions accepting multiple arguments.)r   r   r   Ú	TimeFieldZSumZAvgZVarianceZStdDevÚ
isinstanceZget_source_expressionsÚoutput_fieldÚAttributeErrorr   r   Z	AggregateZdistinctr   Zsource_expressions)r   Ú
expressionZ
bad_fieldsZbad_aggregatesÚexprr    r   r   r   Úcheck_expression_support(   s     



z+DatabaseOperations.check_expression_supportc             C   s   d|  ¡ |f S )zè
        Support EXTRACT with a user-defined function django_date_extract()
        that's registered in connect(). Use single quotes because this is a
        string and could otherwise cause a collision with a field name.
        zdjango_date_extract('%s', %s))Úlower)r   Úlookup_typeÚ
field_namer   r   r   Údate_extract_sqlD   s    z#DatabaseOperations.date_extract_sqlc             C   s   |S )z>Do nothing since formatting is handled in the custom function.r   )r   Úsqlr   r   r   Úformat_for_duration_arithmeticL   s    z1DatabaseOperations.format_for_duration_arithmeticNc             C   s   d|  ¡ |f|  |¡˜ S )Nz#django_date_trunc('%s', %s, %s, %s))r%   Ú_convert_tznames_to_sql)r   r&   r'   Útznamer   r   r   Údate_trunc_sqlP   s    z!DatabaseOperations.date_trunc_sqlc             C   s   d|  ¡ |f|  |¡˜ S )Nz#django_time_trunc('%s', %s, %s, %s))r%   r+   )r   r&   r'   r,   r   r   r   Útime_trunc_sqlW   s    z!DatabaseOperations.time_trunc_sqlc             C   s"   |rt jrd| d| jj fS dS )Nz'%s')ÚNULLr/   )r   ÚUSE_TZr   Ztimezone_name)r   r,   r   r   r   r+   ^   s    
z*DatabaseOperations._convert_tznames_to_sqlc             C   s   d|f|   |¡˜ S )Nz%django_datetime_cast_date(%s, %s, %s))r+   )r   r'   r,   r   r   r   Údatetime_cast_date_sqlc   s    z)DatabaseOperations.datetime_cast_date_sqlc             C   s   d|f|   |¡˜ S )Nz%django_datetime_cast_time(%s, %s, %s))r+   )r   r'   r,   r   r   r   Údatetime_cast_time_sqlh   s    z)DatabaseOperations.datetime_cast_time_sqlc             C   s   d|  ¡ |f|  |¡˜ S )Nz)django_datetime_extract('%s', %s, %s, %s))r%   r+   )r   r&   r'   r,   r   r   r   Údatetime_extract_sqlm   s    z'DatabaseOperations.datetime_extract_sqlc             C   s   d|  ¡ |f|  |¡˜ S )Nz'django_datetime_trunc('%s', %s, %s, %s))r%   r+   )r   r&   r'   r,   r   r   r   Údatetime_trunc_sqlr   s    z%DatabaseOperations.datetime_trunc_sqlc             C   s   d|  ¡ |f S )Nzdjango_time_extract('%s', %s))r%   )r   r&   r'   r   r   r   Útime_extract_sqlw   s    z#DatabaseOperations.time_extract_sqlc             C   s   dS )Nr/   r   )r   r   r   r   Úpk_default_valuez   s    z#DatabaseOperations.pk_default_valuec             C   s”   d}t |ƒ|krPd}x6tdt |ƒ|ƒD ]"}|||| … }||  |¡7 }q&W |S dd dgt |ƒ ¡ }| jj ¡ }z| ||¡ ¡ S | ¡  X dS )zV
        Only for last_executed_query! Don't use this to execute SQL queries!
        iç  r   r   zSELECT z, zQUOTE(?)N)	r   ÚrangeÚ%_quote_params_for_last_executed_queryÚjoinr   ÚcursorÚexecuteZfetchoneÚclose)r   ÚparamsZ
BATCH_SIZEÚresultsÚindexÚchunkr)   r:   r   r   r   r8   }   s    	z8DatabaseOperations._quote_params_for_last_executed_queryc             C   sR   |rJt |ttfƒr|  |¡}n$t| ¡ ƒ}|  |¡}tt||ƒƒ}|| S |S d S )N)r   ÚlistÚtupler8   ÚvaluesÚdictÚzip)r   r:   r)   r=   rC   r   r   r   Úlast_executed_query˜   s    
z&DatabaseOperations.last_executed_queryc             C   s    |  d¡r| d¡r|S d| S )Nú"z"%s")Ú
startswithÚendswith)r   Únamer   r   r   Ú
quote_nameª   s    zDatabaseOperations.quote_namec             C   s   dS )Néÿÿÿÿr   )r   r   r   r   Úno_limit_value¯   s    z!DatabaseOperations.no_limit_valuec          	   C   sB   d}|ddf}| j  ¡ � }| ||¡}dd„ | ¡ D ƒS Q R X d S )Nz÷
        WITH tables AS (
            SELECT %s name
            UNION
            SELECT sqlite_master.name
            FROM sqlite_master
            JOIN tables ON (sql REGEXP %s || tables.name || %s)
        ) SELECT name FROM tables;
        z(?i)\s+references\s+("|\')?z("|\')?\s*\(c             S   s   g | ]}|d  ‘qS )r   r   )Ú.0Úrowr   r   r   ú
<listcomp>Ã   s    z9DatabaseOperations.__references_graph.<locals>.<listcomp>)r   r:   r;   Zfetchall)r   Z
table_nameÚqueryr=   r:   r>   r   r   r   Z__references_graph²   s    	z%DatabaseOperations.__references_graphc             C   s   t dd�| jƒS )Ni   )Úmaxsize)r   Ú%_DatabaseOperations__references_graph)r   r   r   r   Ú_references_graphÅ   s    z$DatabaseOperations._references_graphF)Úreset_sequencesÚallow_cascadec               s`   |r$|r$t t ‡ fdd„|D ƒ¡ƒ}‡ ‡fdd„|D ƒ}|r\dd„ |D ƒ}| ˆ  ˆ|¡¡ |S )Nc             3   s   | ]}ˆ   |¡V  qd S )N)rT   )rN   Útable)r   r   r   ú	<genexpr>Ï   s    z/DatabaseOperations.sql_flush.<locals>.<genexpr>c          
      s2   g | ]*}d ˆ  d¡ˆ  d¡ˆ ˆ  |¡¡f ‘qS )z	%s %s %s;ÚDELETEZFROM)ÚSQL_KEYWORDÚ	SQL_FIELDrK   )rN   rW   )r   Ústyler   r   rP   Ð   s   z0DatabaseOperations.sql_flush.<locals>.<listcomp>c             S   s   g | ]}d |i‘qS )rW   r   )rN   rW   r   r   r   rP   Ö   s    )Úsetr   Úfrom_iterableÚextendÚsequence_reset_by_name_sql)r   r\   ÚtablesrU   rV   r)   Ú	sequencesr   )r   r\   r   Ú	sql_flushË   s    zDatabaseOperations.sql_flushc             C   sn   |sg S d|  d¡| |  d¡¡|  d¡| |  d¡¡|  d¡| |  d¡¡|  d¡d	 d
d„ |D ƒ¡f gS )Nz%s %s %s %s = 0 %s %s %s (%s);ZUPDATEZsqlite_sequenceZSETÚseqZWHERErJ   ÚINz, c             S   s   g | ]}d |d  ‘qS )z'%s'rW   r   )rN   Zsequence_infor   r   r   rP   ç   s    zADatabaseOperations.sequence_reset_by_name_sql.<locals>.<listcomp>)rZ   Z	SQL_TABLErK   r[   r9   )r   r\   rb   r   r   r   r`   Ú   s    z-DatabaseOperations.sequence_reset_by_name_sqlc             C   sL   |d krd S t |dƒr|S t |¡rDtjr<t || jj¡}ntdƒ‚t|ƒS )NÚresolve_expressionzNSQLite backend does not support timezone-aware datetimes when USE_TZ is False.)	Úhasattrr   Úis_awarer   r0   Z
make_naiver   Ú
ValueErrorÚstr)r   Úvaluer   r   r   Úadapt_datetimefield_valueì   s    

z,DatabaseOperations.adapt_datetimefield_valuec             C   s4   |d krd S t |dƒr|S t |¡r,tdƒ‚t|ƒS )Nrf   z5SQLite backend does not support timezone-aware times.)rg   r   rh   ri   rj   )r   rk   r   r   r   Úadapt_timefield_valueý   s    

z(DatabaseOperations.adapt_timefield_valuec                s    t ƒ  |¡}|j ¡ }|dkr,| | j¡ np|dkrB| | j¡ nZ|dkrX| | j¡ nD|dkrr| |  |¡¡ n*|dkrˆ| | j	¡ n|dkrœ| | j
¡ |S )Nr   r   r   ZDecimalFieldZ	UUIDField)ZNullBooleanFieldZBooleanField)ÚsuperÚget_db_convertersr    Zget_internal_typeÚappendÚconvert_datetimefield_valueÚconvert_datefield_valueÚconvert_timefield_valueÚget_decimalfield_converterÚconvert_uuidfield_valueÚconvert_booleanfield_value)r   r"   Ú
convertersÚinternal_type)Ú	__class__r   r   ro     s    
z$DatabaseOperations.get_db_convertersc             C   s@   |d k	r<t |tjƒst|ƒ}tjr<t |¡s<t || jj¡}|S )N)	r   Údatetimer   r   r0   r   rh   Z
make_awarer   )r   rk   r"   r   r   r   r   rq     s    z.DatabaseOperations.convert_datetimefield_valuec             C   s    |d k	rt |tjƒst|ƒ}|S )N)r   rz   Údater   )r   rk   r"   r   r   r   r   rr   $  s    z*DatabaseOperations.convert_datefield_valuec             C   s    |d k	rt |tjƒst|ƒ}|S )N)r   rz   Útimer   )r   rk   r"   r   r   r   r   rs   *  s    z*DatabaseOperations.convert_timefield_valuec                sN   t jdd�j‰ t|tƒr>t  d¡ |jj ¡‰‡ ‡fdd„}n‡ fdd„}|S )Né   )Úprecr   c                s"   | d k	rˆ | ƒj ˆ|jjd�S d S )N)Úcontext)Úquantizer    r   )rk   r"   r   )Úcreate_decimalÚquantize_valuer   r   Ú	converter7  s    z@DatabaseOperations.get_decimalfield_converter.<locals>.converterc                s   | d k	rˆ | ƒS d S )Nr   )rk   r"   r   )r�   r   r   rƒ   ;  s    )	ÚdecimalÚContextÚcreate_decimal_from_floatr   r
   ÚDecimalÚscalebr    Zdecimal_places)r   r"   rƒ   r   )r�   r‚   r   rt   0  s    
z-DatabaseOperations.get_decimalfield_converterc             C   s   |d k	rt  |¡}|S )N)ÚuuidÚUUID)r   rk   r"   r   r   r   r   ru   @  s    
z*DatabaseOperations.convert_uuidfield_valuec             C   s   |dkrt |ƒS |S )N)r   r   )Úbool)r   rk   r"   r   r   r   r   rv   E  s    z-DatabaseOperations.convert_booleanfield_valuec             C   s   d  dd„ |D ƒ¡S )Nz UNION ALL c             s   s   | ]}d d  |¡ V  qdS )z	SELECT %sz, N)r9   )rN   rO   r   r   r   rX   J  s   z5DatabaseOperations.bulk_insert_sql.<locals>.<genexpr>)r9   )r   r   Zplaceholder_rowsr   r   r   Úbulk_insert_sqlH  s    z"DatabaseOperations.bulk_insert_sqlc                s:   |dkrdd  |¡ S |dkr,dd  |¡ S tƒ  ||¡S )Nú^z	POWER(%s)ú,ú#z
BITXOR(%s))r9   rn   Úcombine_expression)r   Ú	connectorÚsub_expressions)ry   r   r   r�   N  s
    z%DatabaseOperations.combine_expressionc             C   sD   |dkrt d| ƒ‚d| g| }t|ƒdkr6tdƒ‚dd |¡ S )N)ú+ú-z$Invalid connector for timedelta: %s.z'%s'é   z)Too many params for timedelta operations.zdjango_format_dtdelta(%s)z, )r   r   ri   r9   )r   r‘   r’   Z	fn_paramsr   r   r   Úcombine_duration_expressionW  s    z.DatabaseOperations.combine_duration_expressionc             C   s   dS )N)NNr   )r   rx   r   r   r   Úinteger_field_range_  s    z&DatabaseOperations.integer_field_rangec       	      C   s@   |\}}|\}}||˜}|dkr0d||f |fS d||f |fS )Nr   zdjango_time_diff(%s, %s)zdjango_timestamp_diff(%s, %s)r   )	r   rx   ÚlhsÚrhsZlhs_sqlZ
lhs_paramsZrhs_sqlZ
rhs_paramsr=   r   r   r   Úsubtract_temporalsc  s    z%DatabaseOperations.subtract_temporalsc                s   |rdS t ƒ  |¡S )NzINSERT OR IGNORE INTO)rn   Úinsert_statement)r   Zignore_conflicts)ry   r   r   r›   k  s    z#DatabaseOperations.insert_statement)N)N)F),Ú__name__Ú
__module__Ú__qualname__Z"cast_char_field_without_max_lengthZcast_data_typesZexplain_prefixr   r$   r(   r*   r-   r.   r+   r1   r2   r3   r4   r5   r6   r8   rF   rK   rM   rS   r   rT   rc   r`   rl   rm   ro   rq   rr   rs   rt   ru   rv   rŒ   r�   r–   r—   rš   r›   Ú__classcell__r   r   )ry   r   r      sP   

	r   )rz   r„   r‰   Ú	functoolsr   Ú	itertoolsr   Zdjango.confr   Zdjango.core.exceptionsr   Z	django.dbr   r   r   Z"django.db.backends.base.operationsr	   Zdjango.db.models.expressionsr
   Zdjango.utilsr   Zdjango.utils.dateparser   r   r   Zdjango.utils.functionalr   r   r   r   r   r   Ú<module>   s   