
    Evge@                        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m	Z	m
Z
mZmZmZ d dlmZmZmZ d dlmZmZmZ d dlmZ d d	lmZmZ d d
lmZ  e j        d          Zd Zd Z d Z! G d d          Z"dS )    N)datetime)settings)
FieldError)ColumnsExpressionsForeignKeyName	IndexName	StatementTable)names_digestsplit_identifiertruncate_name)NOT_PROVIDED
DeferrableIndex)Query)TransactionManagementErroratomic)timezonezdjango.db.backends.schemac                 h    | j         }|j        rdS |j        r|j        dgk    rdS |j        |j        v S )zz
    When altering the given field, must constraints on its model from the given
    relation be temporarily dropped?
    FNT)fieldmany_to_manyprimary_key	to_fieldsname)relationaltered_fieldr   s      [/var/www/pixelcanvas.ch/venv/lib/python3.11/site-packages/django/db/backends/base/schema.py_is_relevant_relationr      sI    
 NE u  U_%>%>t00    c                     t          | j                            dddd          t          j        d                    S )NFT)forwardreverseinclude_hiddeninclude_parentsr   )key)sorted_meta_get_fieldsoperator
attrgettermodels    r   _all_related_fieldsr.   (   sO    !	 	  	
 	
 ''   r    c              #      K   t           fdt           j                  D             fdt          j                  D                       }|D ]+\  }}||fV  t          |j        |j                  E d {V  ,d S )Nc              3   <   K   | ]}t          |          |V  d S Nr   ).0obj	old_fields     r   	<genexpr>z+_related_non_m2m_objects.<locals>.<genexpr>9   G       	
 	
$S)44	
	
 	
 	
 	
 	
 	
r    c              3   <   K   | ]}t          |          |V  d S r1   r2   )r3   r4   	new_fields     r   r6   z+_related_non_m2m_objects.<locals>.<genexpr>>   r7   r    )zipr.   r-   _related_non_m2m_objectsremote_field)r5   r9   related_fieldsold_relnew_rels   ``   r   r;   r;   5   s       	
 	
 	
 	
*9?;;	
 	
 	

	
 	
 	
 	
*9?;;	
 	
 	
 N + 
 
w+  
 
 	
 	
 	
 	
 	
 	
 	
 	

 
r    c                      e Zd ZdZdZdZdZdZdZdZ	dZ
d	Zd
ZdZdZeZdZdZdZdZdZdZdZdZeZdZeZdZdZdZeZdZdZ dZ!dZ"dZ#eZ$dZ%dZ&dZ'drd"Z(d# Z)d$ Z*dsd&Z+d' Z,d( Z-d) Z.dtd*Z/d+ Z0d, Z1d- Z2d. Z3d/ Z4d0 Z5e6d1             Z7d2 Z8d3 Z9d4 Z:d5 Z;d6 Z<d7 Z=d8 Z>d9 Z?d: Z@d; ZAd< ZBd= ZCd> ZDd? ZEd@ ZFdA ZGdB ZHdtdCZIdD ZJ	 dtdEZKdF ZLdtdGZM	 dtdHZNdI ZOdJ ZPdK ZQdL ZRdudNZSdvdOZTdP ZUdQ ZVdddMdMdd%dd%ddddRdSZWdvdTZXdU ZYdV ZZdW Z[dX Z\dvdYZ]dZ Z^d[ Z_d\ Z`d] Zad^ Zbd_ Zcd` Zdda Zedb Zf	 	 	 	 	 dwdcZg	 	 	 	 	 	 dxddZh	 	 	 	 	 	 	 dydeZidzdfZj	 	 	 	 	 	 dxdgZkdh Zldi Zmdj Zndk Zo	 	 	 	 	 	 	 	 d{dlZpdtdmZqdn Zrdo Zsd|dpZtdsdqZudS )}BaseDatabaseSchemaEditorz
    This class and its subclasses are responsible for emitting schema-changing
    statements to the databases - model creation/removal/alteration, field
    renaming, index fiddling, and so on.
    z'CREATE TABLE %(table)s (%(definition)s)z1ALTER TABLE %(old_table)s RENAME TO %(new_table)sz7ALTER TABLE %(table)s SET TABLESPACE %(new_tablespace)szDROP TABLE %(table)s CASCADEz:ALTER TABLE %(table)s ADD COLUMN %(column)s %(definition)sz!ALTER TABLE %(table)s %(changes)sz2ALTER COLUMN %(column)s TYPE %(type)s%(collation)sz%ALTER COLUMN %(column)s DROP NOT NULLz$ALTER COLUMN %(column)s SET NOT NULLz/ALTER COLUMN %(column)s SET DEFAULT %(default)sz$ALTER COLUMN %(column)s DROP DEFAULTz4ALTER TABLE %(table)s DROP COLUMN %(column)s CASCADEzDALTER TABLE %(table)s RENAME COLUMN %(old_column)s TO %(new_column)szFUPDATE %(table)s SET %(column)s = %(default)s WHERE %(column)s IS NULLz"UNIQUE (%(columns)s)%(deferrable)szCHECK (%(check)s)z.ALTER TABLE %(table)s DROP CONSTRAINT %(name)sz"CONSTRAINT %(name)s %(constraint)sz?ALTER TABLE %(table)s ADD CONSTRAINT %(name)s CHECK (%(check)s)zbALTER TABLE %(table)s ADD CONSTRAINT %(name)s UNIQUE%(nulls_distinct)s (%(columns)s)%(deferrable)sz|ALTER TABLE %(table)s ADD CONSTRAINT %(name)s FOREIGN KEY (%(column)s) REFERENCES %(to_table)s (%(to_column)s)%(deferrable)sNzQCREATE INDEX %(name)s ON %(table)s (%(columns)s)%(include)s%(extra)s%(condition)szaCREATE UNIQUE INDEX %(name)s ON %(table)s (%(columns)s)%(include)s%(nulls_distinct)s%(condition)sz/ALTER INDEX %(old_name)s RENAME TO %(new_name)szDROP INDEX %(name)szGALTER TABLE %(table)s ADD CONSTRAINT %(name)s PRIMARY KEY (%(columns)s)zDROP PROCEDURE %(procedure)sz)COMMENT ON TABLE %(table)s IS %(comment)sz5COMMENT ON COLUMN %(table)s.%(column)s IS %(comment)sFTc                 n    || _         || _        | j        rg | _        | j         j        j        o|| _        d S r1   )
connectioncollect_sqlcollected_sqlfeaturescan_rollback_ddlatomic_migration)selfrC   rD   r   s       r   __init__z!BaseDatabaseSchemaEditor.__init__   s?    $& 	$!#D $ 8 I Tfr    c                     g | _         | j        r7t          | j        j                  | _        | j                                         | S r1   )deferred_sqlrH   r   rC   alias	__enter__)rI   s    r   rN   z"BaseDatabaseSchemaEditor.__enter__   sB      	$ !677DKK!!###r    c                     | | j         D ]}|                     |d            | j        r| j                            |||           d S d S r1   )rL   executerH   r   __exit__)rI   exc_type	exc_value	tracebacksqls        r   rQ   z!BaseDatabaseSchemaEditor.__exit__   si    ( ( (S$''''  	AK  9i@@@@@	A 	Ar     c           	         | j         s,| j        j        r | j        j        j        st          d          t          |          }t                              d||||d           | j         r|	                                
                    d          rdnd}|B| j                            |t          t          | j        |                    z  |z              dS | j                            ||z              dS | j                                        5 }|                    ||           ddd           dS # 1 swxY w Y   dS )z:Execute the given SQL statement, with optional parameters.ziExecuting DDL statements while in a transaction on databases that can't perform a rollback is prohibited.z%s; (params %r))paramsrU   )extra; N)rD   rC   in_atomic_blockrF   rG   r   strloggerdebugrstripendswithrE   appendtuplemapquote_valuecursorrP   )rI   rU   rX   endingrf   s        r   rP   z BaseDatabaseSchemaEditor.execute   s   
  	/	 O,=	
 -?  
 #hhsFVC2P2P 	 	
 	
 	
  
	,::<<0055>RR3F!"))5T%5v!>!>???6I     "))#,77777'')) ,VsF+++, , , , , , , , , , , , , , , , , ,s   D66D:=D:c                 @    | j         j                            |          S r1   )rC   ops
