
    Vi                        S r SSKJr  SSKrSSKrSSKrSSK7  SSKJr  SSKJr  SSKJ	r	  SSKJ
r
  SS	KJr  SS
KJr  SSKJr  SSKJr  SSKJr  SSKJr  SSKJr   SSKJr   " S S\5      rS rS r " S S\5      r " S S\5      r " S S\5      r " S S\" SS5      5      r " S S \5      r " S! S"\5      rS# rg! \ a    Sr Nhf = f)$ah  
Lightweight schema migrations.

Example Usage
-------------

Instantiate a migrator:

    # Postgres example:
    my_db = PostgresqlDatabase(...)
    migrator = PostgresqlMigrator(my_db)

    # SQLite example:
    my_db = SqliteDatabase('my_database.db')
    migrator = SqliteMigrator(my_db)

Then you will use the `migrate` function to run various `Operation`s which
are generated by the migrator:

    migrate(
        migrator.add_column('some_table', 'column_name', CharField(default=''))
    )

Migrations are not run inside a transaction, so if you wish the migration to
run in a transaction you will need to wrap the call to `migrate` in a
transaction block, e.g.:

    with my_db.transaction():
        migrate(...)

Supported Operations
--------------------

Add new field(s) to an existing model:

    # Create your field instances. For non-null fields you must specify a
    # default value.
    pubdate_field = DateTimeField(null=True)
    comment_field = TextField(default='')

    # Run the migration, specifying the database table, field name and field.
    migrate(
        migrator.add_column('comment_tbl', 'pub_date', pubdate_field),
        migrator.add_column('comment_tbl', 'comment', comment_field),
    )

Renaming a field:

    # Specify the table, original name of the column, and its new name.
    migrate(
        migrator.rename_column('story', 'pub_date', 'publish_date'),
        migrator.rename_column('story', 'mod_date', 'modified_date'),
    )

Dropping a field:

    migrate(
        migrator.drop_column('story', 'some_old_field'),
    )

Making a field nullable or not nullable:

    # Note that when making a field not null that field must not have any
    # NULL values present.
    migrate(
        # Make `pub_date` allow NULL values.
        migrator.drop_not_null('story', 'pub_date'),

        # Prevent `modified_date` from containing NULL values.
        migrator.add_not_null('story', 'modified_date'),
    )

Renaming a table:

    migrate(
        migrator.rename_table('story', 'stories_tbl'),
    )

Adding an index:

    # Specify the table, column names, and whether the index should be
    # UNIQUE or not.
    migrate(
        # Create an index on the `pub_date` column.
        migrator.add_index('story', ('pub_date',), False),

        # Create a multi-column index on the `pub_date` and `status` fields.
        migrator.add_index('story', ('pub_date', 'status'), False),

        # Create a unique index on the category and title fields.
        migrator.add_index('story', ('category_id', 'title'), True),
    )

Dropping an index:

    # Specify the index name.
    migrate(migrator.drop_index('story', 'story_pub_date_status'))

Adding or dropping table constraints:

.. code-block:: python

    # Add a CHECK() constraint to enforce the price cannot be negative.
    migrate(migrator.add_constraint(
        'products',
        'price_check',
        Check('price >= 0')))

    # Remove the price check constraint.
    migrate(migrator.drop_constraint('products', 'price_check'))

    # Add a UNIQUE constraint on the first and last names.
    migrate(migrator.add_unique('person', 'first_name', 'last_name'))
    )
