o 3a>@sLddlZddlmZddlmZddlmZddlmZGdddeZ dS)N)settings)BaseDatabaseOperations)timezone) force_strcseZdZdZiejddddZdddddd dddd d d dd Zd Zd Zd dZ dXddZ ddZ ddZ ddZ ddZddZddZdXddZd d!Zd"d#Zd$d%ZdYd&d'Zd(d)Zd*d+Zd,d-Zd.d/Zd0d0d1d2d3Zd4d5Zd6d7Zd8d9Zd:d;Zdd?Z d@dAZ!fdBdCZ"fdDdEZ#dFdGZ$dHdIZ%dJdKZ&dLdMZ'dNdOZ(dXfdPdQ Z)dRdSZ*dZfdTdU Z+dXdVdWZ,Z-S)[DatabaseOperationsz!django.db.backends.mysql.compiler)ri)rl)r)PositiveSmallIntegerFieldPositiveIntegerFieldPositiveBigIntegerFieldzsigned integerzchar(%(max_length)s)z+decimal(%(max_digits)s, %(decimal_places)s)charzunsigned integer) AutoField BigAutoFieldSmallAutoField CharField DecimalField TextField IntegerFieldBigIntegerFieldSmallIntegerFieldr r r DurationFieldEXPLAINcCsP|dkrd|S|dkrd|S|dkrd|S|dkr d|Sd ||fS) Nweek_dayz DAYOFWEEK(%s) iso_week_dayzWEEKDAY(%s) + 1weekz WEEK(%s, 3)iso_yearz#TRUNCATE(YEARWEEK(%s, 3), -2) / 100zEXTRACT(%s FROM %s))upper)self lookup_type field_namerE/usr/lib/python3/dist-packages/django/db/backends/mysql/operations.pydate_extract_sql%sz#DatabaseOperations.date_extract_sqlNcCsb|||}ddd}||vr||}d||fS|dkr#d||fS|dkr-d||fSd |S) Nz %%Y-01-01z %%Y-%%m-01)yearmonthz#CAST(DATE_FORMAT(%s, '%s') AS DATE)quarterzIMAKEDATE(YEAR(%s), 1) + INTERVAL QUARTER(%s) QUARTER - INTERVAL 1 QUARTERrz&DATE_SUB(%s, INTERVAL WEEKDAY(%s) DAY)DATE(%s)_convert_field_to_tzrrrtznamefields format_strrrr date_trunc_sql:s  z!DatabaseOperations.date_trunc_sqlcCs8d|vr ||ddSd|vr||ddS|S)N+-)find)rr)rrr _prepare_tzname_deltaNs z(DatabaseOperations._prepare_tzname_deltacCs2|rtjr|jj|krd||jj||f}|S)NzCONVERT_TZ(%s, '%s', '%s'))rUSE_TZ connection timezone_namer0rrr)rrr r'Usz'DatabaseOperations._convert_field_to_tzcC|||}d|S)Nr%r&r4rrr datetime_cast_date_sql^ z)DatabaseOperations.datetime_cast_date_sqlcCr5)NTIME(%s)r&r4rrr datetime_cast_time_sqlbr7z)DatabaseOperations.datetime_cast_time_sqlcCs|||}|||SN)r'r!)rrrr)rrr datetime_extract_sqlfs  z'DatabaseOperations.datetime_extract_sqlc Cs|||}gd}d}d}|dkrdj|dS|dkr"dj|dSz ||d }Wn ty7|}Y|Swd |d|||d} d || f}|S) N)r"r#dayhourminutesecond)z%%Y-z%%mz-%%dz %%H:z%%iz:%%s)z0000-01z-01z 00:00z:00r$zCAST(DATE_FORMAT(MAKEDATE(YEAR({field_name}), 1) + INTERVAL QUARTER({field_name}) QUARTER - INTERVAL 1 QUARTER, '%%Y-%%m-01 00:00:00') AS DATETIME))rrzqCAST(DATE_FORMAT(DATE_SUB({field_name}, INTERVAL WEEKDAY({field_name}) DAY), '%%Y-%%m-%%d 00:00:00') AS DATETIME)z'CAST(DATE_FORMAT(%s, '%s') AS DATETIME))r'formatindex ValueErrorjoin) rrrr)r*rD format_defisqlr+rrr datetime_trunc_sqljs*   z%DatabaseOperations.datetime_trunc_sqlcCs<|||}dddd}||vr||}d||fSd|S)Nz %%H:00:00z %%H:%%i:00z %%H:%%i:%%s)r=r>r?z#CAST(DATE_FORMAT(%s, '%s') AS TIME)r8r&r(rrr time_trunc_sqls  z!DatabaseOperations.time_trunc_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)rcursorrrr fetch_returned_insert_rowssz-DatabaseOperations.fetch_returned_insert_rowscCsd|S)NzINTERVAL %s MICROSECONDr)rrJrrr format_for_duration_arithmeticsz1DatabaseOperations.format_for_duration_arithmeticcCsddgdffgS)z "ORDER BY NULL" prevents MySQL from implicitly ordering by grouped columns. If no ordering would otherwise be applied, we don't want any implicit sorting going on. NNULLFrrrrr force_no_orderingsz$DatabaseOperations.force_no_orderingcCs|Sr:r)rvalue max_digitsdecimal_placesrrr adapt_decimalfield_valuez+DatabaseOperations.adapt_decimalfield_valuecCstt|ddddS)N _executedreplace)errors)rgetattr)rrNrJparamsrrr last_executed_querysz&DatabaseOperations.last_executed_querycCdS)NrrrRrrr no_limit_valuesz!DatabaseOperations.no_limit_valuecCs |dr |dr |Sd|S)N`z`%s`) startswithendswith)rnamerrr quote_nameszDatabaseOperations.quote_namecs,|sdSfdd|D}dd|dfS)N)rCrcs,g|]}d|jjj|jfqS)z%s.%s)remodel_metadb_tablecolumn).0fieldrRrr s z.z RETURNING %s, rrG)rr*columnsrrRr return_insert_columnss  z(DatabaseOperations.return_insert_columnsF)reset_sequences allow_cascadecsV|sgSdg}|r|fdd|Dn |fdd|D|d|S)NzSET FOREIGN_KEY_CHECKS = 0;c3s.|]}dd|fVqdS)z%s %s;TRUNCATEN SQL_KEYWORD SQL_FIELDrerj table_namerstylerr s z/DatabaseOperations.sql_flush..c 3s6|]}ddd|fVqdS)z %s %s %s;DELETEFROMNrtrwryrr r{s zSET FOREIGN_KEY_CHECKS = 1;)extendappend)rrztablesrqrrrJrryr sql_flushs   zDatabaseOperations.sql_flushcsfdd|DS)Nc s>g|]}ddd|ddfqS)z%s %s %s %s = 1;ALTERTABLEtableAUTO_INCREMENTrt)rj sequence_inforyrr rlszADatabaseOperations.sequence_reset_by_name_sql..r)rrz sequencesrryr sequence_reset_by_name_sqls z-DatabaseOperations.sequence_reset_by_name_sqlcCs|dkr |jjjs td|S)Nrz@The database backend does not accept 0 as a value for AutoField.)r2featuresallows_auto_pk_0rFrrTrrr validate_autopk_valuesz(DatabaseOperations.validate_autopk_valuecCsR|durdSt|dr |St|r%tjr!t||jj}t|Stdt|S)Nresolve_expressionzMMySQL backend does not support timezone-aware datetimes when USE_TZ is False.) hasattrris_awarerr1 make_naiver2rFstrrrrr adapt_datetimefield_values  z,DatabaseOperations.adapt_datetimefield_valuecCs4|durdSt|dr |St|rtdt|S)Nrz4MySQL backend does not support timezone-aware times.)rrrrFrrrrr adapt_timefield_values  z(DatabaseOperations.adapt_timefield_valuecCr_)N@rrRrrr max_name_lengthrXz"DatabaseOperations.max_name_lengthcCr_)NrQrrRrrr pk_default_valuerXz#DatabaseOperations.pk_default_valuecCs*dd|D}ddd|D}d|S)Ncss|]}d|VqdS)rmNrn)rjrowrrr r{sz5DatabaseOperations.bulk_insert_sql..rmcss|]}d|VqdS)z(%s)Nr)rjrJrrr r{szVALUES rn)rr*placeholder_rowsplaceholder_rows_sql values_sqlrrr bulk_insert_sqlsz"DatabaseOperations.bulk_insert_sqlcsh|dkr dd|S|dvr|dkrdn|}d||S|dkr-|\}}d||d St||S) N^zPOW(%s),)&|z<<#rzCONVERT(%s, SIGNED)z>>z FLOOR(%(lhs)s / POW(2, %(rhs)s))lhsrhs)rGsupercombine_expression)r connectorsub_expressionsrr __class__rr rsz%DatabaseOperations.combine_expressioncsdt|}|j}|dvr||j|S|dkr&tjr$||j|S|dkr0||j |S)N) BooleanFieldNullBooleanField DateTimeField UUIDField) rget_db_converters output_fieldget_internal_typerconvert_booleanfield_valuerr1convert_datetimefield_valueconvert_uuidfield_value)r expression converters internal_typerrr r&s     z$DatabaseOperations.get_db_converterscCs|dvrt|}|S)N)rrB)boolrrTrr2rrr r2sz-DatabaseOperations.convert_booleanfield_valuecCs|dur t||jj}|Sr:)r make_awarer2rrrr r7sz.DatabaseOperations.convert_datetimefield_valuecCs|dur t|}|Sr:)uuidUUIDrrrr r<s z*DatabaseOperations.convert_uuidfield_valuecCs|dur t|ds dSdS)Nas_sqlz _binary %s%s)rrrrr binary_placeholder_sqlAsz)DatabaseOperations.binary_placeholder_sqlc Cs|\}}|\}}|dkr1|jjrd||dg||RfSd||dt|dt|dfSg||R}d||f|fS)N TimeFieldzGCAST((TIME_TO_SEC(%(lhs)s) - TIME_TO_SEC(%(rhs)s)) * 1000000 AS SIGNED)rzs((TIME_TO_SEC(%(lhs)s) * 1000000 + MICROSECOND(%(lhs)s)) - (TIME_TO_SEC(%(rhs)s) * 1000000 + MICROSECOND(%(rhs)s)))z"TIMESTAMPDIFF(MICROSECOND, %s, %s))r2mysql_is_mariadbtuple) rrrrlhs_sql lhs_paramsrhs_sql rhs_paramsr]rrr subtract_temporalsDs  z%DatabaseOperations.subtract_temporalsc s|r |dkr d}n |sd|jjjvrd}|dd}tj|fi|}|r7|jjjr7|jjr3dn|d}|rE|r?|jjrE|d|7}|S) NTEXT TRADITIONALTREEanalyzeFANALYZEz ANALYZEz FORMAT=%s) rr2rsupported_explain_formatspoprexplain_query_prefixsupports_explain_analyzer)rrDoptionsrprefixrrr rUs  z'DatabaseOperations.explain_query_prefixcCs<|jjdks |jjr|dkrdSdS|dkrdnd}d|S)N)rrregexz%s REGEXP BINARY %sz %s REGEXP %scrIzREGEXP_LIKE(%%s, %%s, '%s'))r2 mysql_versionr)rr match_optionrrr regex_lookupfs zDatabaseOperations.regex_lookupcs|rdSt|S)NzINSERT IGNORE INTO)rinsert_statement)rignore_conflictsrrr rqsz#DatabaseOperations.insert_statementcCs$d}|dkr|jjs|dvrd}|S)Nr JSONField) iexactcontains icontainsrb istartswithrc iendswithriregexzJSON_UNQUOTE(%s))r2r)rrrlookuprrr lookup_castts zDatabaseOperations.lookup_castr:)NN)F).__name__ __module__ __qualname__compiler_modulerinteger_field_rangescast_data_types"cast_char_field_without_max_lengthexplain_prefixr!r,r0r'r6r9r;rKrLrOrPrSrWr^r`rerprrrrrrrrrrrrrrrrrrr __classcell__rrrr r sz           r) r django.confr"django.db.backends.base.operationsr django.utilsrdjango.utils.encodingrrrrrr s