quote_name)rI   r   s     r   rj   z#BaseDatabaseSchemaEditor.quote_name   s    "--d333r    c                     j         j        D ]>}fd|D             } j                                                 |                     ?g }g }j         j        D ]}                     |          \  }}||                     j                  }	|	d         r|d j	        |	z  z   z  }|
                     j                  }
|
r|d|
z  z  }|                    |           |j        r|j        r|j        j        j         j        }|j        j        j                             |j        j                  j        } j        r:|d j                             |                               |          dz  z   z  }n@ j        j        j        r/ j                                                 |d                     |                                         |j                  d|           |                                d	v rK j        j                            j         j        |j                  }|r j                            |           g }|r>j         j        D ]0} j                            |                                          1n,|                     fd
j         j        D                         j                             j         j                  d                    d g ||R D                       dz  }j         j        r3 j        j                             j         j                  }|r|d|z   z  }||fS )z-Take a model and return its table definition.c                 D    g | ]}j                             |          S rV   r(   	get_fieldr3   r   r-   s     r   
<listcomp>z6BaseDatabaseSchemaEditor.table_sql.<locals>.<listcomp>   )    LLLuek++E22LLLr    NrC   check z %s)to_table	to_column_fk_%(to_table)s_%(to_column)s)	AutoFieldBigAutoFieldSmallAutoFieldc              3   D   K   | ]}|                               V  d S r1   )constraint_sql)r3   
constraintr-   rI   s     r   r6   z5BaseDatabaseSchemaEditor.table_sql.<locals>.<genexpr>  sG       # # ))%66# # # # # #r    , c              3   8   K   | ]}|t          |          V  d S r1   )r]   )r3   	statements     r   r6   z5BaseDatabaseSchemaEditor.table_sql.<locals>.<genexpr>  sB       $ $$I$ $ $ $ $ $r    )table
definition)!r(   unique_togetherrL   rb   _create_unique_sqllocal_fields
column_sqldb_parametersrC   sql_check_constraintdb_type_suffixextendr<   db_constraintr-   db_tablern   
field_namecolumnsql_create_inline_fkrj   rF   supports_foreign_keys_create_fk_sqlget_internal_typeri   autoinc_sqlconstraints
create_sqlsql_create_tablejoindb_tablespacetablespace_sql)rI   r-   field_namesfieldscolumn_sqlsrX   r   r   extra_params	db_paramscol_type_suffixru   rv   r   constraint_sqlsr}   rU   r   s   ``                r   	table_sqlz"BaseDatabaseSchemaEditor.table_sql   s    !;6 	M 	MKLLLLLLLF$$T%<%<UF%K%KLLLL[- 2	: 2	:E'+ue'D'D$J!++t+GGI! JcD$=	$III
#22do2NNO 6eo55
MM,'''! e&9  -39B!.4:DD&1   , 
#(A$(OOH$=$=%)__Y%?%?E E ) # JJ _-C %,,++!5*J     OOEL1111J   &&(( -  
 #o1==K(%,   :%,,[999  
	 $k5 M M
!(()>)>ud)K)KLLLLM "" # # # # #"'+"9# # #    #__U[%9::)) $ $!A;!A!A!A$ $ $  '
 '
 
 ;$ 	,!_0??) N  ,s^++F{r    c              #   ~  K   |V  |                     d          x}r|                     |          V  | j        j        j        r#|j        r|                     |j                  V  |j        }|j        t          ur6| 
                    |          \  }	}
d|	 V  |                    |
           d}|o-|                     |           o|o|                     |           }|rt|                     |          }|]d|                     |          z   }| j        j        j        r||                     |          z  V  n|V  |                    |           |j        r|j        s| j        j        j        rd}|j        r2|                     |          \  }}|                    |           |V  n|sdV  n| j        j        j        sdV  |j        rdV  n|j        rdV  |j        p|j        j        }|r=| j        j        j        r.|j        r)| j        j                            |d	          V  d S d S d S d S )
N	collationzDEFAULT FTzNOT NULLNULLzPRIMARY KEYUNIQUE)inline)get_collate_sqlrC   rF   supports_comments_inline
db_comment_comment_sqlnull
db_defaultr   db_default_sqlr   skip_defaultskip_default_on_altereffective_default_column_default_sqlrequires_literal_defaultsprepare_defaultrb   empty_strings_allowedr   !interprets_empty_strings_as_nulls	generated_column_generated_sqlimplied_column_nulluniquer   r(   supports_tablespacesri   r   )rI   column_db_typerX   r-   r   field_db_paramsinclude_defaultr   r   default_sqldefault_paramsdefault_valuecolumn_defaultgenerated_sqlgenerated_params
tablespaces                   r   _iter_column_sqlz)BaseDatabaseSchemaEditor._iter_column_sql/  s      '++K8889 	/##I.....?#< 	6AQ 	6##E$455555z<//*.*=*=e*D*D'K*[*****MM.)))#O  =%%e,,,= ;$44U;;< 	  	1 22599M(!+d.F.Fu.M.M!M?+E 1 )4+?+?+N+NNNNNN((((MM-000 '	%	 (J	
 D? 	.2.H.H.O.O+M+MM*+++ 	)= 	LLL 	\ 	NNN(EEK,E
	N(=	N 	N
 /%44Z4MMMMMMM	N 	N 	N 	N 	N 	Nr    c           
          |                     | j                  }|d         }|dS g }d                    |                     ||||||                    |fS )z
        Return the column definition for a field. The field must already have
        had set_attributes_from_name() called.
        rr   typeNNNrt   )r   rC   r   r   )rI   r-   r   r   r   r   rX   s          r   r   z#BaseDatabaseSchemaEditor.column_sqlr  s{      ---II(0!:HH%%"## 
 
 
 	
r    c                     dS )z
        Some backends don't accept default values for certain columns types
        (i.e. MySQL longtext and longblob).
        FrV   rI   r   s     r   r   z%BaseDatabaseSchemaEditor.skip_default  	    
 ur    c                     dS )z
        Some backends don't accept default values for certain columns types
        (i.e. MySQL longtext and longblob) in the ALTER COLUMN statement.
        FrV   r   s     r   r   z.BaseDatabaseSchemaEditor.skip_default_on_alter  r   r    c                      t          d          )zU
        Only used for backends which have requires_literal_defaults feature
        zsubclasses of BaseDatabaseSchemaEditor for backends which have requires_literal_defaults must provide a prepare_default() methodNotImplementedErrorrI   values     r   r   z(BaseDatabaseSchemaEditor.prepare_default  s     "P
 
 	
r    c                     dS )z
        Return the SQL to use in a DEFAULT clause. The resulting string should
        contain a '%s' placeholder for a default value.
        %srV   r   s     r   r   z,BaseDatabaseSchemaEditor._column_default_sql  s	    
 tr    c                 l    ddl m} |j        }t          ||          r                     |          nd}t          |j                  }|                     j                  }|	                    |          \  }} j        j
        j        r |t           fd|D                       z  }g }||z  |fS )z;Return the sql and params for the field's database default.r   )Valuez(%s)r,   rr   c              3   B   K   | ]}                     |          V  d S r1   )r   r3   prI   s     r   r6   z:BaseDatabaseSchemaEditor.db_default_sql.<locals>.<genexpr>  s1       I IQ!5!5a!8!8 I I I I I Ir    )django.db.models.expressionsr   _db_default_expression
isinstancer   r   r-   get_compilerrC   compilerF   r   rc   )	rI   r   r   r   rU   querycompilerr   rX   s	   `        r   r   z'BaseDatabaseSchemaEditor.db_default_sql  s    6666661
/9*e/L/LXD$$U+++RX 	 EK(((%%%AA&..z::V?#= 	 5 I I I I& I I IIIIKF[ &((r    c                      |                      j                  \  }}|j        rdnd} j        j        j        r |t           fd|D                       z  }d}d| d| |fS )z3Return the SQL to use in a GENERATED ALWAYS clause.STOREDVIRTUALc              3   B   K   | ]}                     |          V  d S r1   re   r   s     r   r6   zABaseDatabaseSchemaEditor._column_generated_sql.<locals>.<genexpr>  s1      3X3XAD4D4DQ4G4G3X3X3X3X3X3Xr    rV   zGENERATED ALWAYS AS (z) )r   rC   
db_persistrF   r   rc   )rI   r   expression_sqlrX   persistency_sqls   `    r   r   z.BaseDatabaseSchemaEditor._column_generated_sql  s    !&!4!4T_!E!E&+&6E((I?#= 	+e3X3X3X3XQW3X3X3X.X.XXNFJ~JJJJFRRr    c                    |                                  r|                                 }n| j        rd }n| j        s,| j        r%| j        r|                                 dk    rd}nd}nt          | dd          st          | dd          rw|                                 }|dk    rt          j	                    }nKt          j	                    }|dk    r|                                }n|d	k    r|                                }nd }|S )
NBinaryFieldr    r[   auto_nowFauto_now_addDateTimeField	DateField	TimeField)has_defaultget_defaultr   r   blankr   r   getattrr   nowr   datetime)r   defaultinternal_types      r   _effective_defaultz+BaseDatabaseSchemaEditor._effective_default  s     	''))GG_ 	GG 	 	0K 	&&((M99UJ.. 	'%QV2W2W 	!3355M//",..",.. K//%llnnGG"k11%llnnGGr    c                 ^    |                     |                     |          | j                  S )z2Return a field's effective database default value.)get_db_prep_saver   rC   r   s     r   r   z*BaseDatabaseSchemaEditor.effective_default  s(    %%d&=&=e&D&DdoVVVr    c                     t                      )aX  
        Return a quoted version of the value so it's safe to use in an SQL
        string. This is not safe against injection from user code; it is
        intended only for use in making SQL scripts or preparing default values
        for particularly tricky backends (defaults are not user-defined, though,
        so this is safe).
        r   r   s     r   re   z$BaseDatabaseSchemaEditor.quote_value  s     "###r    c           	         |                      |          \  }}|                     ||pd           | j        j        j        r|j        j        r!|                     |d|j        j                   | j        j        j        s^|j        j	        D ]Q}|j
        rH|                    | j                  }|d         } | j        |                     ||||j
                    R| j                            |                     |                     |j        j        D ]7}|j        j        j        j        r|                     |j        j                   8dS )zr
        Create a table and any accompanying indexes or unique constraints for
        the given `model`.
        Nrr   r   )r   rP   rC   rF   supports_commentsr(   db_table_commentalter_db_table_commentr   r   r   r   _alter_column_comment_sqlrL   r   _model_indexes_sqllocal_many_to_manyr<   throughauto_createdcreate_model)rI   r-   rU   rX   r   r   
field_types          r   r  z%BaseDatabaseSchemaEditor.create_model  so   
 nnU++V 	S&.D)))?#5 	{+ W++E49UVVV?+D "[5 
 
E' 	*/*=*='+ +> + + &5V%<
$!;; %uj%:J   	  !8!8!?!?@@@ [3 	> 	>E!)/< >!!%"4"<===	> 	>r    c                    |j         j        D ]7}|j        j        j         j        r|                     |j        j                   8|                     | j        d|                     |j         j	                  iz             t          | j                  D ]P}t          |t                    r9|                    |j         j	                  r| j                            |           QdS )z!Delete a model from the database.r   N)r(   r  r<   r  r  delete_modelrP   sql_delete_tablerj   r   listrL   r   r
   references_tableremove)rI   r-   r   rU   s       r   r	  z%BaseDatabaseSchemaEditor.delete_model  s     [3 	> 	>E!)/< >!!%"4"<=== 	!)=>>	
 	
 	
 )** 	. 	.C#y)) .c.B.B$/ / . !((---		. 	.r    c                     |j         r| j        j        j        sdS |                     |                    ||           d           dS )zAdd an index on a model.NrX   )contains_expressionsrC   rF   supports_expression_indexesrP   r   rI   r-   indexs      r   	add_indexz"BaseDatabaseSchemaEditor.add_index)  sT     &	O,H	 4 	U%%eT224@@@@@r    c                     |j         r| j        j        j        sdS |                     |                    ||                      dS )zRemove an index from a model.N)r  rC   rF   r  rP   
remove_sqlr  s      r   remove_indexz%BaseDatabaseSchemaEditor.remove_index4  sN     &	O,H	 4U%%eT2233333r    c                     | j         j        j        r8|                     |                     ||j        |j                  d            d S |                     ||           |                     ||           d S )Nr  )rC   rF   can_rename_indexrP   _rename_index_sqlr   r  r  )rI   r-   	old_index	new_indexs       r   rename_indexz%BaseDatabaseSchemaEditor.rename_index=  s    ?#4 	-LL&&uininMM      
 eY///NN5),,,,,r    c                 h    |                     ||           }|r|                     |d           dS dS )zAdd a constraint to a model.Nr  )r   rP   rI   r-   r}   rU   s       r   add_constraintz'BaseDatabaseSchemaEditor.add_constraintG  sG    ##E400 	+ LLTL*****	+ 	+r    c                 d    |                     ||           }|r|                     |           dS dS )z!Remove a constraint from a model.N)r  rP   r  s       r   remove_constraintz*BaseDatabaseSchemaEditor.remove_constraintO  sA    ##E400 	LL	 	r    c                 F   d |D             }d |D             }|                     |          D ]"}|                     |ddd| j                   #|                     |          D ]9}fd|D             }|                     |                     |                     :dS )z
        Deal with a model changing its unique_together. The input
        unique_togethers must be doubly-nested, not the single-nested
        ["foo", "bar"] format.
        c                 ,    h | ]}t          |          S rV   rc   r3   r   s     r   	<setcomp>zABaseDatabaseSchemaEditor.alter_unique_together.<locals>.<setcomp>[      @@@&f@@@r    c                 ,    h | ]}t          |          S rV   r%  r&  s     r   r'  zABaseDatabaseSchemaEditor.alter_unique_together.<locals>.<setcomp>\  r(  r    TF)r   r   c                 D    g | ]}j                             |          S rV   rm   ro   s     r   rp   zBBaseDatabaseSchemaEditor.alter_unique_together.<locals>.<listcomp>g  rq   r    N)
difference_delete_composed_indexsql_delete_uniquerP   r   )rI   r-   old_unique_togethernew_unique_togetheroldsnewsr   r   s    `      r   alter_unique_togetherz.BaseDatabaseSchemaEditor.alter_unique_togetherU  s     A@,?@@@@@,?@@@ood++ 	 	F''66&	     ??400 	A 	AKLLLLLLLFLL00??@@@@	A 	Ar    c                 J   d |D             }d |D             }|                     |          D ]"}|                     |ddd| j                   #|                     |          D ];}fd|D             }|                     |                     |d                     <d	S )
z
        Deal with a model changing its index_together. The input
        index_togethers must be doubly-nested, not the single-nested
        ["foo", "bar"] format.
        c                 ,    h | ]}t          |          S rV   r%  r&  s     r   r'  z@BaseDatabaseSchemaEditor.alter_index_together.<locals>.<setcomp>p      ???&f???r    c                 ,    h | ]}t          |          S rV   r%  r&  s     r   r'  z@BaseDatabaseSchemaEditor.alter_index_together.<locals>.<setcomp>q  r5  r    TF)r  r   c                 D    g | ]}j                             |          S rV   rm   ro   s     r   rp   zABaseDatabaseSchemaEditor.alter_index_together.<locals>.<listcomp>|  rq   r    _idx)r   suffixN)r+  r,  sql_delete_indexrP   _create_index_sql)rI   r-   old_index_togethernew_index_togetherr0  r1  r   r   s    `      r   alter_index_togetherz-BaseDatabaseSchemaEditor.alter_index_togetherj  s     @?,>?????,>???ood++ 	 	F''%00%	     ??400 	V 	VKLLLLLLLFLL//fV/TTUUUU	V 	Vr    c           
      p   d j         j        D             }d j         j        D             }fd|D             } | j        |fd||z  i|}|                    d          du rI|rG| j        j        j        r6t          | 	                    j         j
        |d                    }	|	|v r|	g}t          |          d	k    rCt          d
t          |          dj         j
        dd                    |          d          |                     |                     ||d                              d S )Nc                     h | ]	}|j         
S rV   r   r3   r}   s     r   r'  zBBaseDatabaseSchemaEditor._delete_composed_index.<locals>.<setcomp>  s'     !
 !
 !
 *JO!
 !
 !
r    c                     h | ]	}|j         
S rV   rA  rB  s     r   r'  zBBaseDatabaseSchemaEditor._delete_composed_index.<locals>.<setcomp>  s    RRR
JORRRr    c                 N    g | ]!}j                             |          j        "S rV   )r(   rn   r   ro   s     r   rp   zCBaseDatabaseSchemaEditor._delete_composed_index.<locals>.<listcomp>  s,    KKK55;((//6KKKr    excluder   TFquote   Found wrong number (z) of constraints for (r~   )r   )r(   r   indexes_constraint_namesr   rC   rF   *allows_multiple_constraints_on_same_fieldsr]   _unique_constraint_namer   len
ValueErrorr   rP   _delete_constraint_sql)
rI   r-   r   constraint_kwargsrU   meta_constraint_namesmeta_index_namescolumnsconstraint_namesdefault_names
    `        r   r,  z/BaseDatabaseSchemaEditor._delete_composed_index  s   !
 !
.3k.E!
 !
 !
 SRek>QRRRKKKKFKKK141
 
 *,<<
  	
 
 !!(++t33  4(S 4
 ,,U[-A7RW,XX L ///$0>   A%%* ())))K(((IIg&&&&	   	T00e=Ma=PQQRRRRRr    c                    ||k    s;| j         j        j        r,|                                |                                k    rdS |                     | j        |                     |          |                     |          dz             | j        D ]-}t          |t                    r|
                    ||           .dS )z#Rename the table a model points to.N)	old_table	new_table)rC   rF   ignores_table_name_caselowerrP   sql_rename_tablerj   rL   r   r
   rename_table_references)rI   r-   old_db_tablenew_db_tablerU   s        r   alter_db_tablez'BaseDatabaseSchemaEditor.alter_db_table  s    <''O$< (""$$(:(:(<(<<<F!!__\::!__\:: 	
 	
 	
 $ 	H 	HC#y)) H++L,GGG	H 	Hr    c                     | j         re| j        j        j        rV|                     | j         |                     |j        j                  |                     |pd          dz             d S d S d S )Nr[   )r   comment)	sql_alter_table_commentrC   rF   r   rP   rj   r(   r   re   )rI   r-   old_db_table_commentnew_db_table_comments       r   r   z/BaseDatabaseSchemaEditor.alter_db_table_comment  s    ' 	DO,D,V 	LL,!__U[-ABB#//0D0JKK     	 	 	 	r    c                     |                      | j        |                     |j        j                  |                     |          |                     |          dz             dS )z)Move a model's table between tablespaces.)r   old_tablespacenew_tablespaceN)rP   sql_retablespace_tablerj   r(   r   )rI   r-   old_db_tablespacenew_db_tablespaces       r   alter_db_tablespacez,BaseDatabaseSchemaEditor.alter_db_tablespace  sk    ')=>>"&//2C"D"D"&//2C"D"D 	
 	
 	
 	
 	
r    c           
      l   |j         r5|j        j        j        j        r|                     |j        j                  S |                     ||d          \  }}|dS |                    | j                  x}r|d| z  }|	                    | j                  }|d         r|d| j
        |z  z   z  }|j        rY| j        j        j        rG|j        r?d}| j        r|j        j        j        j        }|j        j        j                            |j        j                  j        }	t)          |j        j                  \  }
}|d| j        |                     |||          |
rd|                     |
          z  nd	|                     |j                  |                     |          |                     |	          | j        j                                        d
z  z   z  }n/| j                            |                     |||                     | j        |                     |j        j                  |                     |j                  |dz  }|                     ||pd           |j        t>          u r|                      |          sq| !                    |          \| "                    |d|d          \  }}| j#        |                     |j        j                  |dz  }|                     ||           |j$        rO| j        j        j%        r>| j        j        j&        s-|d         } | j        | '                    ||||j$                    | j        (                    | )                    ||                     | j        j        j*        r| j        +                                 dS dS )z
        Create a field on a model. Usually involves adding a column, but may
        involve adding a table instead (for M2M fields).
        T)r   Nrr   rt   rs   rw   z%s.r[   )r   	namespacer   ru   rv   
deferrable)r   r   r   dropr   changesr   ),r   r<   r  r(   r  r  r   r   rC   r   r   rF   r   r   sql_create_column_inline_fkr-   r   rn   r   r   r   _fk_constraint_namerj   ri   deferrable_sqlrL   rb   r   sql_create_columnrP   r   r   r   r   _alter_column_default_sqlsql_alter_columnr   r   r   r  r   _field_indexes_sqlconnection_persists_old_columnsclose)rI   r-   r   r   rX   r   r   constraint_suffixru   rv   rp  _rU   changes_sqlr  s                  r   	add_fieldz"BaseDatabaseSchemaEditor.add_field  s     	A%"4"<"B"O 	A$$U%7%?@@@!__UE4_PP
FF#22do2NNN? 	0/o///J''4?'CC	W 	F# 9I EEEJ	(>	 #	
 !A/  -39B!.4:DD&1    00DEE	1cD$D 44UECTUU>GO	 : :::R"ooel;; $ 9 9!%!;!;"&/"5"D"D"F"F	H 	H 	% 	 	

 !((''u6GHH   $__U[%9::ooel33$(
 (
 
 	S&.D))) ,,..u55 -&&u--9"&"@"@tU #A # #K ')=>>&+ + C LLf%%% 
	(:
	 O,E
	
 #6*JDL//5*e.>   	  !8!8!F!FGGG?#C 	$O!!#####	$ 	$r    c                 B   |j         r5|j        j        j        j        r|                     |j        j                  S |                    | j                  d         dS |j        rL|                     ||j	        gd          }|D ]+}| 
                    |                     ||                     ,| j        |                     |j        j                  |                     |j	                  dz  }| 
                    |           | j        j        j        r| j                                         t%          | j                  D ]V}t)          |t*                    r?|                    |j        j        |j	                  r| j                            |           WdS )z
        Remove a field from a model. Usually involves deleting a column,
        but for M2Ms may involve deleting a table.
        rr   r   NTforeign_key)r   r   )r   r<   r  r(   r  r	  r   rC   rM  r   rP   _delete_fk_sqlsql_delete_columnrj   r   rF   r}  r~  r  rL   r   r
   references_columnr  )rI   r-   r   fk_namesfk_namerU   s         r   remove_fieldz%BaseDatabaseSchemaEditor.remove_field!  s     	A%"4"<"B"O 	A$$U%7%?@@@$/::6BJF 	B--eel^QU-VVH# B BT00@@AAAA$__U[%9::ooel33(
 (
 
 	S?#C 	$O!!###)** 	. 	.C#y)) .c.C.C$el/ / . !((---		. 	.r    c           
         |                      ||          sdS |                    | j                  }|d         }|                    | j                  }|d         }d}	||j        	||j        t	          d|d|d          |^|\|j        j        rP|j        j        rD|j        j        j        j        r.|j        j        j        j        r|                     ||||          S |H|F|j        j        r:|j        j        r.|j        j        j        j        s|j        j        j        j        sdS ||t	          d|d|d          |j	        |j	        k    s|j	        r|j
        |j
        k    rd	}	nU|j	        rN	 |                    | j                  }
|                    | j                  }|
|k    }	n# t          $ r d	}	Y nw xY w|	rt	          d
| d          |                     ||||||||           dS )a'  
        Allow a field's type, uniqueness, nullability, default, column,
        constraints, etc. to be modified.
        `old_field` is required to compute the necessary changes.
        If `strict` is True, raise errors if the old column does not match
        `old_field` precisely.
        Nrr   r   FzCannot alter field z into zT - they do not properly define db_type (are you using a badly-written custom field?)zr - they are not compatible types (you cannot alter to or from M2M fields, or add or remove through= on M2M fields)Tz7Modifying GeneratedFields is not supported - the field z6 must be removed and re-added with the new definition.)_field_should_be_alteredr   rC   r<   rQ  r  r(   r  _alter_many_to_manyr   r   r   r   _alter_field)rI   r-   r5   r9   strictold_db_paramsold_typenew_db_paramsnew_typemodifying_generated_fieldold_field_sqlnew_field_sqls               r   alter_fieldz$BaseDatabaseSchemaEditor.alter_fieldA  s    ,,Y	BB 	F!//4?/KK (!//4?/KK ($)!!7!?!7!?* 99iii)    &. ! *2 ! *28E	 !
 *28E ! ++E9iPPP &. ! *2 ! ".6<I	 !
 ".6<I ! F!1* .7YY			C  
  I$777 8$-$8I<P$P$P(,%%  	KK ) 7 7 H H
 !* 7 7 H H,9],J))  1 1 1,0)))1 % 	H) H H H  
 			
 		
 		
 		
 		
s   ?F: :G	G	c                     | j         j        }|                    | j                   }d|d<   	 ||                                         |z  S # t          $ r Y d S w xY w)N__column_name__r   )rC   data_type_check_constraintsdb_type_parametersr   KeyError)rI   r   r   check_constraintsdatas        r   _field_db_checkz(BaseDatabaseSchemaEditor._field_db_check  sp     !OG''88*X	$U%<%<%>%>?$FF 	 	 	44	s   A
 

AAc	           	         t                      }	| j        j        j        r|j        r|j        r|                     ||dh          r|                     ||j        gd          }
|rGt          |
          dk    r4t          dt          |
          d|j        j        d|j                  |
D ]F}|	                    |j        f           |                     |                     ||                     G|j        r|j        r|                     ||          rd	 |j        j        D             }|                     ||j        gdd
|          }|rGt          |          dk    r4t          dt          |          d|j        j        d|j                  |D ]+}|                     |                     ||                     ,|                    d          }|                    d          }| j        j        j        o'|j        r|j        p|j        o|j        o||k    p||k    }|rqt-          ||          D ]`\  }}|                     |j        |j        j        gd          }|D ]0}|                     |                     |j        |                     1a|j        r|j        s||j        r|j        rnd |j        j        D             }|                     ||j        gdt6          j        |          }|D ]+}|                     |                     ||                     ,|                     ||          }|                     ||          }||k    r|rd |j        j        D             }|                     ||j        gd|          }|rGt          |          dk    r4t          dt          |          d|j        j        d|j                  |D ]+}|                     |                     ||                     ,|j        |j        k    r|                     |                      |j        j        |||                     | j!        D ]B}tE          |tF                    r+|$                    |j        j        |j        |j                   Cg }g }g }|%                    | j                  }|%                    | j                  }||k    s-||k    s'||k    s!| j        j        j&        rW|j'        |j'        k    rG| (                    ||||||          \  } }!|)                    |            |*                    |!           |j+        tX          urI|j+        tX          u s|j+        |j+        k    r*|)                    | -                    |||                     n:|j+        tX          ur,|)                    | -                    |||d                     d
}"|j.        r|j.        s|j+        tX          u rs| /                    |          }#| /                    |          }$| 0                    |          s4|#|$k    r.|$,d}"|)                    | 1                    |||                     |j.        |j.        k    r.| 2                    |||          } | r|)                    |            |3                                p|j+        tX          uo|j.        o|j.         }%|s|rj|%s||z  }| j        j        j4        rA|r?tk          tm          |           \  }}&d7                    |          tq          |&g           fg}|D ]C\  }}&|                     | j9        | :                    |j        j                  |dz  |&           D|%r|j+        tX          u rd}'|$g}&n| ;                    |          \  }'}&|                     | j<        | :                    |j        j                  | :                    |j                  |'dz  |&           |D ]C\  }}&|                     | j9        | :                    |j        j                  |dz  |&           D|r|D ]\  }}&|                     ||&           |j        r|j        s| =                    ||           | >                    ||          r*|                     | ?                    ||g                     |j        r|j        r9|j        r2|j        s+|                     | @                    ||g                     g }(|r#|(*                    t-          ||                     |                     ||          rL|                     | A                    ||                     |(*                    t-          ||                     |(D ]\  })}|j        B                    | j                  }*|*d         }+|*                    d          },|)j        B                    | j                  }-|-                    d          }.| (                    |j        |)j        |j        |+|.|,          \  } }!|                     | j9        | :                    |j        j        j                  | d         dz  | d                    |!D ]\  }}&|                     ||&           | j        j        j        rH|j        rA|	s|j        r|j        s1|j        r*|                     | C                    ||d                     |rH|(D ]E\  }/}0|0j        j        r4|                     | C                    |0j        |0j        d                     F||k    rZ|rX| D                    |j        j        |j        gd           }|                     | E                    |||d!                              |"r\| 1                    |||d          \  }1}&| j9        | :                    |j        j                  |1dz  }|                     ||&           | j        j        jF        r| j        G                                 dS dS )"z3Perform a "physical" (non-ManyToMany) field update.r   )ignoreTr  rH  rI  z!) of foreign key constraints for .c                     h | ]	}|j         
S rV   rA  rB  s     r   r'  z8BaseDatabaseSchemaEditor._alter_field.<locals>.<setcomp>  '     % % %$.
% % %r    F)r   r   rE  z) of unique constraints for r   c                     h | ]	}|j         
S rV   rA  )r3   r  s     r   r'  z8BaseDatabaseSchemaEditor._alter_field.<locals>.<setcomp>  s    LLLu
LLLr    )r  type_rE  c                     h | ]	}|j         
S rV   rA  rB  s     r   r'  z8BaseDatabaseSchemaEditor._alter_field.<locals>.<setcomp>  r  r    )rs   rE  z) of check constraints for rr   rr  Nr~   rt  r   )r   r   r   r   r   r   rw   _fk_checkr9  rs   )HsetrC   rF   r   r<   r   r  rM  r   rP  rQ  r(   r   addrP   r  r   _field_became_primary_keyr   _delete_unique_sqlr   r   r;   related_modelr   db_indexrL  r   r9  _delete_index_sqlr  _delete_check_sql_rename_field_sqlrL   r   r
   rename_column_referencesr   r   r   _alter_column_type_sqlrb   r   r   r   "_alter_column_database_default_sqlr   r   r   rz  _alter_column_null_sqlr   supports_combined_altersrc   r:   r   sumr{  rj   r   sql_update_with_default_delete_primary_key_unique_should_be_addedr   r;  _create_primary_key_sqlr   r   _create_index_name_create_check_sqlr}  r~  )2rI   r-   r5   r9   r  r  r  r  r  fks_droppedr  r  rT  rW  constraint_nameold_collationnew_collationdrop_foreign_keys_old_relr?   rel_fk_namesrU  index_names
index_nameold_db_checknew_db_checkrU   actionsnull_actionspost_actionsold_type_suffixnew_type_suffixfragmentother_actionsneeds_database_defaultold_defaultnew_defaultfour_way_default_alterationrX   r   rels_to_updater>   rel_db_paramsrel_typerel_collationold_rel_db_paramsold_rel_collationr  relr  s2                                                     r   r  z%BaseDatabaseSchemaEditor._alter_field  s    eeO$:	B&	B '	B --$~ .  		B --	()t .  H  #h--1,, j H,,,!((	   $ B B!1 3444T00@@AAAA 	N 	N$($B$B9i$X$X	N% %27+2I% % %!  $55!"!-  6      #.//144 j ,----,,,!((	   $4 N NT44UOLLMMMM &))+66%))+66O$: M&@9+@ ;$9)9M
 h&KM],J 	  	V &>i%S%S V V!'#55)GM,@+At  6      , V VGLL!4!4W5JG!T!TUUUUV 	H$	H '	H ,5+;	H  ML8KLLL 00!"l( 1  K * H H
 T33E:FFGGGG++I}EE++I}EE<''L'% %27+2I% % %!  $55!"-	  6      #.//144 j ,----,,,!((	   $4 M MT33E?KKLLLLy///LL&&K()Y    (  c9-- 00,i.>	@P   #22do2NN#22do2NN   /11--(: . (I,@@@ '+&A&Ay)X}m' '#Hm NN8$$$...|33$44'9+???;;E9iXX   !55NN779id 8     "'N	N	 $4400;;K00;;K..y99;..+)-&225)YOO   >Y^++225)YOOH .##H--- !!##Oy';<'O'6~4in"4 	$  -	l -	. ( <''@ >W >#CM22V IIcNNCOO<=&  V)!%1E!F!F#& 
     + '<77"&K)]FF*.*=*=i*H*H'K0!%1E!F!F"&//)2B"C"C#.     $0  KCLL-%)__U[5I%J%J'* 
      	*+ * *VS&))))  	4)> 	4$$UF333''	9== 	FLL00DDEEE #	L'0'7	L"	L $	L
 LL//yk/JJKKK  	R!!":9i"P"PQQQ)))Y?? 	RLL55eYGGHHH!!":9i"P"PQQQ . 	* 	*GW#M774?7SSM$V,H)--k::M ' ; ;t ; W W 1 5 5k B B&*&A&A%!' '#Hm LL%!__W-B-H-QRR'{ 
     - * *VS&))))* O$:
	&
	 	
	 $-#9	
	 BKAX	
	 '
	 LL##E96VWW    	(  39* LL++C,=sy%PP   <''L'"55$y'7&8 6  O LL&&uo}W?UVV  
 " 	&"&"@"@y)$ #A # #K ')=>>&+ + C LLf%%%?#C 	$O!!#####	$ 	$r    c                     | j         j        j        r	|j        rdS |                    | j                   }|j        r| j        n| j        }||                     |j	                  |d         dz  g fS )z
        Hook to specialize column null alteration.

        Return a (sql, params) fragment to set a column to null or non-null
        as required by new_field, or None if no changes are required.
        Nrr   r   )r   r   )
rC   rF   r   r   r   r   sql_alter_column_nullsql_alter_column_not_nullrj   r   )rI   r-   r5   r9   r  rU   s         r   r  z/BaseDatabaseSchemaEditor._alter_column_null_sql  s     O$F	/	
 F%33t3OOM >4**3  "ooi.>??)&1 
  r    c                 ~   |                      |          }|                     |          }|g}|rg }n(| j        j        j        r|                     |          }g }|                    | j                  }|r|j        r| j        }	n| j	        }	n| j
        }	|	|                     |j                  |d         |dz  |fS )z
        Hook to specialize column default alteration.

        Return a (sql, params) fragment to add or drop (depending on the drop
        argument) a default to new_field's column.
        rr   r   r   r   r   )r   r   rC   rF   r   r   r   r    sql_alter_column_no_default_nullsql_alter_column_no_defaultsql_alter_column_defaultrj   r   )
rI   r-   r5   r9   rs  r  r   rX   r  rU   s
             r   rz  z2BaseDatabaseSchemaEditor._alter_column_default_sql0  s     ,,Y77**955 	FF_%? 	 **;77GF!//4?/KK 	0~ 7;6/C//)*:;;%f-"  
 	
r    c                     |r| j         }d}g }n| j        }|                     |          \  }}|                    | j                  }||                     |j                  |d         |dz  |fS )z
        Hook to specialize column database default alteration.

        Return a (sql, params) fragment to add or drop (depending on the drop
        argument) a default to new_field's column.
        r[   rr   r   r  )r  r  r   r   rC   rj   r   )	rI   r-   r5   r9   rs  rU   r   rX   r  s	            r   r  z;BaseDatabaseSchemaEditor._alter_column_database_default_sqlV  s      	A2CKFF/C"&"5"5i"@"@K!//4?/KK//)*:;;%f-&  
 	
r    c                    g }|                      |||j        j                  x}rd| }nd}d}	| j        j        j        rq|j        sj|j        |j        k    r9|                     ||||j                  \  }
}|
r|	                    |
|f           |j        r| 
                    |j                  }	| j        |                     |j                  |||	dz  g f|fS )a  
        Hook to specialize column type alteration for different backends,
        for cases when a creation type is different to an alteration type
        (e.g. SERIAL in PostgreSQL, PostGIS fields).

        Return a 2-tuple of: an SQL fragment of (sql, params) to insert into
        an ALTER TABLE statement and a list of extra (sql, params) tuples to
        run once the field is altered.
        rt   r[   )r   r   r   rd  )r   r(   r   rC   rF   r   r   r   r  rb   r   sql_alter_column_typerj   r   )rI   r-   r5   r9   r  r  r  r  collate_sqlcomment_sqlrU   rX   s               r   r  z/BaseDatabaseSchemaEditor._alter_column_type_sqlr  s2    ++=%+*>
 
 
; 	 ,k++KKK?#5 
	Fi>T 
	F#y';;; #<<9h	0D V  8!((#v777# F"//	0DEE *"ooi.>??$!,*	  	 
 	
r    c                     | j         |                     |j        j                  |                     |j                  |                     |          dz  g fS )N)r   r   rd  )sql_alter_column_commentrj   r(   r   r   r   )rI   r-   r9   r  new_db_comments        r   r  z2BaseDatabaseSchemaEditor._alter_column_comment_sql  s]    ))=>>//)*:;;,,^<<  
 	
r    c                 0    |                      |pd          S )Nr[   r   )rI   rd  s     r   r   z%BaseDatabaseSchemaEditor._comment_sql  s    2...r    c                    |j         j        j        j        |j         j        j        j        k    rI|                     |j         j        |j         j        j        j        |j         j        j        j                   |                     |j         j        |j         j        j                            |                                          |j         j        j                            |                                                     |                     |j         j        |j         j        j                            |                                          |j         j        j                            |                                                     dS )z*Alter M2Ms to repoint their to= endpoints.N)	r<   r  r(   r   rb  r  rn   m2m_reverse_field_namem2m_field_name)rI   r-   r5   r9   r  s        r   r  z,BaseDatabaseSchemaEditor._alter_many_to_many  sc    "*09%-3<= = &.&.4=&.4=   	"* "*0::0022  "*0::0022 	
 	
 	
 	"*"*0::9;S;S;U;UVV"*0::9;S;S;U;UVV		
 	
 	
 	
 	
r    r[   c                 ,   t          |          \  }}t          |g|R ddi|}| j        j                                        pd}|dd                    |          d|}t          |          |k    r|S t          |          |dz  k    r|d|dz           }|t          |          z
  dz  dz
  }|d|         dd                    |          d|         d|}|d	         dk    s|d	                                         rd
|dd         z  }|S )z
        Generate a unique name for an index/unique constraint.

        The name is divided into 3 parts: the table name, the column names,
        and a unique digest and suffix.
        length      r     N   rH  r   zD%s)r   r   rC   ri   max_name_lengthr   rP  isdigit)	rI   
table_namecolumn_namesr9  r  hash_suffix_part
max_lengthr  other_lengths	            r   r  z+BaseDatabaseSchemaEditor._create_index_name  s_    )44:=l===1===F
 _(88::Ac
#-::sxx/E/E/E/EGWGWX
z??j((  :>11/0A*/0AB"S)9%:%::q@1D}}%%%HH\""=L=111

 a=C:a=#8#8#:#:CRC0Jr    c                    |_t          |          dk    r|d         j        r|d         j        }n1t          j        rt          j        }n|j        j        r|j        j        }|"d| j        j                            |          z   S dS )NrH  r   rt   r[   )rP  r   r   DEFAULT_INDEX_TABLESPACEr(   rC   ri   r   )rI   r-   r   r   s       r   _get_index_tablespace_sqlz2BaseDatabaseSchemaEditor._get_index_tablespace_sql  s     6{{aF1I$; &q	 72 : ( A* : % 9$,;;MJJJJrr    c                     |rd|z   S dS )Nz WHERE r[   rV   )rI   	conditions     r   _index_condition_sqlz-BaseDatabaseSchemaEditor._index_condition_sql  s     	)y((rr    c                     |r| j         j        j        sdS t          dt	          |j        j        || j                            S )Nr[   z INCLUDE (%(columns)s))rV  )rC   rF   supports_covering_indexesr
   r   r(   r   rj   )rI   r-   rV  s      r   _index_include_sqlz+BaseDatabaseSchemaEditor._index_include_sql  sN     	do6P 	2$EK0'4?KK
 
 
 	
r    )r   r   r9  usingr   col_suffixesrU   	opclassesr  includeexpressionsc                    |pg }|pg }t          |d                               j                  }                     |||          }d |D             }|p j        }|j        j        } fd}t          |t          | j	                  t          ||||          ||r                     ||||	          nt          ||| j                  |                     |
                               ||                    S )z
        Return the SQL statement to create the index for one or several fields
        or expressions. `sql` can be specified if the syntax differs from the
        standard (GIS indexes, ...).
        F
alias_colsrr   )r   c                     g | ]	}|j         
S rV   r   r3   r   s     r   rp   z>BaseDatabaseSchemaEditor._create_index_sql.<locals>.<listcomp>$      444E5<444r    c                  L     j         | i |                              S r1   )r  rj   )argskwargsr   rI   s     r   create_index_namezEBaseDatabaseSchemaEditor._create_index_sql.<locals>.create_index_name(  s1    |.t.?????4(((r    )r   r   r
  rV  rY   r  r  )r   r   rC   r  sql_create_indexr(   r   r
   r   rj   r	   _index_columnsr   re   r  r	  )rI   r-   r   r   r9  r
  r   r  rU   r  r  r  r  r   r   rV  r  r   r  s   `  `               r   r;  z*BaseDatabaseSchemaEditor._create_index_sql  sR   * 2!'R5111>> ? 
 
 776 8 
 
 54V4447$"7$	) 	) 	) 	) 	) 	) t//5'63DEE Q##E7L)LLL Xt?OPP //	::++E7;;
 
 
 	
r    c                    t          |p| j        t          |j        j        | j                  |                     |                    }|j        d         j        }|j        d         }t          | j	                  D ]G}t          |t                     r0|                    ||          r| j	                            |           H|S )Nr   r   r   r   )r
   r:  r   r(   r   rj   partsr   r  rL   r   references_indexr  )rI   r-   r   rU   r   r  r  s          r   r  z*BaseDatabaseSchemaEditor._delete_index_sql=  s    (4(,do>>&&
 
 
	 _W-3
_V,
)** 	. 	.C#y)) .c.B.BJ/ / . !((---r    c                     t          | j        t          |j        j        | j                  |                     |          |                     |                    S )N)r   old_namenew_name)r
   sql_rename_indexr   r(   r   rj   )rI   r-   r!  r"  s       r   r  z*BaseDatabaseSchemaEditor._rename_index_sqlO  sQ    !,do>>__X..__X..	
 
 
 	
r    c                 2    t          ||| j        |          S )N)r  )r   rj   )rI   r   rV  r  r  s        r   r  z'BaseDatabaseSchemaEditor._index_columnsW  s    ugt\RRRRr    c                 f   |j         j        r|j         j        s|j         j        rg S g }|j         j        D ]+}|                    |                     ||                     ,|j         j        D ]C}|j        r| j	        j
        j        r)|                    |                    ||                      D|S )zz
        Return a list of all index SQL statements (field indexes, Meta.indexes)
        for the specified model.
        )r(   managedproxyswappedr   r   r|  rL  r  rC   rF   r  rb   r   )rI   r-   outputr   r  s        r   r  z+BaseDatabaseSchemaEditor._model_indexes_sqlZ  s    
 {" 	ek&7 	5;;N 	I[- 	A 	AEMM$11%??@@@@[( 	= 	=E.=?+G= e..ud;;<<<r    c                     g }|                      ||          r+|                    |                     ||g                     |S )zT
        Return a list of all index SQL statements for the specified field.
        r  )_field_should_be_indexedrb   r;  )rI   r-   r   r)  s       r   r|  z+BaseDatabaseSchemaEditor._field_indexes_sqlm  sN     ((66 	IMM$00w0GGHHHr    c                    |j         s	|j         sdS |pt                      }|                                \  }}}}|                                \  }}}	}
|                    |j                  D ]}|                    |d            |                    |j                  D ]}|
                    |d            |j        sh|j        ra|j        rZ|j        j        j	        j
        |j        j        j	        j
        k    r,|                    dd            |
                    dd            |                    d          rk|
                    d          rV|                     |          |                     |          k    r*|                    d           |
                    d           |                     |j                  |                     |j                  k    p|||f||	|
fk    S )NFtor   )concreter  deconstructunionnon_db_attrspopr   r<   r-   r(   r   r   r   rj   r   )rI   r5   r9   r  r  old_pathold_args
old_kwargsnew_pathnew_args
new_kwargsattrs               r   r  z1BaseDatabaseSchemaEditor._field_should_be_alteredv  s   ! 	)*< 	5355,5,A,A,C,C)8Xz,5,A,A,C,C)8Xz LL!788 	' 	'DNN4&&&&LL!788 	' 	'DNN4&&&&&	'&	' &	' &,2;%+1:; ; NN4&&&NN4&&& NN<((	)|,,	) ##I..$2E2Ei2P2PPPNN<(((NN<(((y/00DOO5
 5
 
 R*-(Hj1QQ	Rr    c                      |j         o|j         S r1   )r  r   rI   r-   r   s      r   r+  z1BaseDatabaseSchemaEditor._field_should_be_indexed  s    ~2el"22r    c                      |j          o|j         S r1   r   rI   r5   r9   s      r   r  z2BaseDatabaseSchemaEditor._field_became_primary_key  s    ((BY-BBr    c                 >    |j          o|j        o|j         p|j         S r1   )r   r   r>  s      r   r  z0BaseDatabaseSchemaEditor._unique_should_be_added  s3    %% @ @%%>)>	
r    c                     | j         |                     |          |                     |j                  |                     |j                  |dz  S )N)r   
old_column
new_columnr   )sql_rename_columnrj   r   )rI   r   r5   r9   r  s        r   r  z*BaseDatabaseSchemaEditor._rename_field_sql  sR    %__U++//)*:;;//)*:;;	)
 )
 
 	
r    c           	         t          |j        j        | j                  }|                     |||          }t          |j        j        |j        g| j                  }t          |j        j        j        j        | j                  }t          |j        j        j        j        |j        j        g| j                  }| j	        j
                                        }	t          | j        ||||||	          S )N)r   r   r   ru   rv   rq  )r   r(   r   rj   rw  r   r   target_fieldr-   rC   ri   rx  r
   sql_create_fk)
rI   r-   r   r9  r   r   r   ru   rv   rq  s
             r   r   z'BaseDatabaseSchemaEditor._create_fk_sql  s    ek*DO<<''uf==-~tOO+17@$/RR$*3&'O
 
	
 _(7799
!
 
 
 	
r    c                       fd}t          |j        j        |j        gt	          |j        j        j        j                  d         |j        j        g||          S )Nc                  D                          j        | i |          S r1   rj   r  r  r  rI   s     r   create_fk_namezDBaseDatabaseSchemaEditor._fk_constraint_name.<locals>.create_fk_name  s(    ??#:4#:D#KF#K#KLLLr    rH  )r   r(   r   r   r   rE  r-   )rI   r-   r   r9  rK  s   `    r   rw  z,BaseDatabaseSchemaEditor._fk_constraint_name  sr    	M 	M 	M 	M 	M K \NU/5;DEEaH&'
 
 	
r    c                 :    |                      | j        ||          S r1   )rR  sql_delete_fkrI   r-   r   s      r   r  z'BaseDatabaseSchemaEditor._delete_fk_sql      **4+=udKKKr    c                 V    |dS |t           j        k    rdS |t           j        k    rdS d S )Nr[   z DEFERRABLE INITIALLY DEFERREDz DEFERRABLE INITIALLY IMMEDIATE)r   DEFERRED	IMMEDIATE)rI   rq  s     r   _deferrable_constraint_sqlz3BaseDatabaseSchemaEditor._deferrable_constraint_sql  s=    2,,,33---44 .-r    c                     |du rdS |du rdS dS )NFz NULLS NOT DISTINCTTz NULLS DISTINCTr[   rV   )rI   nulls_distincts     r    _unique_index_nulls_distinct_sqlz9BaseDatabaseSchemaEditor._unique_index_nulls_distinct_sql  s)    U""((t##$$rr    c                     | s| j         j        j        oP| p| j         j        j        o<| p| j         j        j        o(| p| j         j        j        o|d u p| j         j        j        S r1   )rC   rF   supports_partial_indexes&supports_deferrable_unique_constraintsr  r  *supports_nulls_distinct_unique_constraints)rI   r  rq  r  r  rU  s         r   _unique_supportedz*BaseDatabaseSchemaEditor._unique_supported  s     ]Odo6O  S?+R
 R 8 R  W4?#;#W $& W?+V	
r    c
           
                                |||||	          sd S |s|s|s|s|	;                     ||||||||	          }
|
r j                            |
           d S  j        d                     fd|D                                            |          dz  } j                             |          |dz  S )Nr  rq  r  r  rU  )r   r  r  r  r  rU  r~   c                 D    g | ]}                     |j                  S rV   )rj   r   )r3   r   rI   s     r   rp   z8BaseDatabaseSchemaEditor._unique_sql.<locals>.<listcomp>(  s'    !T!T!TE$//%,"?"?!T!T!Tr    )rV  rq  r   r}   )	r[  r   rL   rb   sql_unique_constraintr   rS  sql_constraintrj   )rI   r-   r   r   r  rq  r  r  r  rU  rU   r}   s   `           r   _unique_sqlz$BaseDatabaseSchemaEditor._unique_sql  s:    %%!#) & 
 
 	 4 		 	 		
 ) ))##'- * 	 	C  .!((---4/yy!T!T!T!TV!T!T!TUU99*EE3
 3
 

 "OOD))$&
 &
 
 	
r    c
                    |                      |||||	          sd S t          |d                              | j                  }
|j        j        }d |D             }||                     ||d          }n|                     |          }|s|s|s|r| j        }n| j	        }|r| 
                    ||d|	          }nt          |||
| j                  }t          |t          || j                  |||                     |          |                     |          |                     ||          |                     |	          
          S )Nr]  Fr  rr   c                     g | ]	}|j         
S rV   r  r  s     r   rp   z?BaseDatabaseSchemaEditor._create_unique_sql.<locals>.<listcomp>I  r  r    TrF  rV   )r  r  )r   r   rV  r  rq  r  rU  )r[  r   r   rC   r(   r   rO  rj   sql_create_unique_indexsql_create_uniquer  r   re   r
   r   r  rS  r	  rV  )rI   r-   r   r   r  rq  r  r  r  rU  r   r   rV  rU   s                 r   r   z+BaseDatabaseSchemaEditor._create_unique_sql0  s    %%!#) & 
 
 	 45111>> ? 
 
 $44V444<//wd/KKDD??4((D 	) 	)9 	) 	).CC(C 	R))wR9 *  GG "%h@PQQGt////	::66zBB++E7;;@@PP	
 	
 	
 		
r    c                 F     |r fd}n j         }t          ||d|          S )Nc                  D                          j        | i |          S r1   rI  rJ  s     r   create_unique_namezLBaseDatabaseSchemaEditor._unique_constraint_name.<locals>.create_unique_namef  s(    '>t'>'O'O'OPPPr    _uniq)r  r	   )rI   r   rV  rG  ri  s   `    r   rO  z0BaseDatabaseSchemaEditor._unique_constraint_namec  sO     	9Q Q Q Q Q Q "&!82DEEEr    c	                     |                      |||||          sd S |s|s|s|r| j        }	n| j        }	|                     |	||          S )Nr]  )r[  r:  r-  rR  )
rI   r-   r   r  rq  r  r  r  rU  rU   s
             r   r  z+BaseDatabaseSchemaEditor._delete_unique_sqln  s~     %%!#) & 
 
 	 4 	) 	)9 	) 	)'CC(C**3t<<<r    c                 V    | j         |                     |          | j        d|iz  dz  S )Nrs   r_  )ra  rj   r   )rI   r   rs   s      r   
_check_sqlz#BaseDatabaseSchemaEditor._check_sql  s;    "OOD))3w6FF&
 &
 
 	
r    c                     | j         j        j        sd S t          | j        t          |j        j        | j                  |                     |          |          S )N)r   r   rs   )	rC   rF    supports_table_check_constraintsr
   sql_create_checkr   r(   r   rj   )rI   r-   r   rs   s       r   r  z*BaseDatabaseSchemaEditor._create_check_sql  sZ    'H 	4!,do>>&&	
 
 
 	
r    c                 `    | j         j        j        sd S |                     | j        ||          S r1   )rC   rF   ro  rR  sql_delete_checkrN  s      r   r  z*BaseDatabaseSchemaEditor._delete_check_sql  s2    'H 	4**4+@%NNNr    c                     t          |t          |j        j        | j                  |                     |                    S )Nr  )r
   r   r(   r   rj   )rI   templater-   r   s       r   rR  z/BaseDatabaseSchemaEditor._delete_constraint_sql  s?    ,do>>&&
 
 
 	
r    c
                     | fd|D             } j                                         5 }
 j         j                            |
|j        j                  }ddd           n# 1 swxY w Y   g }|                                D ]\  }}|||d         k    rq||d         |k    r"||d         |k    r1||d         |k    r@||d         |k    rO|	|d         sZ||d	         |k    ri|	r||	vr|                    |           |S )
z@Return all constraint names matching the columns and conditions.Nc           	         g | ]{}j         j        j        rIj         j                            t          |j         j                                                            nj         j                            |          |S rV   )rC   rF   truncates_namesintrospectionidentifier_converterr   ri   r  )r3   r   rI   s     r   rp   z>BaseDatabaseSchemaEditor._constraint_names.<locals>.<listcomp>  s     	 	 	  /?RDO1FF%dDO,?,O,O,Q,QRR   6KKDQQ	 	 	r    rV  r   r   r  rs   r  r   )rC   rf   rx  get_constraintsr(   r   itemsrb   )rI   r-   r  r   r   r  r  rs   r  rE  rf   r   resultr   infodicts   `              r   rM  z*BaseDatabaseSchemaEditor._constraint_names  s    #	 	 	 	 )	 	 	L _##%% 	/7GG, K	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 )//11 	( 	(ND(#|x	7J'J'J%(8*<*F*F*x/F+/U/U$'):e)C)C$'):e)C)C*8M3J*$&)9U)B)B ($g"5"5MM$'''s   +A""A&)A&c                    |                      |d          }|r?t          |          dk    r,t          dt          |          d|j        j                  |D ]+}|                     |                     ||                     ,d S )NTr=  rH  rI  z) of PK constraints for )rM  rP  rQ  r(   r   rP   _delete_primary_key_sql)rI   r-   r  rW  r  s        r   r  z,BaseDatabaseSchemaEditor._delete_primary_key  s    11%T1JJ 	c*++q00* ())))K((    0 	O 	OOLL55e_MMNNNN	O 	Or    c                 &   t          | j        t          |j        j        | j                  |                     |                     |j        j        |j        gd                    t          |j        j        |j        g| j                            S )N_pkr  )r   r   rV  )	r
   sql_create_pkr   r(   r   rj   r  r   r   r;  s      r   r  z0BaseDatabaseSchemaEditor._create_primary_key_sql  s    ,do>>''K(5<. (   
 EK05<.$/RR	
 	
 	
 		
r    c                 :    |                      | j        ||          S r1   )rR  sql_delete_pkrN  s      r   r  z0BaseDatabaseSchemaEditor._delete_primary_key_sql  rO  r    c                 :    |rd|                      |          z   ndS )NzCOLLATE r[   )rj   )rI   r   r  r  s       r   r   z%BaseDatabaseSchemaEditor._collate_sql  s#    :CKzDOOI6666Kr    c                     | j         |                     |          d                    |          dz  }|                     |           d S )N,)	procedureparam_types)sql_delete_procedurerj   r   rP   )rI   procedure_namer  rU   s       r   remove_procedurez)BaseDatabaseSchemaEditor.remove_procedure  sQ    '8888K00+
 +
 
 	Sr    )FT)rV   )F)r[   r1   )NNNNN)NNNNNN)NNNNNNN)T)NNNNNNNNr   )v__name__
