o 3aV:@sddlZddlZddlZddlmZddlmZddlmZddl m Z ddl m Z m Z mZddlmZddlmZdd lmZdd lmZmZmZdd lmZGd d d eZdS)N) lru_cache)chain)settings) FieldError) DatabaseErrorNotSupportedErrormodels)BaseDatabaseOperations)Col)timezone) parse_dateparse_datetime parse_time)cached_propertycs`eZdZdZdddZdZddZddZd d Zd d Z dPddZ dPddZ ddZ ddZ ddZddZddZddZddZd d!Zd"d#Zd$d%Zd&d'Zd(d)Zed*d+Zd,d,d-d.d/Zd0d1Zd2d3Zd4d5Zfd6d7Zd8d9Zd:d;Z dd?Z"d@dAZ#dBdCZ$dDdEZ%fdFdGZ&dHdIZ'dJdKZ(dLdMZ)dQfdNdO Z*Z+S)RDatabaseOperationstextTEXT) DateField DateTimeFieldzEXPLAIN QUERY PLANcCs6t|dkrdSt|dkr|jjjt|St|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)len connectionfeaturesmax_query_params)selffieldsobjsrG/usr/lib/python3/dist-packages/django/db/backends/sqlite3/operations.pybulk_batch_sizes  z"DatabaseOperations.bulk_batch_sizec Cstjtjtjf}tjtjtjtjf}t||r8| D]}z|j }Wn t t fy-Yqwt||r7t dqt|tjrL|jrNt|jdkrPt ddSdSdS)Nz{You cannot use Sum, Avg, StdDev, and Variance aggregations on date/time fields in sqlite3 since date/time is saved as text.rzTSQLite doesn't support DISTINCT on aggregate functions accepting multiple arguments.)rrr TimeFieldSumAvgVarianceStdDev isinstanceget_source_expressions output_fieldAttributeErrorrr Aggregatedistinctrsource_expressions)r expression bad_fieldsbad_aggregatesexprr'rrrcheck_expression_support(s0     z+DatabaseOperations.check_expression_supportcCd||fS)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. zdjango_date_extract('%s', %s)lowerr lookup_type field_namerrrdate_extract_sqlDsz#DatabaseOperations.date_extract_sqlcCs|S)z>Do nothing since formatting is handled in the custom function.r)rsqlrrrformat_for_duration_arithmeticLz1DatabaseOperations.format_for_duration_arithmeticNcCd||g||RS)Nz#django_date_trunc('%s', %s, %s, %s)r3_convert_tznames_to_sqlrr5r6tznamerrrdate_trunc_sqlP z!DatabaseOperations.date_trunc_sqlcCr;)Nz#django_time_trunc('%s', %s, %s, %s)r<r>rrrtime_trunc_sqlWrAz!DatabaseOperations.time_trunc_sqlcCs"|rtjrd|d|jjfSdS)N'%s')NULLrD)rUSE_TZr timezone_name)rr?rrrr=^s z*DatabaseOperations._convert_tznames_to_sqlcCd|g||RS)Nz%django_datetime_cast_date(%s, %s, %s)r=rr6r?rrrdatetime_cast_date_sqlc z)DatabaseOperations.datetime_cast_date_sqlcCrG)Nz%django_datetime_cast_time(%s, %s, %s)rHrIrrrdatetime_cast_time_sqlhrKz)DatabaseOperations.datetime_cast_time_sqlcCr;)Nz)django_datetime_extract('%s', %s, %s, %s)r<r>rrrdatetime_extract_sqlm z'DatabaseOperations.datetime_extract_sqlcCr;)Nz'django_datetime_trunc('%s', %s, %s, %s)r<r>rrrdatetime_trunc_sqlrrNz%DatabaseOperations.datetime_trunc_sqlcCr1)Nzdjango_time_extract('%s', %s)r2r4rrrtime_extract_sqlwsz#DatabaseOperations.time_extract_sqlcCdS)NrDrrrrrpk_default_valuezz#DatabaseOperations.pk_default_valuecCsd}t||kr&d}tdt||D]}||||}|||7}q|Sdddgt|}|jj}z |||W|S|w)zV Only for last_executed_query! Don't use this to execute SQL queries! irrzSELECT , zQUOTE(?)) rrange%_quote_params_for_last_executed_queryjoinrcursorexecutefetchoneclose)rparams BATCH_SIZEresultsindexchunkr8rYrrrrW}s  z8DatabaseOperations._quote_params_for_last_executed_querycCsT|r(t|ttfr||}||St|}||}tt||}||S|SN)r%listtuplerWvaluesdictzip)rrYr8r]rerrrlast_executed_querys  z&DatabaseOperations.last_executed_querycCs |dr |dr |Sd|S)N"z"%s") startswithendswith)rnamerrr quote_nameszDatabaseOperations.quote_namecCrQ)NrrRrrrno_limit_valuerTz!DatabaseOperations.no_limit_valuecCsZd}|ddf}|j}|||}dd|DWdS1s&wYdS)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*\(cSsg|]}|dqS)rr.0rowrrr z9DatabaseOperations.__references_graph..)rrYrZfetchall)r table_namequeryr]rYr_rrr__references_graphs   $z%DatabaseOperations.__references_graphcCstdd|jS)Ni)maxsize)r%_DatabaseOperations__references_graphrRrrr_references_graphsz$DatabaseOperations._references_graphF)reset_sequences allow_cascadecs`|r|rttfdd|D}fdd|D}|r.dd|D}|||S)Nc3s|]}|VqdSrb)r{rqtablerRrr sz/DatabaseOperations.sql_flush..c s2g|]}ddd|fqS)z %s %s %s;DELETEFROM) SQL_KEYWORD SQL_FIELDrmr~rstylerrrss z0DatabaseOperations.sql_flush..cSsg|]}d|iqS)rrr~rrrrsrt)setr from_iterableextendsequence_reset_by_name_sql)rrtablesr|r}r8 sequencesrrr sql_flushs zDatabaseOperations.sql_flushc Csn|sgSd|d||d|d||d|d||d|dd d d |DfgS) Nz%s %s %s %s = 0 %s %s %s (%s);UPDATEsqlite_sequenceSETseqWHERErlINrUcSsg|]}d|dqS)rCrr)rq sequence_inforrrrss zADatabaseOperations.sequence_reset_by_name_sql..)r SQL_TABLErmrrX)rrrrrrrs z-DatabaseOperations.sequence_reset_by_name_sqlcCsR|durdSt|dr |St|r%tjr!t||jj}t|Stdt|S)Nresolve_expressionzNSQLite backend does not support timezone-aware datetimes when USE_TZ is False.) hasattrr is_awarerrE make_naiver ValueErrorstrrvaluerrradapt_datetimefield_values  z,DatabaseOperations.adapt_datetimefield_valuecCs4|durdSt|dr |St|rtdt|S)Nrz5SQLite backend does not support timezone-aware times.)rr rrrrrrradapt_timefield_values  z(DatabaseOperations.adapt_timefield_valuecst|}|j}|dkr||j|S|dkr#||j|S|dkr/||j|S|dkr=||||S|dkrI||j |S|dvrS||j |S)Nrrr DecimalField UUIDField)NullBooleanField BooleanField) superget_db_convertersr'get_internal_typeappendconvert_datetimefield_valueconvert_datefield_valueconvert_timefield_valueget_decimalfield_converterconvert_uuidfield_valueconvert_booleanfield_value)rr, converters internal_type __class__rrr s(         z$DatabaseOperations.get_db_converterscCs@|durt|tjst|}tjrt|st||jj}|Srb) r%datetimer rrEr r make_awarerrrr,rrrrrs  z.DatabaseOperations.convert_datetimefield_valuecC |durt|tjst|}|Srb)r%rdater rrrrr$ z*DatabaseOperations.convert_datefield_valuecCrrb)r%rtimerrrrrr*rz*DatabaseOperations.convert_timefield_valuecsPtjddjt|tr td|jj fdd}|Sfdd}|S)N)precrcs"|dur|j|jjdSdS)N)context)quantizer'rrr,rcreate_decimalquantize_valuerr converter7sz@DatabaseOperations.get_decimalfield_converter..convertercs|dur|SdSrbrr)rrrr;s) decimalContextcreate_decimal_from_floatr%r Decimalscalebr'decimal_places)rr,rrrrr0s  z-DatabaseOperations.get_decimalfield_convertercCs|dur t|}|Srb)uuidUUIDrrrrr@s z*DatabaseOperations.convert_uuidfield_valuecCs|dvrt|S|S)N)rr)boolrrrrrEz-DatabaseOperations.convert_booleanfield_valuecCsddd|DS)Nz UNION ALL css|] }dd|VqdS)z SELECT %srUNrXrprrrrIs  z5DatabaseOperations.bulk_insert_sql..r)rrplaceholder_rowsrrrbulk_insert_sqlHs z"DatabaseOperations.bulk_insert_sqlcs:|dkr dd|S|dkrdd|St||S)N^z POWER(%s),#z BITXOR(%s))rXrcombine_expression)r connectorsub_expressionsrrrrNs z%DatabaseOperations.combine_expressioncCsD|dvr td|d|g|}t|dkrtddd|S)N)+-z$Invalid connector for timedelta: %s.rCz)Too many params for timedelta operations.zdjango_format_dtdelta(%s)rU)rrrrX)rrr fn_paramsrrrcombine_duration_expressionWs   z.DatabaseOperations.combine_duration_expressioncCrQ)N)NNr)rrrrrinteger_field_range_r:z&DatabaseOperations.integer_field_rangec CsF|\}}|\}}g||R}|dkrd||f|fSd||f|fS)Nr zdjango_time_diff(%s, %s)zdjango_timestamp_diff(%s, %s)r) rrlhsrhslhs_sql lhs_paramsrhs_sql rhs_paramsr]rrrsubtract_temporalscs z%DatabaseOperations.subtract_temporalscs|rdSt|S)NzINSERT OR IGNORE INTO)rinsert_statement)rignore_conflictsrrrrkrz#DatabaseOperations.insert_statementrb)F),__name__ __module__ __qualname__"cast_char_field_without_max_lengthcast_data_typesexplain_prefixrr0r7r9r@rBr=rJrLrMrOrPrSrWrhrmrorzrr{rrrrrrrrrrrrrrrrr __classcell__rrrrrsV      r)rrr functoolsr itertoolsr django.confrdjango.core.exceptionsr django.dbrrr"django.db.backends.base.operationsr django.db.models.expressionsr django.utilsr django.utils.dateparser r rdjango.utils.functionalrrrrrrs