namedtupleN)*)CommaNodeList)EnclosedNodeList)Entity)
Expression)Node)NodeList)OP)	callable_)sort_models)sqlite3)_truncate_constraint_name)CockroachDatabasec                   0    \ rS rSrSrS rS rS rS rSr	g)		Operation   z/Encapsulate a single schema altering operation.c                 4    Xl         X l        X0l        X@l        g N)migratormethodargskwargs)selfr   r   r   r   s        d/home/james-whalen/.local/share/pipx/venvs/semgrep/lib/python3.13/site-packages/playhouse/migrate.py__init__Operation.__init__   s     	    c                 N    U R                   R                  R                  U5        g r   )r   databaseexecute)r   nodes     r   r!   Operation.execute   s    &&t,r   c                    [        U[        [        45      (       a  U R                  U5        g [        U[        5      (       a  UR                  5         g [        U[        [        45      (       a  U H  nU R                  U5        M     g g r   )	
isinstancer	   Contextr!   r   runlisttuple_handle_result)r   resultitems      r   r*   Operation._handle_result   sc    ftWo..LL 	**JJLu..##D)  /r   c                     U R                   R                  5       nSUS'   [        U R                  U R                  5      nU R                  U" U R                  0 UD65        g )NTwith_context)r   copygetattrr   r   r*   r   )r   r   r   s      r   r'   Operation.run   sN    !!#!%~4FDII889r   )r   r   r   r   N)
__name__
__module____qualname____firstlineno____doc__r   r!   r*   r'   __static_attributes__ r   r   r   r      s    9-*:r   r   c                 F   ^  [         R                  " T 5      U 4S j5       nU$ )Nc                    > UR                  SS5      nU(       a  T" U /UQ70 UD6$ [        U TR                  /UQ70 UD6$ )Nr/   F)popr   r3   )r   r   r   r/   fns       r   inneroperation.<locals>.inner   sF    zz.%8d,T,V,,r{{<T<V<<r   )	functoolswraps)r=   r>   s   ` r   	operationrB      s%    __R= =
 Lr   c                     SR                  U 4[        U5      -   5      n[        U5      S:  aB  [        R                  " UR                  S5      5      R                  5       nUS S < SUS S < 3nU$ )N_@   zutf-88      )joinr)   lenhashlibmd5encode	hexdigest)
table_namecolumns
index_name
index_hashs       r   make_index_namerR      se    :-%.89J
:[[!2!27!;<FFH
 *3BBQ@
r   c                   ~   \ rS rSrSrSrS rS r\S 5       r	\
S 5       rS rS r\
S	 5       r\
S
 5       r\
S 5       r\
S 5       rS r\
  SS j5       r\
S 5       r\
S 5       r\
SS j5       r\
S 5       r\
S 5       r\
S 5       r\
S 5       r\
S 5       r\
SS j5       r\
S 5       r\
S S j5       r\
S 5       rSr g)!SchemaMigrator   Fc                     Xl         g r   r    )r   r    s     r   r   SchemaMigrator.__init__   s     r   c                 6    U R                   R                  5       $ r   )r    get_sql_contextr   s    r   make_contextSchemaMigrator.make_context   s    }},,..r   c                 4   [         (       a   [        U[         5      (       a  [        U5      $ [        U[        5      (       a  [	        U5      $ [        U[
        5      (       a  [        U5      $ [        U[        5      (       a  [        U5      $ [        SU-  5      e)NzUnsupported database: %s)
r   r%   CockroachDBMigratorPostgresqlDatabasePostgresqlMigratorMySQLDatabaseMySQLMigratorSqliteDatabaseSqliteMigrator
ValueError)clsr    s     r   from_databaseSchemaMigrator.from_database   sz    H6G!H!H&x00"455%h//-00 **.11!(++3h>??r   c           	      R   UR                   n[        U5      (       a  U" 5       nU R                  5       R                  S5      R	                  [        U5      5      R                  S5      R	                  [        [        U5      [        R                  UR                  U5      SS95      $ )NzUPDATE z SET T)flat)
defaultr   r\   literalsqlr   r   r   EQdb_value)r   tablecolumn_namefieldrl   s        r   apply_defaultSchemaMigrator.apply_default   s    --WiG!!##VE]#!Z;'EENN7+	  		!r   c                 T    UR                  S5      R                  [        U5      5      $ )NALTER TABLE )rm   rn   r   )r   ctxrq   s      r   _alter_tableSchemaMigrator._alter_table   s     {{>*..ve}==r   c                 r    U R                  X5      R                  S5      R                  [        U5      5      $ )N ALTER COLUMN ry   rm   rn   r   r   rx   rq   columns       r   _alter_columnSchemaMigrator._alter_column   s-    c))*VF^$	&r   c                 \   U R                  5       nUR                  SsoSl        UR                  U:w  a  U=Ul        Ul        U R	                  XA5      R                  S5      R                  UR                  U5      5        XSl        [        U[        5      (       a  U R                  XC5        U$ )NTz ADD COLUMN )r\   nullrr   namery   rm   rn   ddlr%   ForeignKeyFieldadd_inline_fk_sql)r   rq   rr   rs   rx   
field_nulls         r   alter_add_columnSchemaMigrator.alter_add_column   s     !!&T
J +-88EJ*	
,s
"
'.
!
#eiin

e_--""3.
r   c                     U R                  U R                  5       U5      R                  S5      R                  [	        U5      5      R                  S5      R                  U5      $ )N ADD CONSTRAINT  ry   r\   rm   rn   r   r   rq   r   
constraints       r   add_constraintSchemaMigrator.add_constraint   sJ    d//159+,VD\"Z	"r   c                     SSR                  U5      -  n[        [        S5      [        U Vs/ s H  n[	        U5      PM     sn5      45      nU R                  XU5      $ s  snf )Nzuniq_%srD   UNIQUE)rH   r
   SQLr   r   r   )r   rq   column_namesconstraint_namer   r   s         r   
add_uniqueSchemaMigrator.add_unique  sc    #chh|&<<M<H<fVn<HIK L
 ""5:FF Is   A c                     U R                  U R                  5       U5      R                  S5      R                  [	        U5      5      $ )Nz DROP CONSTRAINT r   r   rq   r   s      r   drop_constraintSchemaMigrator.drop_constraint  s8    d//159,-VD\"	$r   c                    UR                  S5      R                  [        UR                  R                  R
                  5      5      R                  S5      R                  [        [        UR                  R                  5      45      5      nUR                  b  UR                  SUR                  -  5      nUR                  b  UR                  SUR                  -  5      nU$ )N REFERENCES r    ON DELETE %s ON UPDATE %s)rm   rn   r   	rel_model_metarN   r   	rel_fieldrr   	on_delete	on_updater   rx   rs   s      r   r    SchemaMigrator.add_inline_fk_sql  s    'F5??00;;<=$fU__-H-H&I%KLM	 	
 ??&++o?@C??&++o?@C
r   Nc                 z   U=(       d    SU< SU< SU< 3nU R                  5       R                  S5      R                  [        U5      5      R                  S5      R                  [        [	        U5      5      5      R                  S5      R                  [        [        U5      45      5      R                  S5      R                  [        U5      5      R                  S5      R                  [        U5      5      R                  S	5      n	Ub  U	R                  S
U-  5      n	Ub  U	R                  SU-  5      n	U	$ )Nfk_rD   _refs_rw   r   z FOREIGN KEY r    ()r   r   )r\   rm   rn   r   r   r   )
r   rq   rr   rel
rel_columnr   r   r   r   rx   s
             r   add_foreign_key_constraint)SchemaMigrator.add_foreign_key_constraint  s     % C Ce>I>A)C
 'F5M"*+F4Z@AB($f[&9%;<='F3K F:&' 	  ++o	9:C ++o	9:C
r   c           
      .   UR                   (       d  UR                  c  [        SU-  5      e[        U[        5      nU(       a  UR
                  (       d  [        S5      eU R                  XU5      /nUR                   (       d2  UR                  U R                  XU5      U R                  X5      /5        U(       a|  U R                  (       ak  UR                  U R                  UUUR                  R                  R                  UR
                  R                   UR"                  UR$                  5      5        UR&                  (       d  UR(                  (       a:  [+        USS 5      nUR                  U R-                  X4UR(                  U5      5        U$ )Nz!%s is not null but has no defaultz$Foreign keys must specify a `field`.
index_type)r   rl   rf   r%   r   r   r   extendrt   add_not_nullexplicit_create_foreign_keyappendr   r   r   rN   rr   r   r   indexuniquer1   	add_index)r   rq   rr   rs   is_foreign_key
operationsusings          r   
add_columnSchemaMigrator.add_column9  s?    zzemm3@;NOO#E?;%//CDD++EFG
 zz""5u=!!%57 8 d>>//OO))44OO//OOOO%& ;;%,,E<6EdnnUN-2\\5B C r   c                     [         er   NotImplementedError)r   rq   rr   s      r   drop_foreign_key_constraint*SchemaMigrator.drop_foreign_key_constraint`      !!r   c                    U R                  5       nU R                  XA5      R                  S5      R                  [	        U5      5        U(       a  UR                  S5        U R
                  R                  U5       Vs/ s H  nUR                  PM     nnX&;   a$  U R                  (       a  U R                  X5      U/$ U$ s  snf )N DROP COLUMN  CASCADE)
r\   ry   rm   rn   r   r    get_foreign_keysr   explicit_delete_foreign_keyr   )r   rq   rr   cascaderx   foreign_key
fk_columnss          r   drop_columnSchemaMigrator.drop_columnd  s    !			3	&
'/
"
#f[!
"KK
#  $}}==eDFD D 	 F $)I)I44UH#NN
Fs   >Cc                     U R                  U R                  5       U5      R                  S5      R                  [	        U5      5      R                  S5      R                  [	        U5      5      $ )N RENAME COLUMN  TO r   )r   rq   old_namenew_names       r   rename_columnSchemaMigrator.rename_columnv  sQ    d//159*+VH%&VH%&	(r   c                 `    U R                  U R                  5       X5      R                  S5      $ )Nz SET NOT NULLr   r\   rm   r   rq   r   s      r   r   SchemaMigrator.add_not_null  s)    t002EB)	+r   c                 `    U R                  U R                  5       X5      R                  S5      $ )Nz DROP NOT NULLr   r   s      r   drop_not_nullSchemaMigrator.drop_not_null  s*    t002EB)*	,r   c                    Uc  [        S5      e[        U5      (       a  U" 5       n[        U[        5      (       a!  UR	                  S5      (       a  [        U5      nU R                  U R                  5       U5      R                  S5      R                  [        U5      5      R                  S5      R                  U5      $ )N `default` must be not None/NULL.r   'r|   z SET DEFAULT )rf   r   r%   strendswithr   ry   r\   rm   rn   r   )r   rq   r   rl   s       r   add_column_default!SchemaMigrator.add_column_default  s    ??@@WiG gs##(8(8(D(D'lGd//159)*VF^$)W	r   c                     U R                  U R                  5       U5      R                  S5      R                  [	        U5      5      R                  S5      $ )Nr|   z DROP DEFAULTr   r   s      r   drop_column_default"SchemaMigrator.drop_column_default  sB    d//159)*VF^$)		+r   c                 *   U R                  5       nU R                  XQU5      R                  S5      R                  UR	                  U5      5      nUb@  [        U[        5      (       d  [        U5      nUR                  S5      R                  U5      nU$ )Nz TYPE z USING )r\   r   rm   rn   ddl_datatyper%   r	   r   r   rq   r   rs   castrx   s         r   alter_column_type SchemaMigrator.alter_column_type  s     !c&1!E&&s+, 	 dD))4y++i(,,T2C
r   c                     U R                  U R                  5       U5      R                  S5      R                  [	        U5      5      $ )Nz RENAME TO r   r   r   r   s      r   rename_tableSchemaMigrator.rename_table  s8    d//18<'VH%&	(r   c                     U R                  5       n[        X5      n[        U5      nU Vs/ s H  n[        UR                  U5      PM     n	n[        XgXUS9n
UR                  U
5      $ s  snf )N)r   r   )r\   rR   Tabler1   cIndexrn   )r   rq   rO   r   r   rx   rP   	table_objr   colsr   s              r   r   SchemaMigrator.add_index  sd    !$U4
%L	;BC7	V,7CjTNwwu~ Ds    A)c                 p    U R                  5       R                  S5      R                  [        U5      5      $ )NDROP INDEX r\   rm   rn   r   r   rq   rP   s      r   
drop_indexSchemaMigrator.drop_index  s*    'VJ'(	*r   rW   )NNN)Tr   )FN)!r3   r4   r5   r6   r   r   r   r\   classmethodrh   rB   rt   ry   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r8   r9   r   r   rT   rT      s   "'"'!/ 	@ 	@ ! !>&  ( " " G G $ $
 =A37 2 $ $L " "  " ( ( + +
 , ,
  " + +   ( (   * *r   rT   c                   H   ^  \ rS rSrS r\S 5       r\U 4S j5       rSrU =r	$ )ra   i  c                     SnU R                   R                  X!-  5      nUR                  5        Vs/ s H  oDS   PM	     sn$ s  snf )Nai  
            SELECT pg_attribute.attname
            FROM pg_index, pg_class, pg_attribute
            WHERE
                pg_class.oid = '%s'::regclass AND
                indrelid = pg_class.oid AND
                pg_attribute.attrelid = pg_class.oid AND
                pg_attribute.attnum = any(pg_index.indkey) AND
                indisprimary;
        r   )r    execute_sqlfetchall)r   tblquerycursorrows        r   _primary_key_columns'PostgresqlMigrator._primary_key_columns  sD    	 **5;7"(//"34"33A"3444s   Ac                 F    U R                  5       R                  SU-  5      $ )NzSET search_path TO %s)r\   rm   )r   schema_names     r   set_search_path"PostgresqlMigrator.set_search_path  s"    0;>?	Ar   c                 v  > U R                  U5      n[        [        U 5      nUR                  XSS9/n[	        U5      S:X  av  U< SUS   < S3nSnU R
                  R                  Xv45      n[        UR                  5       5      (       a-  U< SUS   < S3n	UR                  UR                  Xi5      5        U$ )NT)r/      rD   r   _seqz
                SELECT 1
                FROM information_schema.sequences
                WHERE LOWER(sequence_name) = LOWER(%s)
            )
r	  superra   r   rI   r    r  boolfetchoner   )r   r   r   pk_namesParentClassr   seq_namer  r  new_seq_name	__class__s             r   r   PostgresqlMigrator.rename_table  s    ,,X6.5 $$Xd$KM
 x=A&.<HE
 ]]..ukBFFOO%&&.6D!!+":":#, - r   r9   )
r3   r4   r5   r6   r	  rB   r  r   r8   __classcell__)r  s   @r   ra   ra     s2    5 A A
  r   ra   c                   .    \ rS rSrSrS r\S 5       rSrg)r_   i  Tc                     g r   r9   r   s      r   r   %CockroachDBMigrator.add_inline_fk_sql      r   c                     U R                  5       R                  S5      R                  [        U5      5      R                  S5      $ )Nr   r   r   r   s      r   r   CockroachDBMigrator.drop_index  s4    'VJ'($		&r   r9   N)	r3   r4   r5   r6   r   r   rB   r   r8   r9   r   r   r_   r_     s!    "& & &r   r_   c                   N    \ rS rSr\S 5       r\S 5       r\S 5       rSS jrSr	g)	MySQLColumni  c                      U R                   S:H  $ )NPRIpkr[   s    r   is_pkMySQLColumn.is_pk
      ww%r   c                      U R                   S:H  $ )NUNIr&  r[   s    r   	is_uniqueMySQLColumn.is_unique  r*  r   c                      U R                   S:H  $ )NYES)r   r[   s    r   is_nullMySQLColumn.is_null  s    yyE!!r   Nc                 "   Uc  U R                   nUc  U R                  n[        U5      [        U R                  5      /nU R
                  (       a  UR                  [        S5      5        U(       a  UR                  [        S5      5        OUR                  [        S5      5        U R                  (       a  UR                  [        S5      5        U R                  (       a$  UR                  [        U R                  5      5        [        U5      $ )Nr   NULLNOT NULLzPRIMARY KEY)
r1  r   r   r   
definitionr-  r   r(  extrar
   )r   rr   r1  partss       r   rn   MySQLColumn.sql  s    ?llG))K; " >>LLX'LLV%LLZ)::LL]+,::LLTZZ)r   r9   NN)
r3   r4   r5   r6   propertyr(  r-  r1  rn   r8   r9   r   r   r#  r#    sA            " "r   r#  _Column)r   r6  r   r'  rl   r7  c                       \ rS rSrSrSrS r\S 5       rS r	S r
\S 5       rS r\S	 5       r\S
 5       r\S 5       r\SS j5       r\S 5       rSrg)rc   i+  Tc                 r    U R                  X5      R                  S5      R                  [        U5      5      $ )N MODIFY r}   r~   s       r   r   MySQLMigrator._alter_column/  s,    c)$VF^$	&r   c                     U R                  5       R                  S5      R                  [        U5      5      R                  S5      R                  [        U5      5      $ )NzRENAME TABLE r   r   r   s      r   r   MySQLMigrator.rename_table5  sB    )VH%&VH%&	(r   c                     U R                   R                  SU-  5      nUR                  5       nU H  n[        U6 nUR                  U:X  d  M  Us  $    g)NzDESCRIBE `%s`;F)r    r  r  r#  r   )r   rq   rr   r  rowsr  r   s          r   _get_column_definition$MySQLMigrator._get_column_definition>  sR    **+;e+CD C #&F{{k)  r   c                     U R                   R                  SX45      nUR                  5       nU(       d  [        SU< SU< S35      eUS   $ )NzSELECT constraint_name FROM information_schema.key_column_usage WHERE table_schema = DATABASE() AND table_name = %s AND column_name = %s AND referenced_table_name IS NOT NULL AND referenced_column_name IS NOT NULL;z+Unable to find foreign key constraint for "z" on table "z".r   )r    r  r  AttributeError)r   rq   rr   r  r+   s        r   get_foreign_key_constraint(MySQLMigrator.get_foreign_key_constraintG  sW    **3  " " ).=> > ayr   c                     U R                  X5      nU R                  U R                  5       U5      R                  S5      R	                  [        U5      5      $ )Nz DROP FOREIGN KEY )rI  ry   r\   rm   rn   r   )r   rq   rr   fk_constraints       r   r   )MySQLMigrator.drop_foreign_key_constraintX  sI    77Kd//159-.VM*+	-r   c                     g r   r9   r   s      r   r   MySQLMigrator.add_inline_fk_sql`  r  r   c                    U R                  X5      nU R                  U R                  5       U5      R                  S5      R	                  UR	                  SS95      n[        S U R                  R                  U5       5       5      nX%;  a  U$ XR   nU R                  X5      UU R                  UUUR                  UR                  5      4$ )Nr?  Fr1  c              3   >   #    U  H  nUR                   U4v   M     g 7fr   r   .0fks     r   	<genexpr>-MySQLMigrator.add_not_null.<locals>.<genexpr>k        =; YYO;   )rE  ry   r\   rm   rn   dictr    r   r   r   
dest_tabledest_column)r   rq   r   
column_defr   
fk_objectsfk_metadatas          r   r   MySQLMigrator.add_not_nullc  s    00?
%d&7&7&95A ,Z^^E^:; 	
  =mm44U;= =
 # (00?//**++	-. 	.r   c                     U R                  X5      nUR                  (       a  [        S5      eU R                  U R	                  5       U5      R                  S5      R                  UR                  SS95      $ )NzPrimary keys can not be nullr?  TrQ  )rE  r(  rf   ry   r\   rm   rn   r   s      r   r   MySQLMigrator.drop_not_nullz  sa    ,,U;<<;<<d//159$VZZZ-.	0r   c                    [        S U R                  R                  U5       5       5      nX$;   nU R                  X5      nU R	                  U R                  5       U5      R                  S5      R                  [        U5      5      R                  S5      R                  UR                  US95      nU(       a>  XB   nU R                  X5      UU R                  UUUR                  UR                  5      /$ U$ )Nc              3   >   #    U  H  nUR                   U4v   M     g 7fr   rS  rT  s     r   rW  .MySQLMigrator.rename_column.<locals>.<genexpr>  rY  rZ  z CHANGE r   )rr   )r[  r    r   rE  ry   r\   rm   rn   r   r   r   r\  r]  )	r   rq   r   r   r_  r   r   
rename_ctxr`  s	            r   r   MySQLMigrator.rename_column  s     =mm44U;= =
 "/,,U=#|D$5$5$7?wz*s6(+,ws|s6::(:;< 	 $.K00A//**++	-  r   Nc                    Ub  [        S5      eU R                  5       nU R                  XQ5      R                  S5      R	                  [        U5      5      R                  S5      R	                  UR                  U5      5      $ )Nz5alter_column_type() does not support cast with MySQL.r?  r   )rf   r\   ry   rm   rn   r   r   r   s         r   r   MySQLMigrator.alter_column_type  sm     & ' '!c)$VF^$UYYs^$	&r   c                     U R                  5       R                  S5      R                  [        U5      5      R                  S5      R                  [        U5      5      $ )Nr   z ON r   r   s      r   r   MySQLMigrator.drop_index  sA    'VJ'(VE]#	%r   r9   r   )r3   r4   r5   r6   r   r   r   rB   r   rE  rI  r   r   r   r   r   r   r   r8   r9   r   r   rc   rc   +  s    "&"&& ( (" - - . ., 0 0  6 
& 
& % %r   rc   c                      \ rS rSrSr\R                  " S5      r\R                  " S5      r\R                  " S5      r	\R                  " S\R                  5      rS rS r\S	 5       rS
 r\SS j5       r\SS j5       r\S 5       r\S 5       r\S 5       r\S 5       r\SS j5       r\S 5       r\S 5       r\ SS j5       rSrg)re   i  z|
SQLite supports a subset of ALTER TABLE queries, view the docs for the
full details http://sqlite.org/lang_altertable.html
z(.+?)\((.+)\)z(?:[^,(]|\([^)]*\))+z["`']?([\w]+)z FOREIGN KEY\s+\("?([\w]+)"?\)\s+c                     U R                   R                  SU-  5      nUR                   Vs/ s H  o3S   PM	     sn$ s  snf )Nzselect * from "%s" limit 1r   )r    r  description)r   rq   resr,   s       r   _get_column_names SqliteMigrator._get_column_names  s:    mm''(Du(LM$'OO4ODQO444s   >c                 z    U R                   R                  SSUR                  5       /5      nUR                  5       $ )NzBselect name, sql from sqlite_master where type=? and LOWER(name)=?rq   )r    r  lowerr  )r   rq   rp  s      r   _get_create_table SqliteMigrator._get_create_table  s7    mm''.ekkm$& ||~r   c                 x	  ^ ^ [        S T R                  R                  U5       5       5      nUR                  5       U;  a  [	        SU< SU< S35      eT R                  U5      u  pT R                  R                  U5      nT R                  R                  U5        [        R                  " SSU5      nT R                  R                  U5      R                  5       u  pxT R                  R                  U5      n	U	 V
s/ s H  oR                  5       PM     nn
/ n/ n/ nSnU GH   nT R                   R#                  U5      R                  5       u  nUU:X  ar  U" UU5      nU(       a`  UR%                  U5        UR%                  U5        T R                   R#                  U5      R                  5       u  nUR%                  U5        M  M  UR%                  U5        UR                  5       R'                  U5      (       a  M  UR%                  U5        UR%                  U5        GM     [)        [+        X5      5      nUR-                  U5      mS nT(       d  S	 nOTU:w  a  UU 4S
 jn/ nU HZ  nT R.                  R#                  U5      nUb  UR                  5       S   U:X  a  U" U5      nU(       d  MI  UR%                  U5        M\     US-   n[        R0                  " SU-  [        R2                  5      nUR                  SU-  U5      nSR5                  U5      n[7        [9        S5      [;        U5      /5      [9        UR                  5       < SU< S35      /n[7        [9        S5      [;        U5      [=        U V
s/ s H  n
[;        U
5      PM     sn
5      [9        S5      [?        U V
s/ s H  n
[;        U
5      PM     sn
5      [9        S5      [;        U5      45      n[7        [9        S5      [;        U5      /5      nUUUT RA                  UU5      /-  n[C        S U5       H~  nUURD                  ;  a&  UR%                  [9        URF                  5      5        M9  T(       d  MB  T RI                  URF                  UT5      nUc  Md  UR%                  [9        U5      5        M     U$ s  sn
f s  sn
f s  sn
f )Nc              3   V   #    U  H  nUR                   R                  5       v   M!     g 7fr   )r   rt  )rU  r   s     r   rW  0SqliteMigrator._update_column.<locals>.<genexpr>  s(      F$D& kk''))$Ds   ')zColumn "z" does not exist on ""z\s+r   )zforeign zprimary zconstraint zcheck c                     U $ r   r9   r^  s    r   <lambda>/SqliteMigrator._update_column.<locals>.<lambda>  s    *r   c                     g r   r9   r|  s    r   r}  r~    s    dr   c                 B   > TR                   R                  ST-  U 5      $ )NzFOREIGN KEY ("%s") )fk_resub)r^  
new_columnr   s    r   r}  r~  
  s    djjnn%
2/r   r   __tmp__z
("?)%s("?)z\1%s\2, zDROP TABLE IF EXISTSr   r   zINSERT INTOSELECTFROMz
DROP TABLEc                     U R                   $ r   )rn   )idxs    r   r}  r~  6  s    r   )%setr    get_columnsrt  rf   ru  get_indexesr   rer  	column_researchgroupscolumn_split_refindallstripcolumn_name_rematchr   
startswithr[  zipgetr  compileIrH   r
   r   r   r   r   r   filterrO   rn   
_fix_index) r   rq   column_to_updater=   rO   create_tableindexes
raw_createraw_columnssplit_columnscolcolumn_defsnew_column_defsnew_column_namesoriginal_column_namesconstraint_termsr^  rr   new_column_deforiginal_to_newfk_filter_fncleaned_columnsr  
temp_tablergxcreatequeriespopulate_tabledrop_originalr   rn   r  s    `                              @r   _update_columnSqliteMigrator._update_column  s:    F$(MM$=$=e$DF F!!#72.7 8 8 #44U; --++E2 	&&u- vvfc<8 #'.."7"7"E"L"L"N
 ,,44[A.;<msyy{m< "L%J..44Z@GGILK..!#K!<!#**>:)00=#'#6#6#<#<&$((. !K$++K8 "  &&z2 "'')445EFF$++K8)00=# &( s#8KL$(()9:
42L++L )JJJ$$Z0E U\\^A%6:J%J)*5
z&&z2 * Y&
jj-rtt4#
 ))O,c016*3EFGV\\^W568
 ":5EF5EcfSk5EFGM2GH2G36#;2GHIK5M#  !#l"3VE]!CD 	j%02 	2 /9Eu}}4s599~.ooeii1A:N?NN3s8, : q =B GHs   R-R20R7c                 `   UR                  U5      n[        U5      S:X  a  UR                  X#5      $ UR                  SS5      u  pV[        UR                  U5      5      S:X  a  U< SUR                  X#5      < 3$ UR                  SS5      S   R                  S5      nU Vs/ s H  owR	                  S5      PM     nn/ n	U HC  n
[
        R                  " SU-  U
5      (       a  X:[        U5      S  -   n
U	R                  U
5        ME     U< SS	R                  S
 U	 5       5      < S3$ s  snf )N   (r  r   r   ,z"`[]' z%s(?:[\'"`\]]?\s|$)r  c              3   ,   #    U  H
  nS U-  v   M     g7f)z"%s"Nr9   )rU  r   s     r   rW  ,SqliteMigrator._fix_index.<locals>.<genexpr>]  s     )De&1*es   )	splitrI   replacersplitr  r  r  r   rH   )r   rn   r  r  r8  lhsrhspartrO   cleanr   s              r   r  SqliteMigrator._fix_index@  s    		*+u:?;;/<< ::c1% syy)*+q0!3;;/?#LMM 

3"1%++C05:;UT::i(U;
 Fxx.1AA6JJ#S1A-B-C&DDLL  
 		)De)D DEE <s   $D+c                     [         R                  S:  aQ  U(       dJ  U R                  5       nU R                  XQ5      R	                  S5      R                  [        U5      5        U$ U R                  XS 5      $ )N)   #   r   r   c                     g r   r9   )abs     r   r}  ,SqliteMigrator.drop_column.<locals>.<lambda>g  s    Dr   )r   sqlite_version_infor\   ry   rm   rn   r   r  )r   rq   rr   r   legacyrx   s         r   r   SqliteMigrator.drop_column_  s`    &&*4V##%Cs*go&c&%&J""57HIIr   c                 F  ^ [         R                  S:  au  U(       dn  U R                  U R                  5       U5      R	                  S5      R                  [        U5      5      R	                  S5      R                  [        T5      5      $ U4S jnU R                  XU5      $ )N)r     r   r   r   c                 (   > UR                  U T5      $ r   r  )rr   r^  r   s     r   _rename-SqliteMigrator.rename_column.<locals>._renamer  s    %%k8<<r   )r   r  ry   r\   rm   rn   r   r  )r   rq   r   r   r  r  s      `  r   r   SqliteMigrator.rename_columni  sz    &&*4V!\$"3"3"5u=W./S)*WV_S)*,	=""5G<<r   c                 ,    S nU R                  XU5      $ )Nc                     US-   $ )Nz	 NOT NULLr9   rr   r^  s     r   _add_not_null2SqliteMigrator.add_not_null.<locals>._add_not_nullx  s    ++r   r  )r   rq   r   r  s       r   r   SqliteMigrator.add_not_nullv  s    	,""5-@@r   c                 ,    S nU R                  XU5      $ )Nc                 &    UR                  SS5      $ )Nr5   r  r  s     r   _drop_not_null4SqliteMigrator.drop_not_null.<locals>._drop_not_null~  s    %%j"55r   r  )r   rq   r   r  s       r   r   SqliteMigrator.drop_not_null|  s    	6""5.AAr   c                   ^ Tc  [        S5      e[        T5      (       a  T" 5       m[        T[        5      (       a0  TR	                  S5      (       d  TR                  5       (       d  ST-  mU4S jnU R                  XU5      $ )Nr   r   z'%s'c                    > UST-  -   $ )Nz DEFAULT %sr9   )rr   r^  rl   s     r   _add_default7SqliteMigrator.add_column_default.<locals>._add_default  s     777r   )rf   r   r%   r   r   isdigitr  )r   rq   r   rl   r  s      ` r   r   !SqliteMigrator.add_column_default  st    ??@@WiGw$$W-=-=j-I-IOO%%w&G	8 ""5,??r   c                 ,    S nU R                  XU5      $ )Nc                 l    [         R                  " SSU[         R                  S9nUR                  5       $ )NzDEFAULT\s+[\w"\'\(\)]+(\s|$)r  )flags)r  r  r  r  )rr   r^  r  s      r   _drop_default9SqliteMigrator.drop_column_default.<locals>._drop_default  s*    &&8"jPRPTPTUC99;r   r  )r   rq   r   r  s       r   r   "SqliteMigrator.drop_column_default  s    	 ""5-@@r   Nc                 z   ^^^ Ub  [        S5      eU R                  5       mUUU4S jnU R                  UTU5      $ )Nz6alter_column_type() does not support cast with Sqlite.c                    > TR                  T5      nTR                  [        T5      5      R                  U5      R                  5       u  p4U$ r   )r   rn   r   r  )rr   r^  	node_listrn   rD   r   rx   rs   s        r   _alter_column_type<SqliteMigrator.alter_column_type.<locals>._alter_column_type  s=    		#IWWVF^,00;AACFCJr   )rf   r\   r  )r   rq   r   rs   r   r  rx   s     ``  @r   r    SqliteMigrator.alter_column_type  sF     ' ( (!	 ""5&2DEEr   c                     [         er   r   r   s       r   r   SqliteMigrator.add_constraint  r   r   c                     [         er   r   r   s      r   r   SqliteMigrator.drop_constraint  r   r   c                     [         er   r   )r   rq   rr   rs   r   r   s         r   r   )SqliteMigrator.add_foreign_key_constraint  s
     "!r   r9   )TF)Fr   r:  )r3   r4   r5   r6   r7   r  r  r  r  r  r  r  rq  ru  rB   r  r  r   r   r   r   r   r   r   r   r   r   r8   r9   r   r   re   re     sI    

+,Ijj!89OZZ 45NJJ:BDDAE5 q qfF> J J 
= 
= A A
 B B
 @ @ A A 	F 	F " " " " =A" "r   re   c                  6    U  H  nUR                  5         M     g r   )r'   )r   r   rB   s      r   migrater    s    	  r   ) r7   collectionsr   r@   rJ   r  peeweer   r   r   r   r	   r
   r   r   r   r   r   playhouse.cockroachdbr   ImportErrorobjectr   rB   rR   rT   ra   r_   r#  rc   re   r  r9   r   r   <module>r      s   qd #   	    #         ,7
: :6Q*V Q*h+ +\&, & *Y )= >  FI%N I%Xw"^ w"tW  s   C CC