__module____qualname____doc__r   r^  rk  r
  ry  r{  r  r  r  r  r  r  r  rC  r  r`  r   sql_delete_constraintra  rp  rr  rf  r-  rF  r   rv  rM  r  re  r#  r:  r  r  r  re  r  rJ   rN   rQ   rP   rj   r   r   r   r   r   r   r   r   r   staticmethodr   r   re   r  r	  r  r  r  r   r"  r2  r>  r,  rb  r   rn  r  r  r  r  r  r  rz  r  r  r  r   r  r  r  r  r	  r;  r  r  r  r  r|  r  r+  r  r  r  r   rw  r  rS  rV  r[  rb  r   rO  r  rm  r  r  rR  rM  r  r  r  r   r  rV   r    r   rA   rA   L   s         AJV5T:PC FP"H'B$NN  	Q  A.L9NX,	?  .	@   "&)M	9 
	B  I, 	R  *M9IVU U U U  A A A, , , ,>4 4 4\ \ \@AN AN ANF
 
 
 
6    
 
 
  ) ) )&S S S   \2W W W$ $ $!> !> !>F. . .*	A 	A 	A4 4 4- - -+ + +  A A A*V V V* S  S  SDH H H&  	
 	
 	
V$ V$ V$p. . .@Q
 Q
 Q
 Q
f	 	 	( r$ r$ r$ r$h  :$
 $
 $
 $
N 16
 
 
 
8,
 ,
 ,
\	
 	
 	
/ / /
 
 
@   @
 
 
 
  

 
 
 4
 4
 4
 4
 4
l   $
 
 
S S S  &  #R #R #R #RJ3 3 3C C C
 
 

 
 

 
 
*
 
 
L L L5 5 5   
 
 
 
: 2
 2
 2
 2
p 1
 1
 1
 1
f	F 	F 	F 	F = = = =2
 
 

 
 
O O O

 
 
 - - - -^O O O O

 

 

L L LL L L L     r    rA   )#loggingr*   r   django.confr   django.core.exceptionsr   !django.db.backends.ddl_referencesr   r   r   r	   r
   r   django.db.backends.utilsr   r   r   django.db.modelsr   r   r   django.db.models.sqlr   django.db.transactionr   r   django.utilsr   	getLoggerr^   r   r.   r;   rA   rV   r    r   <module>r     s                       - - - - - -                S R R R R R R R R R < < < < < < < < < < & & & & & & D D D D D D D D ! ! ! ! ! !		6	7	71 1 1 
 
 

 
 
.j j j j j j j j j jr    