o xg.@s8ddlmZddlmZddlmZGdddeZdS)Inet)settings)BaseDatabaseOperationscsjeZdZdZdZegdZddddZdd Zd d Z dQd dZ ddZ ddZ ddZ ddZddZddZdQddZddZdd ZdQd!d"Zd#d$Zd%d&Zd'd(Zd)d*Zd+d+d,d-d.Zd/d0ZdRd1d2Zd3d4Zd5d6Zd7d8Zd9d:Zd;d<Z d=d>Z!d?d@Z"dAdBZ#dCdDZ$dEdFZ%dSdGdHZ&dIdJZ'fdKdLZ(dQfdMdN Z)dQfdOdP Z*Z+S)TDatabaseOperationsvarcharEXPLAIN)ANALYZEBUFFERSCOSTSSETTINGSSUMMARYTIMINGVERBOSEWALintegerbigintsmallint) AutoField BigAutoFieldSmallAutoFieldcCs.|}|dvrd||jddSdS)N)GenericIPAddressFieldIPAddressField TimeField UUIDFieldzCAST(%%s AS %s)(r%s)get_internal_typedb_type connectionsplit)self output_field internal_typer$J/usr/lib/python3/dist-packages/django/db/backends/postgresql/operations.pyunification_cast_sqlsz'DatabaseOperations.unification_cast_sqlcCs<|dkrd|S|dkrd|S|dkrd|Sd||fS)Nweek_dayzEXTRACT('dow' FROM %s) + 1 iso_week_dayzEXTRACT('isodow' FROM %s)iso_yearzEXTRACT('isoyear' FROM %s)zEXTRACT('%s' FROM %s)r$)r! lookup_type field_namer$r$r%date_extract_sql)s z#DatabaseOperations.date_extract_sqlNcC|||}d||fSNzDATE_TRUNC('%s', %s)_convert_field_to_tzr!r*r+tznamer$r$r%date_trunc_sql5  z!DatabaseOperations.date_trunc_sqlcCs,d|vr |ddSd|vr|ddS|S)N+-)replace)r!r2r$r$r%_prepare_tzname_delta:s   z(DatabaseOperations._prepare_tzname_deltacCs |rtjrd|||f}|S)Nz%s AT TIME ZONE '%s')rUSE_TZr8r!r+r2r$r$r%r0As z'DatabaseOperations._convert_field_to_tzcC|||}d|S)Nz (%s)::dater/r:r$r$r%datetime_cast_date_sqlF z)DatabaseOperations.datetime_cast_date_sqlcCr;)Nz (%s)::timer/r:r$r$r%datetime_cast_time_sqlJr=z)DatabaseOperations.datetime_cast_time_sqlcCs|||}|||SN)r0r,r1r$r$r%datetime_extract_sqlN  z'DatabaseOperations.datetime_extract_sqlcCr-r.r/r1r$r$r%datetime_trunc_sqlRr4z%DatabaseOperations.datetime_trunc_sqlcCr-)NzDATE_TRUNC('%s', %s)::timer/r1r$r$r%time_trunc_sqlWrAz!DatabaseOperations.time_trunc_sqlcCdS)Nz DEFERRABLE INITIALLY DEFERREDr$r!r$r$r%deferrable_sql[z!DatabaseOperations.deferrable_sqlcCs|S)z Given a cursor object that has just performed an INSERT...RETURNING statement into a table, return the tuple of returned data. )fetchall)r!cursorr$r$r%fetch_returned_insert_rows^sz-DatabaseOperations.fetch_returned_insert_rowscCs@d}|dvr|dvr d}n |dvrd}nd}|dvrd |}|S) Nr) iexactcontains icontains startswith istartswithendswith iendswithregexiregex)rrzHOST(%s)) CICharField CIEmailField CITextFieldz %s::citextz%s::text)rKrMrOrQz UPPER(%s)r$)r!r*r#lookupr$r$r% lookup_casteszDatabaseOperations.lookup_castcCsdSr?r$rEr$r$r%no_limit_valuexrGz!DatabaseOperations.no_limit_valuecCs|gSr?r$)r!sqlr$r$r%prepare_sql_script{sz%DatabaseOperations.prepare_sql_scriptcCs |dr |dr |Sd|S)N"z"%s")rNrP)r!namer$r$r% quote_name~szDatabaseOperations.quote_namecCrD)NzSET TIME ZONE %sr$rEr$r$r%set_time_zone_sqlrGz$DatabaseOperations.set_time_zone_sqlF)reset_sequences allow_cascadecsd|sgSddfdd|Dg}|r |d|r*|ddd|gS) NTRUNCATE, c3s |] }|VqdSr?) SQL_FIELDr^).0tabler!styler$r% sz/DatabaseOperations.sql_flush..zRESTART IDENTITYCASCADEz%s; ) SQL_KEYWORDjoinappend)r!rhtablesr`ra sql_partsr$rgr% sql_flushszDatabaseOperations.sql_flushc CsRg}|D]"}|d}|dpd}|d|d|||||fq|S)Nrfcolumnidz7%s setval(pg_get_serial_sequence('%s','%s'), 1, false);SELECT)rnrl SQL_TABLEr^rd)r!rh sequencesrZ sequence_info table_name column_namer$r$r%sequence_reset_by_name_sqls  z-DatabaseOperations.sequence_reset_by_name_sqlcCs |r d||Sd||S)NzUSING INDEX TABLESPACE %sz TABLESPACE %s)r^)r! tablespaceinliner$r$r%tablespace_sqlsz!DatabaseOperations.tablespace_sqlcCsddlm}g}|j}|D]G}|jjD]@}t||jrS|d|d| ||jj | |j | ||j | ||j |d|d| ||jj fnqq |S)Nr)modelszZ%s setval(pg_get_serial_sequence('%s','%s'), coalesce(max(%s), 1), max(%s) %s null) %s %s;rtzIS NOTFROM) django.dbr~r^_meta local_fields isinstancerrnrlrudb_tablerdrr)r!rh model_listr~outputqnmodelfr$r$r%sequence_reset_sqls.     z%DatabaseOperations.sequence_reset_sqlcC|Sr?r$)r!xr$r$r%prep_for_iexact_queryrGz(DatabaseOperations.prep_for_iexact_querycCrD)a Return the maximum length of an identifier. The maximum length of an identifier is 63 by default, but can be changed by recompiling PostgreSQL after editing the NAMEDATALEN macro in src/include/pg_config_manual.h. This implementation returns 63, but can be overridden by a custom database backend that inherits most of its behavior from this one. ?r$rEr$r$r%max_name_lengths z"DatabaseOperations.max_name_lengthcCs0|rdd|D}dd|g|fSdggfS)NcSsg|] }|D]}|qqSr$r$)re param_listparamr$r$r% sz3DatabaseOperations.distinct_sql..zDISTINCT ON (%s)rcDISTINCTrm)r!fieldsparamsr$r$r% distinct_sqls zDatabaseOperations.distinct_sqlcCs|jdur |jSdSr?)querydecode)r!rIrZrr$r$r%last_executed_querys  z&DatabaseOperations.last_executed_querycs,|sdSfdd|D}dd|dfS)N)r$cs,g|]}d|jjj|jfqS)z%s.%s)r^rrrrr)refieldrEr$r%rs z.z RETURNING %srcr$r)r!rcolumnsr$rEr%return_insert_columnss  z(DatabaseOperations.return_insert_columnscCs*dd|D}ddd|D}d|S)Ncss|]}d|VqdS)rcNr)rerowr$r$r%risz5DatabaseOperations.bulk_insert_sql..rccs|]}d|VqdS)z(%s)Nr$)rerZr$r$r%rizVALUES r)r!rplaceholder_rowsplaceholder_rows_sql values_sqlr$r$r%bulk_insert_sqlsz"DatabaseOperations.bulk_insert_sqlcCrr?r$r!valuer$r$r%adapt_datefield_valuerGz(DatabaseOperations.adapt_datefield_valuecCrr?r$rr$r$r%adapt_datetimefield_valuerGz,DatabaseOperations.adapt_datetimefield_valuecCrr?r$rr$r$r%adapt_timefield_valuerGz(DatabaseOperations.adapt_timefield_valuecCrr?r$)r!r max_digitsdecimal_placesr$r$r%adapt_decimalfield_valuerGz+DatabaseOperations.adapt_decimalfield_valuecCs|rt|SdSr?rrr$r$r%adapt_ipaddressfield_valuesz-DatabaseOperations.adapt_ipaddressfield_valuec sF|dkr|\}}|\}}g||R}d||f|fSt|||S)N DateFieldz(interval '1 day' * (%s - %s)))supersubtract_temporals) r!r#lhsrhslhs_sql lhs_paramsrhs_sql rhs_paramsr __class__r$r%rs z%DatabaseOperations.subtract_temporalsc si}|r#dd|D}|jD]}||d}|dur"|||<qtj|fi|}|r3||d<|rE|dddd|D7}|S)NcSs"i|] \}}||r dndqS)truefalse)upper)rer]rr$r$r% sz;DatabaseOperations.explain_query_prefix..FORMATz (%s)rccsr)z%s %sNr$)reir$r$r%ri rz:DatabaseOperations.explain_query_prefix..)itemsexplain_optionspoprrexplain_query_prefixrm)r!formatoptionsextra valid_optionrprefixrr$r%rs     z'DatabaseOperations.explain_query_prefixcs|rdSt|S)NzON CONFLICT DO NOTHING)rignore_conflicts_suffix_sql)r!ignore_conflictsrr$r%r#sz.DatabaseOperations.ignore_conflicts_suffix_sqlr?)F)NN),__name__ __module__ __qualname__"cast_char_field_without_max_lengthexplain_prefix frozensetrcast_data_typesr&r,r3r8r0r<r>r@rBrCrFrJrXrYr[r^r_rqrzr}rrrrrrrrrrrrrrr __classcell__r$r$rr%rsZ         rN)psycopg2.extrasr django.confr"django.db.backends.base.operationsrrr$r$r$r%s