o aS+@s@ddlZddlmZddlmZddlmZGdddeZdS)N)BaseDatabaseSchemaEditor) IndexColumns) strip_quotesc seZdZdZdZdZdZdZdZdZ dZ d Z d Z d Z d d ZfddZddZddZddZfddZ d)fdd ZfddZd)ddZd)dd Zd*fd"d# Zd!d!d$d$d!d%d!d%d!dd!d!d& fd'd( ZZS)+DatabaseSchemaEditorzCREATE SEQUENCE %(sequence)sz,DROP SEQUENCE IF EXISTS %(sequence)s CASCADEz=SELECT setval('%(sequence)s', MAX(%(column)s)) FROM %(table)sz9ALTER SEQUENCE %(sequence)s OWNED BY %(table)s.%(column)szZCREATE INDEX %(name)s ON %(table)s%(using)s (%(columns)s)%(include)s%(extra)s%(condition)szgCREATE INDEX CONCURRENTLY %(name)s ON %(table)s%(using)s (%(columns)s)%(include)s%(extra)s%(condition)szDROP INDEX IF EXISTS %(name)sz*DROP INDEX CONCURRENTLY IF EXISTS %(name)szyCONSTRAINT %(name)s REFERENCES %(to_table)s(%(to_column)s)%(deferrable)s; SET CONSTRAINTS %(namespace)s%(name)s IMMEDIATEzRSET CONSTRAINTS %(name)s IMMEDIATE; ALTER TABLE %(table)s DROP CONSTRAINT %(name)sz,DROP FUNCTION %(procedure)s(%(param_types)s)cCs>t|tr |dd}tj|}t|drd|_| S)N%z%%encodingutf8) isinstancestrreplacepsycopg2 extensionsadapthasattrr getquoteddecode)selfvalueadaptedrF/usr/lib/python3/dist-packages/django/db/backends/postgresql/schema.py quote_value&s     z DatabaseSchemaEditor.quote_valuecs0t||}|||}|dur|||SN)super_field_indexes_sql_create_like_index_sqlappend)rmodelfieldoutputlike_index_statement __class__rrr/s   z'DatabaseSchemaEditor._field_indexes_sqlcCs.|jr ||jS|jj|||jSr) is_relation rel_db_type connection data_typesgetget_internal_typedb_typerrrrr_field_data_type6s   z%DatabaseSchemaEditor._field_data_typeccs8|jdkr||jEdHdS||jVdS)N ArrayField) base_fieldr(_field_base_data_typesr+r*rrrr.>sz+DatabaseSchemaEditor._field_base_data_typescCsr|j|jd}|dur7|js|jr7d|vrdS|dr'|j||gddgdS|dr7|j||gdd gdSdS) z Return the statement to create an index with varchar operator pattern when the column type is 'varchar' or 'text', otherwise return None. r%N[varchar_likevarchar_pattern_ops)fieldssuffix opclassestexttext_pattern_ops)r)r%db_indexunique startswith_create_index_sql)rrrr)rrrrEs&  z+DatabaseSchemaEditor._create_like_index_sqlc sd|_d}|}|}|dkr+||kr+t||t||kr*|j|7_n||||kr<|j|7_t|jj}dddd} || vrt|j } d|| f} |j| | | |d gf|j d | | igf|j d | | igf|j | ||j| | d | | d d gf|j| || | | | dgf|j| || | | | dgfgfS|j|jdd| vrt|j } d|| f} t||||\} } | |j d | | igfgfSt||||S)Nz%ALTER COLUMN %(column)s TYPE %(type)sz USING %(column)s::%(type)sr,bigintintegersmallint) bigserialserial smallserialz %s_%s_seq)columntypesequencez nextval('%s'))rCdefault)tablechanges)rGrCrEr/rD)sql_alter_column_typer(listr.r+r_metadb_tablelowerrC quote_namesql_delete_sequencesql_create_sequencesql_alter_columnsql_alter_column_defaultsql_set_sequence_maxsql_set_sequence_owner db_parametersr%r_alter_column_type_sql)rr old_field new_fieldnew_type using_sqlnew_internal_typeold_internal_typerGserial_fields_maprC sequence_namefragment_r!rrrVes           1    z+DatabaseSchemaEditor._alter_column_type_sqlFc s|js|jr9|dr|dr$|dr|dr$|dr9|ds9|j|jj|jgdd} |||| t |||||||||jsO|jsO|jsU|jsd|jrd| ||} | durd|| |jr|js|js|j|jj|jgdd} |||| dSdSdSdS)Nr1r7citextr2)r5) r9r:r;_create_index_namerKrLrCexecute_delete_index_sqlr _alter_fieldr) rrrWrXold_typerY old_db_params new_db_paramsstrict index_namer index_to_remover!rrres>     z!DatabaseSchemaEditor._alter_fieldcs*|r t|||j||dSt||||S)N) col_suffixesr6)rrNr_index_columns)rrGcolumnsrlr6r!rrrmsz#DatabaseSchemaEditor._index_columnscCs|j|j|||ddddS)N concurrently)params)rc create_sqlrrindexrprrr add_indexszDatabaseSchemaEditor.add_indexcCs||j|||ddS)Nro)rc remove_sqlrsrrr remove_indexsz!DatabaseSchemaEditor.remove_indexNcs |r|jn|j}t|||Sr)sql_delete_index_concurrentlysql_delete_indexrrd)rrnamesqlrpr!rrrdsz&DatabaseSchemaEditor._delete_index_sqlr) r4rzr5using db_tablespacerlr{r6 conditionrpinclude expressionsc s4| s|jn|j}tj||||||||| | | | d S)N) r4rzr5r}r~rlr{r6rrr)sql_create_indexsql_create_index_concurrentlyrr<)rrr4rzr5r}r~rlr{r6rrprrr!rrr<s z&DatabaseSchemaEditor._create_index_sql)F)NF)__name__ __module__ __qualname__rPrOrSrTrrryrxsql_create_column_inline_fk sql_delete_fksql_delete_procedurerrr+r.rrVrermrurwrdr< __classcell__rrr!rrs>  T   r)r django.db.backends.base.schemar!django.db.backends.ddl_referencesrdjango.db.backends.utilsrrrrrrs