
    Jin*                      S SK Jr  S SKrS SKJr  S SKJr  S SKJr  S SKJ	r	J
r
JrJr  S SKJrJrJrJr  S SKJrJrJrJrJrJrJrJrJrJrJrJrJr  S S	K J!r!J"r"J#r#J$r$J%r%J&r&J'r'J(r(  \	(       a  \RR                  S
:  a  S SKJ*r*  OS SK+J*r*  Sr,Sr-\" SSS9r. " S S\5      r/ " S S\/5      r0 " S S5      r1 " S S\15      r2 " S S\/5      r3S4S jr4 " S S5      r5S5S jr6 " S S 5      r7\3r8 " S! S"5      r9 " S# S$\/\5      r: " S% S\/\5      r; " S& S'\\.   5      r< " S( S)5      r= " S* S+\=5      r> " S, S-\=5      r? " S. S/5      r@ " S0 S15      rA " S2 S35      rBg)6    )annotationsN)Sequence)copy)reduce)TYPE_CHECKINGAnyGenericTypeVar)DialectsJoinTypeReferenceOptionSetOperation)ArithmeticExpression	CriterionEmptyCriterionFieldFunctionIndexNodePeriodCriterionRollupStarTermTupleValueWrapper)JoinExceptionQueryExceptionRollupExceptionSetOperationExceptionbuilderformat_alias_sqlformat_quotesignore_copy)      )SelfzTimothy Heysztheys@kayak.comQBQueryBuilder)boundc                      \ rS rSrSS jr\SS j5       rSS jr\SS j5       r	\
SS j5       r\
SS j5       rSS jrS	rg
)
Selectable1   c                    Xl         g Naliasselfr0   s     P/var/www/html/dynamic-report/venv/lib/python3.13/site-packages/pypika/queries.py__init__Selectable.__init__2   s    
    c                    Xl         g r.   r/   r1   s     r3   as_Selectable.as_5   s    
r6   c                    [        XS9$ )Ntable)r   r2   names     r3   fieldSelectable.field9   s    T&&r6   c                    [        U 5      $ r.   )r   r2   s    r3   starSelectable.star<   s    Dzr6   c                $    U R                  U5      $ r.   r?   r=   s     r3   __getattr__Selectable.__getattr__@       zz$r6   c                $    U R                  U5      $ r.   rF   r=   s     r3   __getitem__Selectable.__getitem__D   rI   r6   c                    U R                   $ r.   r/   rB   s    r3   get_table_nameSelectable.get_table_nameH   s    zzr6   r/   N)r0   strreturnNone)r>   rP   rQ   r   )rQ   r   rQ   rP   )__name__
__module____qualname____firstlineno__r4   r    r8   r?   propertyrC   r#   rG   rK   rN   __static_attributes__ r6   r3   r+   r+   1   sa      '          r6   r+   c                  N   ^  \ rS rSrSSU 4S jjjrS	S jrS
S jrSS jrSrU =r	$ )AliasedQueryL   c                8   > [         TU ]  US9  Xl        X l        g )Nr/   )superr4   r>   query)r2   r>   r`   	__class__s      r3   r4   AliasedQuery.__init__M   s    t$	
r6   c                l    U R                   c  U R                  $ U R                   R                  " S0 UD6$ NrZ   )r`   r>   get_sqlr2   kwargss     r3   re   AliasedQuery.get_sqlR   s.    ::99zz!!+F++r6   c                b    [        U[        5      =(       a    U R                  UR                  :H  $ r.   )
isinstancer\   r>   r2   others     r3   __eq__AliasedQuery.__eq__W   s!    %.J499

3JJr6   c                >    [        [        U R                  5      5      $ r.   )hashrP   r>   rB   s    r3   __hash__AliasedQuery.__hash__Z   s    C		N##r6   )r>   r`   r.   )r>   rP   r`   zSelectable | NonerQ   rR   rg   r   rQ   rP   )rl   r\   rQ   boolrQ   int)
rT   rU   rV   rW   r4   re   rm   rq   rY   __classcell__ra   s   @r3   r\   r\   L   s"     
,
K$ $r6   r\   c                  X    \ rS rSrS	S
S jjrSS jrSS jr\SS j5       rS	SS jjr	Sr
g)Schema^   Nc                    Xl         X l        g r.   _name_parent)r2   r>   parents      r3   r4   Schema.__init___   s    
r6   c                    [        U[        5      =(       a9    U R                  UR                  :H  =(       a    U R                  UR                  :H  $ r.   )rj   rz   r~   r   rk   s     r3   rm   Schema.__eq__c   s6    %(hTZZ5;;-Fh4<<[`[h[hKhhr6   c                .    U R                  U5      (       + $ r.   rm   rk   s     r3   __ne__Schema.__ne__f       ;;u%%%r6   c                    [        XS9$ )NschemaTabler2   items     r3   rG   Schema.__getattr__i   s    T''r6   c                    [        U R                  U5      nU R                  b,  SR                  U R                  R                  " SSU0UD6US9$ U$ )Nz{parent}.{schema}
quote_char)r   r   rZ   )r"   r~   r   formatre   )r2   r   rg   
schema_sqls       r3   re   Schema.get_sqlm   sY    "4::z:
<<#&--||++LzLVL! .  
 r6   r}   r.   )r>   rP   r   zSchema | NonerQ   rR   )rl   rz   rQ   rt   )r   rP   rQ   r   r   
str | Nonerg   r   rQ   rP   )rT   rU   rV   rW   r4   rm   r   r#   rG   re   rY   rZ   r6   r3   rz   rz   ^   s0    i& ( (	 	r6   rz   c                  (    \ rS rSr\SS j5       rSrg)Databasey   c                    [        XS9$ N)r   rz   r   s     r3   rG   Database.__getattr__z   s    d((r6   rZ   N)r   rP   rQ   rz   )rT   rU   rV   rW   r#   rG   rY   rZ   r6   r3   r   r   y   s    ) )r6   r   c                     ^  \ rS rSr\SS j5       r   S         SU 4S jjjrSS jrSS jr\	SS j5       r
\	SS j5       rSS jrSS	 jrSS
 jrSS jrSS jrSS jrSS jrSS jrSrU =r$ )r      c                    [        U [        5      (       a  U $ [        U [        [        45      (       a  [	        S U SS  [        U S   5      5      $ U b  [        U 5      $ g )Nc                    [        XS9$ r   r   )objss     r3   <lambda>$Table._init_schema.<locals>.<lambda>   s	    )>r6      r   )rj   rz   listtupler   r   s    r3   _init_schemaTable._init_schema   s\     ff%%MftUm,,>qr
FSYZ[S\L]^^&>!r6   c                   > [         TU ]  U5        Xl        U R                  U5      U l        U=(       d    [
        U l        S U l        S U l        [        U R                  [
        5      (       d  [        S5      eg )Nz,Expected 'query_cls' to be subclass of Query)r_   r4   _table_namer   _schemaQuery
_query_cls_for_for_portion
issubclass	TypeError)r2   r>   r   r0   	query_clsra   s        r3   r4   Table.__init__   sg     	((0#,u	 $//511JKK 2r6   c                @    U R                   =(       d    U R                  $ r.   )r0   r   rB   s    r3   rN   Table.get_table_name   s    zz-T---r6   c                   UR                  S5      n[        U R                  U5      nU R                  b*  SR	                  U R                  R
                  " S0 UD6US9nU R                  (       a*  SR	                  X0R                  R
                  " S0 UD6S9nO:U R                  (       a)  SR	                  X0R                  R
                  " S0 UD6S9n[        X0R                  40 UD6$ )Nr   z{schema}.{table})r   r<   z{table} FOR {criterion})r<   	criterionz"{table} FOR PORTION OF {criterion}rZ   )
getr"   r   r   r   re   r   r   r!   r0   )r2   rg   r   	table_sqls       r3   re   Table.get_sql   s    ZZ-
!$"2"2J?	<<#*119M9M9WPV9W_h1iI99188yT]T]TeTeTohnTo8pI<CC+<+<+D+D+Nv+N D I  	::@@@r6   c                    U R                   (       a  [        S5      eU R                  (       a  [        S5      eXl         g )N)'Query' object already has attribute for_0'Query' object already has attribute for_portion)r   AttributeErrorr   )r2   temporal_criterions     r3   for_
Table.for_   s/    99 !LMM !STT&	r6   c                    U R                   (       a  [        S5      eU R                  (       a  [        S5      eXl         g )Nr   r   )r   r   r   )r2   period_criterions     r3   for_portionTable.for_portion   s0     !STT99 !LMM,r6   c                     U R                  SS9$ N"r   re   rB   s    r3   __str__Table.__str__       ||s|++r6   c                    [        U[        5      (       d  gU R                  UR                  :w  a  gU R                  UR                  :w  a  gU R                  UR                  :w  a  ggNFT)rj   r   r   r   r0   rk   s     r3   rm   Table.__eq__   sR    %''u000<<5==(::$r6   c                    U R                   (       a&  SR                  U R                  U R                   5      $ SR                  U R                  5      $ )NzTable('{}', schema='{}')zTable('{}'))r   r   r   rB   s    r3   __repr__Table.__repr__   s=    <<-44T5E5Et||TT##D$4$455r6   c                .    U R                  U5      (       + $ r.   r   rk   s     r3   r   Table.__ne__   r   r6   c                *    [        [        U 5      5      $ r.   )rp   rP   rB   s    r3   rq   Table.__hash__   s    CIr6   c                R    U R                   R                  U 5      R                  " U6 $ )z
Perform a SELECT operation on the current table

:param terms:
    Type:  list[expression]

    A list of terms to select. These can be any type of int, float, str, bool or Term or a Field.

:return:  QueryBuilder
)r   from_selectr2   termss     r3   r   Table.select   s$     $$T*11599r6   c                8    U R                   R                  U 5      $ )zI
Perform an UPDATE operation on the current table

:return: QueryBuilder
)r   updaterB   s    r3   r   Table.update   s     %%d++r6   c                R    U R                   R                  U 5      R                  " U6 $ )z
Perform an INSERT operation on the current table

:param terms:
    Type: list[expression]

    A list of terms to select. These can be any type of int, float, str, bool or  any other valid data

:return: QueryBuilder
)r   intoinsertr   s     r3   r   Table.insert   s$     ##D)00%88r6   )r   r   r   r   r   )r   "str | list | tuple | Schema | NonerQ   r   NNN)
r>   rP   r   zSchema | str | Noner0   r   r   ztype[Query] | NonerQ   rR   rS   rs   )r   r   rQ   rR   )r   r   rQ   rR   )rQ   rt   )rl   r   rQ   rt   ru   )r   z'int | float | str | bool | Term | FieldrQ   r(   rQ   r(   )rT   rU   rV   rW   staticmethodr   r4   rN   re   r    r   r   r   rm   r   r   rq   r   r   r   rY   rw   rx   s   @r3   r   r      s    	 	 '+ (,LL $L 	L
 &L 
L L .A  ' ' - -,6
&:,9 9r6   r   c            	     :   / nU  H  n[        U[        5      (       a@  [        U5      S:X  a1  [        US   US   UR	                  S5      UR	                  S5      S9nO)[        UUR	                  S5      UR	                  S5      S9nUR                  U5        M     U$ )z
Shortcut to create many tables. If `names` param is a tuple, the first
position will refer to the `_table_name` while the second will be its `alias`.
Any other data structure will be treated as a whole as the `_table_name`.
   r   r   r   r   )r>   r0   r   r   )r>   r   r   )rj   r   lenr   r   append)namesrg   tablesr>   ts        r3   make_tablesr      s     FdE""s4yA~!W1gzz(+ **[1	A zz(+ **[1A
 	a  Mr6   c                  \    \ rS rSrSr   S	         S
S jjrSS jrSS jrSS jrSr	g)Columni  zRepresents a column.Nc                    Xl         X l        X0l        Ub  [        U[        5      (       a  X@l        g [        U5      U l        g r.   )r>   typenullablerj   r   r   default)r2   column_namecolumn_typer   r   s        r3   r4   Column.__init__  s5      		 ")/Z5N5NwT`ahTir6   c                n    UR                  S5      nSR                  [        U R                  U5      S9nU$ )Nr   z{name})r>   )r   r   r"   r>   )r2   rg   r   
column_sqls       r3   get_name_sqlColumn.get_name_sql'  s9    ZZ-
__tyy*5 % 

 r6   c                   SR                  U R                  " S0 UD6U R                  (       a  SR                  U R                  5      OSU R                  b$  SR                  U R                  (       a  SOS5      OSU R                  (       a.  SR                  SU R                  R
                  " S0 UD6-   5      OSS9nU$ )	Nz{name}{type}{nullable}{default}z {} NULLzNOT NULLzDEFAULT )r>   r   r   r   rZ   )r   r   r   r   r   re   )r2   rg   r   s      r3   re   Column.get_sql0  s    6=="",V,,0IIdii(2NRmmNgU\\DMM&zJmoQUQ]Q]ELLdll.B.B.LV.L!LMce	 > 

 r6   c                     U R                  SS9$ r   r   rB   s    r3   r   Column.__str__:  r   r6   )r   r>   r   r   r   )
r   rP   r   r   r   zbool | Noner   zAny | Term | NonerQ   rR   rs   rS   )
rT   rU   rV   rW   __doc__r4   r   re   r   rY   rZ   r6   r3   r   r     sZ    
 #' $%)
j
j  
j 	
j
 #
j 

j,r6   r   c                     / nU  HR  n[        U[        5      (       a   [        U5      S:X  a  [        US   US   S9nO	[        US9nUR	                  U5        MT     U$ )z
Shortcut to create many columns. If `names` param is a tuple, the first
position will refer to the `name` while the second will be its `type`.
Any other data structure will be treated as a whole as the `name`.
r   r   r   r   r   )r   )rj   r   r   r   r   )r   columnsr>   columns       r3   make_columnsr  >  s[     GdE""s4yA~QT!WEF-Fv  Nr6   c                  (    \ rS rSrSS jrSS jrSrg)	PeriodForiO  c                    Xl         [        U[        5      (       a  UO
[        U5      U l        [        U[        5      (       a  X0l        g [        U5      U l        g r.   )r>   rj   r   start_column
end_columnr2   r>   r  r  s       r3   r4   PeriodFor.__init__P  sA    	,6|V,L,LLRXYeRf(2:v(F(F*FS]L^r6   c           	         UR                  S5      nSR                  [        U R                  U5      U R                  R
                  " S0 UD6U R                  R
                  " S0 UD6S9nU$ )Nr   z9PERIOD FOR {name} ({start_column_name},{end_column_name}))r>   start_column_nameend_column_namerZ   )r   r   r"   r>   r  r   r  )r2   rg   r   period_for_sqls       r3   re   PeriodFor.get_sqlU  sh    ZZ-
T[[tyy*5"//<<FvF OO88B6B \ 
 r6   )r  r>   r  N)r>   rP   r  str | Columnr  r  rQ   rR   rs   )rT   rU   rV   rW   r4   re   rY   rZ   r6   r3   r  r  O  s    _
	r6   r  c                  D   \ rS rSrSr\SS j5       r\SS j5       r\SS j5       r\SS j5       r	\SS j5       r
\SS j5       r\SS	 j5       r\SS
 j5       r\SS j5       r\SS j5       r\SS j5       r\SS j5       r\S S j5       r\S!S j5       r\S"S j5       rSrg)#r   ie  a=  
Query is the primary class and entry point in pypika. It is used to build queries iteratively using the builder
design
pattern.

This class is immutable.

Examples
--------
Simple query

.. code-block:: python

    from pypika import Query, Field
    q = Query.from_('customers').select('*').where(Field("id") == 1)
c                    [        S0 UD6$ rd   )r(   )clsrg   s     r3   _builderQuery._builderw  s    %f%%r6   c                D    U R                   " S0 UD6R                  U5      $ )a  
Query builder entry point.  Initializes query building and sets the table to select from.  When using this
function, the query becomes a SELECT query.

:param table:
    Type: Table or str

    An instance of a Table object or a string table name.

:return: QueryBuilder
rZ   )r  r   r  r<   rg   s      r3   r   Query.from_{  s!     ||%f%++E22r6   c                4    [        5       R                  U5      $ )a   
Query builder entry point. Initializes query building and sets the table name to be created. When using this
function, the query becomes a CREATE statement.

:param table: An instance of a Table object or a string table name.

:return: CreateQueryBuilder
)CreateQueryBuildercreate_tabler  r<   s     r3   r$  Query.create_table  s     "#0077r6   c                4    [        5       R                  U5      $ )z
Query builder entry point. Initializes query building and sets the index name to be created. When using this
function, the query becomes a CREATE statement.
)CreateIndexBuildercreate_indexr  indexs     r3   r)  Query.create_index  s     "#0077r6   c                4    [        5       R                  U5      $ )a  
Query builder entry point. Initializes query building and sets the table name to be dropped. When using this
function, the query becomes a DROP statement.

:param database: An instance of a Database object or a string database name.

:return: DropQueryBuilder
)DropQueryBuilderdrop_database)r  databases     r3   r/  Query.drop_database  s      !//99r6   c                4    [        5       R                  U5      $ )z
Query builder entry point. Initializes query building and sets the table name to be dropped. When using this
function, the query becomes a DROP statement.

:param table: An instance of a Table object or a string table name.

:return: DropQueryBuilder
)r.  
drop_tabler%  s     r3   r3  Query.drop_table  s      !,,U33r6   c                4    [        5       R                  U5      $ )z
Query builder entry point. Initializes query building and sets the table name to be dropped. When using this
function, the query becomes a DROP statement.

:param user: String user name.

:return: DropQueryBuilder
)r.  	drop_user)r  users     r3   r6  Query.drop_user        !++D11r6   c                4    [        5       R                  U5      $ )z
Query builder entry point. Initializes query building and sets the table name to be dropped. When using this
function, the query becomes a DROP statement.

:param view: String view name.

:return: DropQueryBuilder
)r.  	drop_view)r  views     r3   r;  Query.drop_view  r9  r6   c                4    [        5       R                  U5      $ )z
Query builder entry point. Initializes query building and sets the index name to be dropped. When using this
function, the query becomes a DROP statement.
)r.  
drop_indexr*  s     r3   r?  Query.drop_index  s      !,,U33r6   c                D    U R                   " S0 UD6R                  U5      $ )a  
Query builder entry point.  Initializes query building and sets the table to insert into.  When using this
function, the query becomes an INSERT query.

:param table:
    Type: Table or str

    An instance of a Table object or a string table name.

:return QueryBuilder
rZ   )r  r   r   s      r3   r   
Query.into  s!     ||%f%**511r6   c                D    U R                   " S0 UD6R                  X5      $ rd   )r  with_)r  r<   r>   rg   s       r3   rD  Query.with_  s    ||%f%++E88r6   c                @    U R                   " S0 UD6R                  " U6 $ )al  
Query builder entry point.  Initializes query building without a table and selects fields.  Useful when testing
SQL functions.

:param terms:
    Type: list[expression]

    A list of terms to select.  These can be any type of int, float, str, bool, or Term.  They cannot be a Field
    unless the function ``Query.from_`` is called first.

:return: QueryBuilder
rZ   )r  r   )r  r   rg   s      r3   r   Query.select  s!     ||%f%,,e44r6   c                D    U R                   " S0 UD6R                  U5      $ )a  
Query builder entry point.  Initializes query building and sets the table to update.  When using this
function, the query becomes an UPDATE query.

:param table:
    Type: Table or str

    An instance of a Table object or a string table name.

:return: QueryBuilder
rZ   )r  r   r   s      r3   r   Query.update  s!     ||%f%,,U33r6   c                "    XS'   [        U40 UD6$ )z
Convenience method for creating a Table that uses this Query class.

:param table_name:
    Type: str

    A string table name.

:return: Table
r   r   )r  
table_namerg   s      r3   r   Query.Table  s     "{Z*6**r6   c                     XS'   [        U0 UD6$ )z
Convenience method for creating many tables that uses this Query class.
See ``Query.make_tables`` for details.

:param names:
    Type: list[str or tuple]

    A list of string table names, or name and alias tuples.

:return: Table
r   )r   )r  r   rg   s      r3   TablesQuery.Tables  s     "{E,V,,r6   rZ   N)rg   r   rQ   r(   )r<   zSelectable | strrg   r   rQ   r(   )r<   str | TablerQ   r#  )r+  str | IndexrQ   r(  )r0  zDatabase | TablerQ   r.  )r<   rP  rQ   r.  )r7  rP   rQ   r.  )r<  rP   rQ   r.  )r+  rQ  rQ   r.  )r<   Table | strrg   r   rQ   r(   )r<   zstr | Selectabler>   rP   rg   r   rQ   r(   )r   zint | float | str | bool | Termrg   r   rQ   r(   )r<   rP  rQ   r(   )rK  rP   rQ   _TableClass)r   tuple[str, str] | strrg   r   rQ   zlist[_TableClass])rT   rU   rV   rW   r  classmethodr  r   r$  r)  r/  r3  r6  r;  r?  r   rD  r   r   r   rN  rY   rZ   r6   r3   r   r   e  s3   " & & 3 3 	8 	8 8 8 	: 	: 	4 	4 	2 	2 	2 	2 4 4 2 2 9 9 5 5 4 4 + + - -r6   r   c                  B  ^  \ rS rSrSrS\4         SU 4S jjjr\SS j5       r\SS j5       r	\SS j5       r
\SS j5       r\SS	 j5       r\SS
 j5       r\SS j5       r\SS j5       rSS jrSS jrSS jrSS jrSSS jjrS S!S jjrSS jrSS jrSrU =r$ )"_SetOperationi(  a  
A Query class wrapper for a all set operations, Union DISTINCT or ALL, Intersect, Except or Minus

Created via the functions `Query.union`,`Query.union_all`,`Query.intersect`, `Query.except_of`,`Query.minus`.

This class should not be instantiated directly.
Nc                x   > [         TU ]  U5        Xl        X24/U l        / U l        S U l        S U l        XPl        g r.   )r_   r4   
base_query_set_operation	_orderbys_limit_offset_wrapper_cls)r2   rY  set_operation_queryset_operationr0   wrapper_clsra   s         r3   r4   _SetOperation.__init__1  s@     	$ -CD'r6   c                   U H~  n[        U[        5      (       a   [        X0R                  R                  S   S9OU R                  R                  U5      nU R                  R                  X2R                  S5      45        M     g Nr   r;   order)	rj   rP   r   rY  _fromwrap_constantr[  r   r   r2   fieldsrg   r?   s       r3   orderby_SetOperation.orderbyC  sk    E eS)) e??#8#8#;<__2259  NN!!5**W*=">? r6   c                    Xl         g r.   r\  r2   limits     r3   ro  _SetOperation.limitN      r6   c                    Xl         g r.   r]  r2   offsets     r3   ru  _SetOperation.offsetR      r6   c                Z    U R                   R                  [        R                  U45        g r.   )rZ  r   r   unionrk   s     r3   ry  _SetOperation.unionV  !    ""L$6$6#>?r6   c                Z    U R                   R                  [        R                  U45        g r.   )rZ  r   r   	union_allrk   s     r3   r}  _SetOperation.union_allZ  !    ""L$:$:E#BCr6   c                Z    U R                   R                  [        R                  U45        g r.   )rZ  r   r   	intersectrk   s     r3   r  _SetOperation.intersect^  r  r6   c                Z    U R                   R                  [        R                  U45        g r.   )rZ  r   r   	except_ofrk   s     r3   r  _SetOperation.except_ofb  r  r6   c                Z    U R                   R                  [        R                  U45        g r.   )rZ  r   r   minusrk   s     r3   r  _SetOperation.minusf  r{  r6   c                $    U R                  U5      $ r.   ry  rk   s     r3   __add___SetOperation.__add__j      zz%  r6   c                $    U R                  U5      $ r.   r}  rk   s     r3   __mul___SetOperation.__mul__m      ~~e$$r6   c                $    U R                  U5      $ r.   r  rk   s     r3   __sub___SetOperation.__sub__p  r  r6   c                "    U R                  5       $ r.   r   rB   s    r3   r   _SetOperation.__str__s      ||~r6   c                   SnUR                  SU R                  R                  5        UR                  SU R                  R                  5        U R                  R                  " S
SU R                  R
                  0UD6nUnU R                   H  u  pxUR                  " S
SU R                  R
                  0UD6n	[        U R                  R                  5      [        UR                  5      :w  a  [        SR                  XYS95      eXdR                  UR                  U	S9-  nM     U R                  (       a  X`R                  " S
0 UD6-  nU R                  b  X`R                  5       -  nU R                   (       a  X`R#                  5       -  nU(       a  SR                  " S
S	U0UD6nU(       a)  [%        X`R&                  =(       d    U R(                  40 UD6$ U$ )Nz {type} {query_string}dialectr   subqueryzQueries must have an equal number of select statements in a set operation.

Main Query:
{query1}

Set Operations Query:
{query2})query1query2)r   query_string	({query})r`   rZ   )
setdefaultrY  r  
QUOTE_CHARre   wrap_set_operation_queriesrZ  r   _selectsr   r   valuer[  _orderby_sqlr\  
_limit_sqlr]  _offset_sqlr!   r0   r   )
r2   
with_aliasr  rg   set_operation_templatebase_querystringquerystringr`  r_  set_operation_querystrings
             r3   re   _SetOperation.get_sqlv  s   !9)T__%<%<= 	,(B(BC??22qDOO<f<fqjpq&262E2E.M(;(C(C )CC)GM)% 4??++,4G4P4P0QQ+SSYSY/ TZ T  88"((7P 9  K 3F" >>,,6v66K;;"??,,K<<++--K%,,I;I&IK#K1Ot?O?OZSYZZr6   c                   / nU R                   R                   Vs1 s H  oDR                  iM     nnU R                   H}  u  pgUR                  (       a&  UR                  U;   a  [	        UR                  U5      OUR
                  " SSU0UD6nUR                  Ub  SR                  XR                  S9OU5        M     SR                  SR                  U5      S9$ s  snf )a  
Produces the ORDER BY part of the query.  This is a list of fields and possibly their directionality, ASC or
DESC. The clauses are stored in the query under self._orderbys as a list of tuples containing the field and
directionality (which can be None).

If an order by field is used in the select clause, determined by a matching , then the ORDER BY clause will use
the alias, otherwise the field will be rendered as SQL.
r   {term} {orient}termorient ORDER BY {orderby},rj  rZ   )
rY  r  r0   r[  r"   re   r   r   r  join)	r2   r   rg   clausesr   selected_aliasesr?   directionalityr  s	            r3   r  _SetOperation._orderby_sql  s     -1__-E-EF-EGG-EF%)^^!E ;;5;;2B#B ekk:6]]CjCFC  NNTbTn!((d;O;O(Ptx &4 %++CHHW4E+FF Gs   Cc                4    SR                  U R                  S9$ )Nz OFFSET {offset})ru  )r   r]  rB   s    r3   r  _SetOperation._offset_sql  s    !(((==r6   c                4    SR                  U R                  S9$ )Nz LIMIT {limit})ro  )r   r\  rB   s    r3   r  _SetOperation._limit_sql  s    &&T[[&99r6   )r\  r]  r[  rZ  r^  rY  )
rY  r(   r_  r(   r`  r   r0   r   ra  type[ValueWrapper])ri  r   rg   r   rQ   rR   ro  rv   rQ   rR   ru  rv   rQ   rR   )rl   r+   rQ   rR   )rl   r+   rQ   rW  rl   r(   rQ   rW  rS   FFr  rt   r  rt   rg   r   rQ   rP   r.   r   )rT   rU   rV   rW   r  r   r4   r    rj  ro  ru  ry  r}  r  r  r  r  r  r  r   re   r  r  r  rY   rw   rx   s   @r3   rW  rW  (  s%    !*6( ( *( $	(
 ( (( ($ @ @     @ @ D D D D D D @ @!%!+ZG0>: :r6   rW  c                    ^  \ rS rSrSrSrSrSrSr\	r
SS\SS4         SeU 4S jjjrSfS	 jr\SgS
 j5       r\ShS j5       r\SiS j5       r\SjS j5       r\SkS j5       r\SlS j5       r\SjS j5       r\SkS j5       r\SkS j5       r\SkS j5       r\SmS j5       r\SmS j5       r\SlS j5       r\SlS j5       r\SlS j5       r\SnS j5       r\SoS j5       r\SoS j5       r \SoS j5       r!\SpS j5       r"\SlS j5       r#\SqS j5       r$\SrS  j5       r%\\&RN                  4     SsS! jj5       r(StS" jr)StS# jr*StS$ jr+StS% jr,StS& jr-StS' jr.StS( jr/StS) jr0StS* jr1\SuS+ j5       r2\SvS, j5       r3\SwS- j5       r4\SwS. j5       r5\SwS/ j5       r6\SwS0 j5       r7\SwS1 j5       r8\SxS2 j5       r9SwS3 jr:SwS4 jr;SwS5 jr<\SyS6 j5       r=SzU 4S7 jjr>\?S{S|S8 jj5       r@S}S9 jrAS~S: jrBSS; jrCSS< jrDSS= jrESS> jrFSS? jrGSS@ jrHSkSA jrISSB jrJSSC jrKSSD jrLSSE jrMSSF jrNSSG jrOSSSH jjrPSSI jrQSSJ jrRSSK jrSSSL jrTSSM jrUSSN jrVSSO jrW\?SSP j5       rXSSQ jrYSSSR jjrZSSS jr[SST jr\SSSU jjr]SSSV jjr^SSW jr_SSX jr`S{SSY jjraS{SSZ jjrb   S         SS[ jjrc   S         SS\ jjrdSS] jreS{SS^ jjrfS{SS_ jjrgSS` jrhSSa jriSSb jrjSc rkSdrlU =rm$ )r(   i  z
Query Builder is the main class in pypika which stores the state of a query and offers functions which allow the
state to be branched immutably.
r   'NTFc                >  > [         TU ]  S 5        / U l        S U l        S U l        SU l        SU l        / U l        / U l        / U l	        / U l
        / U l        / U l        SU l        SU l        SU l        S U l        S U l        / U l        SU l        S U l        S U l        / U l        / U l        / U l        / U l        S U l        S U l        / U l        SU l        [=        5       U l        SU l         SU l!        SU l"        SU l#        Xl$        XPl%        X l&        X0l'        X@l(        g )NFr   ))r_   r4   rf  _insert_table_update_table_delete_from_replace_withr  _force_indexes_use_indexes_columns_values	_distinct_ignore_for_update_wheres
_prewheres	_groupbys_with_totals_havings	_qualifysr[  _joins_unions_usingr\  r]  _updates_select_starset_select_star_tables_mysql_rollup_select_into_subquery_count_foreign_tabler  
as_keywordr  r^  	immutable)r2   r  r  ra  r  r  ra   s         r3   r4   QueryBuilder.__init__  s#    	
!!!
  !!#&5 "! #$*D''"r6   c                :   [        U 5      R                  [        U 5      5      nUR                  R                  U R                  5        [	        U R
                  5      Ul        [	        U R                  5      Ul        [	        U R                  5      Ul        [	        U R                  5      Ul        [	        U R                  5      Ul	        [	        U R                  5      Ul
        [	        U R                  5      Ul        [	        U R                  5      Ul        [	        U R                  5      Ul        [	        U R                  5      Ul        [	        U R                  5      Ul        [	        U R                   5      Ul        [	        U R"                  5      Ul        U$ r.   )r   __new____dict__r   r   r  rf  r  r  r  r  r  r[  r  r  r  r  r  )r2   newones     r3   __copy__QueryBuilder.__copy__	  s   d##DJ/t}}-%)$*B*B%C"DJJ'DJJ't}}-t}}-dll+//T[[)dll+t}}- $T%8%8 9"4#4#45r6   c                j   U R                   R                  [        U[        5      (       a  [	        U5      OU5        [        U[
        [        45      (       a]  UR                  cO  [        U[
        5      (       a  UR                  nOSn[        U R                  U5      nSU-  Ul        US-   U l        ggg)aL  
Adds a table to the query. This function can only be called once and will raise an AttributeError if called a
second time.

:param selectable:
    Type: ``Table``, ``Query``, or ``str``

    When a ``str`` is passed, a table with the name matching the ``str`` value is used.

:returns
    A copy of the query with the table added.
Nr   sq%dr   )
rf  r   rj   rP   r   r(   rW  r0   r  max)r2   
selectablesub_query_counts      r3   r   QueryBuilder.from_  s     	

z*c/J/J%
+PZ[j<"?@@ZEUEUE]*l33","<"<"#!$"6"6HO%7J#2Q#6D  F^@r6   c                6   U R                    Vs/ s H  o3U:X  a  UOUPM     snU l         U R                  U:X  a  UOU R                  U l        U R                  U:X  a  UOU R                  U l        U R                   Vs/ s H  oDR	                  X5      PM     snU l        U R
                   Vs/ s H  oUR	                  X5      PM     snU l        U R                   Vs/ s H  ofR	                  X5      PM     snU l        U R                   VVs/ s H#  ow Vs/ s H  oR	                  X5      PM     snPM%     snnU l        U R                  (       a  U R                  R	                  X5      OSU l        U R                  (       a  U R                  R	                  X5      OSU l	        U R                   V	s/ s H  oR	                  X5      PM     sn	U l
        U R                  (       a  U R                  R	                  X5      OSU l        U R                  (       a  U R                  R	                  X5      OSU l        U R                   V
s/ s H  oS   R	                  X5      U
S   4PM     sn
U l        U R                   Vs/ s H  oR	                  X5      PM     snU l        XR                  ;   a7  U R                  R!                  U5        U R                  R#                  U5        ggs  snf s  snf s  snf s  snf s  snf s  snnf s  sn	f s  sn
f s  snf )a#  
Replaces all occurrences of the specified table with the new table. Useful when reusing fields across
queries.

:param current_table:
    The table instance to be replaces.
:param new_table:
    The table instance to replace with.
:return:
    A copy of the query with the tables replaced.
Nr   r   )rf  r  r  r  replace_tabler  r  r  r  r  r  r  r  r[  r  r  removeadd)r2   current_table	new_tabler<   alias_queryr   r  
value_listr  groupbyrj  r  s               r3   r  QueryBuilder.replace_table6  s    SWR\R\]R\M#9iuDR\]
*.*<*<*MYSWSeSe*.*<*<*MYSWSeSe]a]g]gh]gk//I]gh
VZVcVcdVcF--mGVcdVZVcVcdVcF--mGVcdfjfrfr
frXb
S
u  :
Sfr
 PT||t||11-KaeUYUdUd$//77QjnY]YgYghYgg//IYghQUQ^Q^33MMdhSWSaSa55mOgk\`\j\j
\jQXQZ%%m?L\j
 QUP[P[\P[))-CP[\444$$++M:$$((3 5+ ^ iddS
 i
 ]sA   K->K2.K7K<	LL2L6L"LLLc                P    [        X!5      nU R                  R                  U5        g r.   )r\   r  r   )r2   r  r>   r   s       r3   rD  QueryBuilder.with_\  s    *

!r6   c                    U R                   b  [        SS-  5      eU R                  (       a  SU l        [	        U[
        5      (       a  Xl         g [        U5      U l         g )N$'Query' object has no attribute '%s'r   T)r  r   r  r  rj   r   r2   r<   s     r3   r   QueryBuilder.intoa  sK    ) !G&!PQQ== $D&0&>&>UE%Lr6   c                b   U H  n[        U[        5      (       a  U R                  U5        M+  [        U[        5      (       a  U R	                  U5        MS  [        U[
        [        45      (       a  U R                  U5        M  U R                  U R                  X R                  S95        M     g N)ra  )
rj   r   _select_fieldrP   _select_field_strr   r   _select_otherrg  r^  r2   r   r  s      r3   r   QueryBuilder.selectk  s    D$&&""4(D#&&&&t,D8-A"BCC""4(""4#5#5dHYHY#5#Z[ r6   c                    U R                   (       d"  U R                  (       d  U R                  (       a  [        SS-  5      eSU l         g )Nr  deleteT)r  r  r  r   rB   s    r3   r  QueryBuilder.deletew  s2    1C1C !G(!RSS r6   c                    U R                   c"  U R                  (       d  U R                  (       a  [        SS-  5      e[	        U[
        5      (       a  Xl         g [        U5      U l         g )Nr  r   )r  r  r  r   rj   r   r  s     r3   r   QueryBuilder.update~  sJ    )T]]d>O>O !G(!RSS&0&>&>UE%Lr6   c                &   U R                   c  [        SS-  5      eU(       a#  [        US   [        [        45      (       a  US   nU HF  n[        U[
        5      (       a  [        X R                   S9nU R                  R                  U5        MH     g )Nr  r   r   r;   )	r  r   rj   r   r   rP   r   r  r   r
  s      r3   r
  QueryBuilder.columns  sx    % !G(!RSSZa4-88!HED$$$T););<MM  & r6   c                0    U R                   " U6   SU l        g NF_apply_termsr  r   s     r3   r   QueryBuilder.insert  s    5!r6   c                0    U R                   " U6   SU l        g NTr  r   s     r3   replaceQueryBuilder.replace  s    5!r6   c                    U/UQ7 Hp  n[        U[        5      (       a  U R                  R                  U5        M5  [        U[        5      (       d  ML  U R                  R                  [        U5      5        Mr     g r.   )rj   r   r  r   rP   r2   r  r   r   s       r3   force_indexQueryBuilder.force_index  sX    A!U####**1-As####**584	  r6   c                    U/UQ7 Hp  n[        U[        5      (       a  U R                  R                  U5        M5  [        U[        5      (       d  ML  U R                  R                  [        U5      5        Mr     g r.   )rj   r   r  r   rP   r  s       r3   	use_indexQueryBuilder.use_index  sX    A!U##!!((+As##!!((q2	  r6   c                    SU l         g r  r  rB   s    r3   distinctQueryBuilder.distinct  s	    r6   c                    SU l         g r  r  rB   s    r3   
for_updateQueryBuilder.for_update  s
    r6   c                    SU l         g r  )r  rB   s    r3   ignoreQueryBuilder.ignore  s	    r6   c                    U R                  U5      (       d  SU l        U R                  (       a  U =R                  U-  sl        g Xl        g r  )_validate_tabler  r  r2   r   s     r3   prewhereQueryBuilder.prewhere  s5    ##I.."&D??OOy(O'Or6   c                    [        U[        5      (       a  g U R                  U5      (       d  SU l        U R                  (       a  U =R                  U-  sl        g Xl        g r  )rj   r   r/  r  r  r0  s     r3   whereQueryBuilder.where  sE    i00##I.."&D<<LLI%L$Lr6   c                    [        U[        5      (       a  g U R                  (       a  U =R                  U-  sl        g Xl        g r.   )rj   r   r  r0  s     r3   havingQueryBuilder.having  s,    i00==MMY&M%Mr6   c                    [        U[        5      (       a  g U R                  (       a  U =R                  U-  sl        g Xl        g r.   )rj   r   r  r0  s     r3   qualifyQueryBuilder.qualify  s,    i00>>NNi'N&Nr6   c                ,   U H  n[        U[        5      (       a  [        X R                  S   S9nOD[        U[        5      (       a/  [        [        U5      U R                  S   S9R                  U5      nU R                  R                  U5        M     g )Nr   r;   )rj   rP   r   rf  rv   rg  r  r   r
  s      r3   r  QueryBuilder.groupby  sm    D$$$TA7D#&&SYdjjm<JJ4PNN!!$' r6   c                    SU l         g r  )r  rB   s    r3   with_totalsQueryBuilder.with_totals  s
     r6   c           	     t   SUR                  S5      :H  nU R                  (       a  [        SS-  5      eU Vs/ s H-  n[        U[        [
        [        45      (       a  [        U6 OUPM/     nnU(       a@  U(       d  U R                  (       d  [        S5      eSU l        U =R                  U-  sl        g S[        U R                  5      :  aE  [        U R                  S   [        5      (       a#  U R                  S   =R                  U-  sl        g U R                  R                  [        U6 5        g s  snf )	Nmysqlvendorr  rollupzWAt least one group is required. Call Query.groupby(term) or passas parameter to rollup.Tr   )r   r  r   rj   r   r   r  r   r  r   r   r   argsr   )r2   r   rg   	for_mysqlr  s        r3   rD  QueryBuilder.rollup  s    vzz(33	 !G(!RSS\ab\aTXD42D!E!E4O\ab%p  "&DNNe#NT^^$$DNN24F)O)ONN2##u,# NN!!&%.1# cs   4D5c                    U Hj  n[        U[        5      (       a  [        X0R                  S   S9OU R	                  U5      nU R
                  R                  X2R                  S5      45        Ml     g rd  )rj   rP   r   rf  rg  r[  r   r   rh  s       r3   rj  QueryBuilder.orderby  sW    E9CE39O9OE%zz!}5UYUgUghmUnENN!!5**W*=">? r6   c                l   [        U[        5      (       a  [        XUSS9$ [        U[        5      (       a)  UR                  c  U R                  U5        [        XUSS9$ [        U[        5      (       a  [        XUSS9$ [        U[        5      (       a  [        XUSS9$ [        S[        U5      -  5      e)Nr<   )
type_labelr  zCannot join on type '%s')
rj   r   Joinerr(   r0   _tag_subqueryr\   r+   
ValueErrorr   r2   r   hows      r3   r  QueryBuilder.join  s     dE""$cg>>l++zz!""4($cjAAl++$cg>>j))$cjAA3d4j@AAr6   c                B    U R                  U[        R                  5      $ r.   )r  r   innerr   s     r3   
inner_joinQueryBuilder.inner_join&      yyx~~..r6   c                B    U R                  U[        R                  5      $ r.   )r  r   leftr   s     r3   	left_joinQueryBuilder.left_join)      yyx}}--r6   c                B    U R                  U[        R                  5      $ r.   )r  r   
left_outerr   s     r3   left_outer_joinQueryBuilder.left_outer_join,      yyx2233r6   c                B    U R                  U[        R                  5      $ r.   )r  r   rightr   s     r3   
right_joinQueryBuilder.right_join/  rW  r6   c                B    U R                  U[        R                  5      $ r.   )r  r   right_outerr   s     r3   right_outer_joinQueryBuilder.right_outer_join2  s    yyx3344r6   c                B    U R                  U[        R                  5      $ r.   )r  r   outerr   s     r3   
outer_joinQueryBuilder.outer_join5  rW  r6   c                B    U R                  U[        R                  5      $ r.   )r  r   
full_outerr   s     r3   full_outer_joinQueryBuilder.full_outer_join8  ra  r6   c                B    U R                  U[        R                  5      $ r.   )r  r   crossr   s     r3   
cross_joinQueryBuilder.cross_join;  rW  r6   c                B    U R                  U[        R                  5      $ r.   )r  r   rp   r   s     r3   	hash_joinQueryBuilder.hash_join>  r\  r6   c                    Xl         g r.   rm  rn  s     r3   ro  QueryBuilder.limitA  rq  r6   c                    Xl         g r.   rs  rt  s     r3   ru  QueryBuilder.offsetE  rw  r6   c                H    [        X[        R                  U R                  S9$ r  )rW  r   ry  r^  rk   s     r3   ry  QueryBuilder.unionI      T,*<*<$J[J[\\r6   c                H    [        X[        R                  U R                  S9$ r  )rW  r   r}  r^  rk   s     r3   r}  QueryBuilder.union_allM      T,*@*@dN_N_``r6   c                H    [        X[        R                  U R                  S9$ r  )rW  r   r  r^  rk   s     r3   r  QueryBuilder.intersectQ  r  r6   c                H    [        X[        R                  U R                  S9$ r  )rW  r   r  r^  rk   s     r3   r  QueryBuilder.except_ofU  r  r6   c                H    [        X[        R                  U R                  S9$ r  )rW  r   r  r^  rk   s     r3   r  QueryBuilder.minusY  r  r6   c                    [        U[        5      (       d  [        U5      OUn[        U[        5      (       d  U R                  X R                  S9nU R
                  R                  X45        g r  )rj   r   r   rg  r^  r  r   )r2   r?   r  s      r3   r  QueryBuilder.set]  sS    $.ue$<$<e%%&&&&u:K:K&LEe^,r6   c                $    U R                  U5      $ r.   r  rk   s     r3   r  QueryBuilder.__add__d  r  r6   c                $    U R                  U5      $ r.   r  rk   s     r3   r  QueryBuilder.__mul__g  r  r6   c                $    U R                  U5      $ r.   r  rk   s     r3   r  QueryBuilder.__sub__j  r  r6   c                H    UR                   U l        UR                  U l        g r.   )startr]  stopr\  )r2   slices     r3   r  QueryBuilder.slicem  s    {{jjr6   c                n   > [        U[        5      (       d  [        TU ]  U5      $ U R                  U5      $ r.   )rj   r  r_   rK   )r2   r   ra   s     r3   rK   QueryBuilder.__getitem__r  s/    $&&7&t,,zz$r6   c                p    U  Vs/ s H$  o"R                   =(       d    UR                  US9PM&     sn$ s  snf )Nr   )r0   re   )	field_setr   r?   s      r3   _list_aliasesQueryBuilder._list_aliasesw  s1    QZ[QZCu}}
}CCQZ[[[s   +3c                    S[        U R                  5      :X  a  [        SU S35      eUS:X  a  SU l        [	        5       /U l        g U R                  [        XR                  S   S95        g )Nr   zCannot select z, no FROM table specified.*Tr;   )r   rf  r   r  r   r  r  r   )r2   r  s     r3   r  QueryBuilder._select_field_str{  s_    DJJ >$7Q!RSS3; $D!VHDM5ZZ];<r6   c                   U R                   (       a  g UR                  U R                  ;   a  g [        U[        5      (       at  U R
                   Vs/ s H2  n[        US5      (       a  UR                  UR                  :w  d  M0  UPM4     snU l        U R                  R                  UR                  5        U R
                  R                  U5        g s  snf )Nr<   )	r  r<   r  rj   r   r  hasattrr  r   )r2   r  r   s      r3   r  QueryBuilder._select_field  s    ::111dD!!%)]]%26'&':R:RVZV`V`djdpdpVp]DM $$((4T"s   /CCc                :    U R                   R                  U5        g r.   )r  r   )r2   functions     r3   r	  QueryBuilder._select_other  s    X&r6   c                    / $ r.   rZ   rB   s    r3   fields_QueryBuilder.fields_  s    	r6   c                  ^^ U R                   U R                  /-   U R                  -   mTR                  TU R                  5        [        UU4S jT 5       5      n[        TR                  [        5      (       aF  TR                  R                  c/  U(       a(  TR                  R                  S-   TR                  l	        U R                  R                  T5        g )Nc              3  p   >#    U  H+  n[        U[        5      =(       a    TR                  T;   v   M-     g 7fr.   )rj   r   r   ).0clausebase_tablesr  s     r3   	<genexpr>'QueryBuilder.do_join.<locals>.<genexpr>  s,     nbmX^Z6S499;SSbms   362)rf  r  r  validater  anyrj   r   r   r0   r   r   )r2   r  table_in_queryr  s    ` @r3   do_joinQueryBuilder.do_join  s    jjD$6$6#77$**Dk4;;/nbmnndii''DIIOO,C #ii33c9DIIO4 r6   c                B   ^ [        U4S jU R                   5       5      $ )Nc              3  B   >#    U  H  nTUR                   :H  v   M     g 7fr.   )r   )r  r  r<   s     r3   r  )QueryBuilder.is_joined.<locals>.<genexpr>  s     >+$5DII%+s   )r  r  r  s    `r3   	is_joinedQueryBuilder.is_joined  s    >$++>>>r6   c                z   U R                   U R                  /-   nUR                  5        H  nUR                  U;   nUR                  U R                   Vs/ s H  oUR
                  PM     sn;   n[        UR                  SLU(       + U(       + UR                  U R                  :g  /5      (       d  M    g   gs  snf )zo
Returns False if the term references a table not already part of the
FROM clause or JOINS and True otherwise.
NFT)rf  r  r  r<   r  r   all)r2   r  r  r?   table_in_base_tablesr  table_in_joinss          r3   r/  QueryBuilder._validate_table  s    
 jjD$6$6#77\\^E#(;;+#= "[[4;;,O;4YY;,OONKKt+,,&&KK4#5#55	   $  -Ps   B8c                V    SU R                   -  Ul        U =R                   S-  sl         g )Nr  r   )r  r0   )r2   r  s     r3   rN  QueryBuilder._tag_subquery  s%    $"6"66!r6   c           
     V   U R                   c  [        SS-  5      eU(       d  g[        US   [        [        [
        45      (       d  U/nU HU  nU R                  R                  U Vs/ s H+  n[        U[        5      (       a  UOU R                  U5      PM-     sn5        MW     gs  snf )z
Handy function for INSERT and REPLACE statements in order to check if
terms are introduced and how append them to `self._values`
Nr  r   r   )
r  r   rj   r   r   r  r  r   r   rg  )r2   r   valuesr  s       r3   r  QueryBuilder._apply_terms  s    
 % !G(!RSS%(T5#$677GEFLLnt untej*UD*A*AtGYGYZ_G`!`nt uv  us   (2B&
c                4    U R                  U R                  S9$ )N)r  )re   r  rB   s    r3   r   QueryBuilder.__str__  s    ||DLL|11r6   c                "    U R                  5       $ r.   r   rB   s    r3   r   QueryBuilder.__repr__  r  r6   c                f    [        U[        5      (       d  gU R                  UR                  :X  d  ggr   )rj   r(   r0   rk   s     r3   rm   QueryBuilder.__eq__  s(    %..zzU[[(r6   c                .    U R                  U5      (       + $ r.   r   rk   s     r3   r   QueryBuilder.__ne__  r   r6   c                f    [        U R                  5      [        S U R                   5       5      -   $ )Nc              3  8   #    U  H  n[        U5      v   M     g 7fr.   )rp   )r  r  s     r3   r  (QueryBuilder.__hash__.<locals>.<genexpr>  s     %Lvd6lls   )rp   r0   sumrf  rB   s    r3   rq   QueryBuilder.__hash__  s%    DJJ#%L%L"LLLr6   c                   UR                  SU R                  5        UR                  SU R                  5        UR                  SU R                  5        UR                  SU R                  5        UR                  SU R
                  5        g )Nr   secondary_quote_charalias_quote_charr  r  )r  r  SECONDARY_QUOTE_CHARALIAS_QUOTE_CHARr  r  rf   s     r3   _set_kwargs_defaults!QueryBuilder._set_kwargs_defaults  sl    ,80$2K2KL,d.C.CD,8)T\\2r6   c                T  ^ U R                  T5        U R                  (       d4  U R                  (       d#  U R                  (       d  U R                  (       d  gU R                  (       a#  U R                  (       d  U R
                  (       d  gU R                  (       a  U R                  (       d  g[        U R                  5      nS[        U R                  5      :  nS[        U R                  5      :  =(       a    [        U R                  S   [        5      nU R                  nU R                  =(       a    U R                  n[        UUUUU/5      TS'   U R                  (       a  U R                  (       a  U R                   " S0 TD6OSn	XR"                  " S0 TD6-  n	U R                  (       a+  U	SSR%                  U4S jU R                   5       5      -   -  n	XR&                  " S0 TD6-  n	U R                  (       a  XR(                  " S0 TD6-  n	U R*                  (       a  XR,                  " S0 TD6-  n	U R.                  b  XR1                  5       -  n	U	$ U R                  (       a  U R2                  " S0 TD6n	GODU R4                  (       d  U R                  (       a  U R                  (       a  U R                   " S0 TD6OSn	U R6                  (       a  XR8                  " S0 TD6-  n	OXR:                  " S0 TD6-  n	U R<                  (       a  XR>                  " S0 TD6-  n	U R
                  (       a  XR@                  " S0 TD6-  n	U	$ U	SU RB                  " S0 TD6-   -  n	O^U R                  (       a  U R                   " S0 TD6OSn	XRB                  " S0 TD6-  n	U R                  (       a  XRD                  " S0 TD6-  n	U R                  (       a  XR(                  " S0 TD6-  n	U RF                  (       a  XRH                  " S0 TD6-  n	U RJ                  (       a  XRL                  " S0 TD6-  n	U RN                  (       a  XRP                  " S0 TD6-  n	U R                  (       a+  U	SSR%                  U4S jU R                   5       5      -   -  n	U RR                  (       a  XRT                  " S0 TD6-  n	U R*                  (       a  XR,                  " S0 TD6-  n	U RV                  (       a7  XRX                  " S0 TD6-  n	U RZ                  (       a  XR]                  5       -  n	U R^                  (       a  XR`                  " S0 TD6-  n	U Rb                  (       a  XRd                  " S0 TD6-  n	U Rf                  (       a  XRh                  " S0 TD6-  n	U Rj                  " U	40 TD6n	U Rl                  (       a  XRn                  " S0 TD6-  n	U(       a  SRq                  U	S	9n	U(       a>  U Rr                  c  U Rt                  OU Rr                  TS
'   [w        XRx                  40 TD6$ U	$ )Nr  r   r   with_namespace c              3  F   >#    U  H  oR                   " S0 TD6v   M     g 7frd   r   r  r  rg   s     r3   r  'QueryBuilder.get_sql.<locals>.<genexpr>  s     -]Q\ll.DV.DQ\   !c              3  F   >#    U  H  oR                   " S0 TD6v   M     g 7frd   r   r  s     r3   r  r  J  s     )Y[T,,*@*@[r  r  r`   r  rZ   )=r  r  r  r  r  r  r  rt   r  r   rf  rj   r(   r  r  r  	_with_sql_update_sqlr  _set_sql	_from_sqlr  
_where_sqlr\  r  _delete_sqlr  r  _replace_sql_insert_sqlr  _columns_sql_values_sql_select_sql	_into_sqlr  
_using_sqlr  _force_index_sqlr  _use_index_sqlr  _prewhere_sqlr  
_group_sqlr  _rollup_sqlr  _having_sqlr  _qualify_sqlr[  r  _apply_paginationr  _for_update_sqlr   QUERY_ALIAS_QUOTE_CHARr  r!   r0   )
r2   r  r  rg   	has_joinshas_multiple_from_clauseshas_subquery_from_clausehas_reference_to_foreign_tablehas_update_fromr  s
      `      r3   re   QueryBuilder.get_sql  s   !!&)!3!3t7H7HDL^L^t}}dmm%	$%DJJ$7!#$s4::#6#b:djjQRmUa;b )-)<)<&,,;#&)(.$
  6:jj$..262bK++5f55K{{sSXX-]QUQ\Q\-]%]]]==2622Kzz~~777||888{{&00**4V4K""t'9'96:jj$..262bK}}00:6:://9&99}}00:6::||//9&99""sT%5%5%?%??? 7;jj$..262bK++5f55K!!~~777::>>3F33K;;??4V44K00:6::K..888K;;3)YT[[)Y!YYYK??--777K<<??4V44K>>??4V44K!!//11==++5f55K>>,,6v66K>>,,6v66K,,[CFC//9&99K%,,;,?K)-)D)D)L%%RVRmRm %& $KFvFFr6   c                    U R                   b  XR                  5       -  nU R                  (       a  XR                  5       -  nU$ r.   )r\  r  r]  r  )r2   r  rg   s      r3   r  QueryBuilder._apply_paginationp  s9    ;;"??,,K<<++--Kr6   c                T   ^ SSR                  U4S jU R                   5       5      -   $ )NzWITH r  c              3  t   >#    U  H-  nUR                   S -   UR                  " SSSS.TD6-   S-   v   M/     g7f)z AS (Fr  r  z) NrZ   )r>   re   r  r  rg   s     r3   r  )QueryBuilder._with_sql.<locals>.<genexpr>z  s@      "
$ KK'!FNN$^Ee$^W]$^^aee$s   58)r  r  rf   s    `r3   r  QueryBuilder._with_sqly  s,     "
**"
 
 
 	
r6   c                4    U R                   (       a  SnU$ SnU$ )Nz	DISTINCT r  r$  )r2   rg   r%  s      r3   _distinct_sqlQueryBuilder._distinct_sql  s    "&..; 79r6   c                4    U R                   (       a  SnU$ SnU$ )Nz FOR UPDATEr  r(  )r2   rg   r)  s      r3   r  QueryBuilder._for_update_sql  s"    &*&6&6]
 =?
r6   c                   ^ SR                  U R                  " S0 TD6SR                  U4S jU R                   5       5      S9$ )NzSELECT {distinct}{select}r  c              3  L   >#    U  H  oR                   " SS S S.TD6v   M     g7fT)r  r  NrZ   r   r  r  rg   s     r3   r  +QueryBuilder._select_sql.<locals>.<genexpr>  s%     m_lW[LLRD4R6R_l   !$)r%  r   rZ   )r   r  r  r  rf   s    `r3   r  QueryBuilder._select_sql  sE    *11''1&188m_c_l_lmm 2 
 	
r6   c                    SR                  U R                  R                  " S0 UD6U R                  (       a  SS9$ SS9$ )NzINSERT {ignore}INTO {table}zIGNORE r  )r<   r,  rZ   )r   r  re   r  rf   s     r3   r  QueryBuilder._insert_sql  sL    ,33$$,,6v6 $9 4 
 	
24 4 
 	
r6   c                T    SR                  U R                  R                  " S0 UD6S9$ )NzREPLACE INTO {table}r;   rZ   r   r  re   rf   s     r3   r  QueryBuilder._replace_sql  s1    %,,$$,,6v6 - 
 	
r6   c                     g)NDELETErZ   )rg   s    r3   r  QueryBuilder._delete_sql  s    r6   c                T    SR                  U R                  R                  " S0 UD6S9$ )NzUPDATE {table}r;   rZ   )r   r  re   rf   s     r3   r  QueryBuilder._update_sql  s*    &&T-?-?-G-G-Q&-Q&RRr6   c                h   ^ SR                  SR                  U4S jU R                   5       5      S9$ )z
SQL for Columns clause for INSERT queries
:param with_namespace:
    Remove from kwargs, never format the column terms with namespaces since only one table can be inserted into
z ({columns})r  c              3  J   >#    U  H  oR                   " SS S0TD6v   M     g7f)r  FNrZ   r   r  s     r3   r  ,QueryBuilder._columns_sql.<locals>.<genexpr>  s"     dVcd\\II&IVcs    #r
  )r   r  r  r2   r  rg   s     `r3   r  QueryBuilder._columns_sql  s6     $$HHdVZVcVcdd % 
 	
r6   c                h   ^ SR                  SR                  U4S jU R                   5       5      S9$ )Nz VALUES ({values})z),(c              3  Z   >#    U  H   nS R                  U4S jU 5       5      v   M"     g7f)r  c              3  L   >#    U  H  oR                   " SS S S.TD6v   M     g7fr  r   r  s     r3   r  5QueryBuilder._values_sql.<locals>.<genexpr>.<genexpr>  s%     `\_TXOOO\_r  N)r  )r  rowrg   s     r3   r  +QueryBuilder._values_sql.<locals>.<genexpr>  s)      lxeh`\_```lxs   (+)r  )r   r  r  rf   s    `r3   r  QueryBuilder._values_sql  s:    #**:: lplxlx  + 
 	
r6   c                X    SR                  U R                  R                  " SSS0UD6S9$ )Nz INTO {table}r  Fr;   rZ   r  rf   s     r3   r  QueryBuilder._into_sql  s6    %%$$,,HHH & 
 	
r6   c                h   ^ SR                  SR                  U4S jU R                   5       5      S9$ )Nz FROM {selectable}r  c              3  L   >#    U  H  oR                   " SS S S.TD6v   M     g7fTr  NrZ   r   r  s     r3   r  )QueryBuilder._from_sql.<locals>.<genexpr>  s&     rgq]c X XQW Xgqr  r  )r   r  rf  r!  s     `r3   r  QueryBuilder._from_sql  s4    #**xxrgkgqgqrr + 
 	
r6   c                h   ^ SR                  SR                  U4S jU R                   5       5      S9$ )Nz USING {selectable}r  c              3  L   >#    U  H  oR                   " SS S S.TD6v   M     g7fr.  r   r  s     r3   r  *QueryBuilder._using_sql.<locals>.<genexpr>  s&     sgr]c X XQW Xgrr  r0  )r   r  r  r!  s     `r3   r  QueryBuilder._using_sql  s4    $++xxsgkgrgrss , 
 	
r6   c                h   ^ SR                  SR                  U4S jU R                   5       5      S9$ )Nz FORCE INDEX ({indexes})r  c              3  F   >#    U  H  oR                   " S0 TD6v   M     g 7frd   r   r  r+  rg   s     r3   r  0QueryBuilder._force_index_sql.<locals>.<genexpr>  s     VBU]]4V4BUr  indexes)r   r  r  rf   s    `r3   r  QueryBuilder._force_index_sql  s3    )00HHV$BUBUVV 1 
 	
r6   c                h   ^ SR                  SR                  U4S jU R                   5       5      S9$ )Nz USE INDEX ({indexes})r  c              3  F   >#    U  H  oR                   " S0 TD6v   M     g 7frd   r   r8  s     r3   r  .QueryBuilder._use_index_sql.<locals>.<genexpr>  s     TBS]]4V4BSr  r:  )r   r  r  rf   s    `r3   r  QueryBuilder._use_index_sql  s3    '..HHT$BSBSTT / 
 	
r6   c                Z    SR                  U R                  R                  " SUSS.UD6S9$ )Nz PREWHERE {prewhere}Tr   r  )r1  rZ   )r   r  re   r2   r   rg   s      r3   r  QueryBuilder._prewhere_sql  s7    %,,__,,\
T\U[\ - 
 	
r6   c                Z    SR                  U R                  R                  " SUSS.UD6S9$ )Nz WHERE {where}TrB  )r4  rZ   )r   r  re   rC  s      r3   r  QueryBuilder._where_sql  s1    &&T\\-A-A-qZbf-qjp-q&rrr6   c           	        / nU R                    Vs1 s H  ofR                  iM     nnU R                   H~  nU(       aQ  UR                  (       a@  UR                  U;   a0  UR                  [	        UR                  U=(       d    U5      5        M[  UR                  UR
                  " SXS.UD65        M     SR                  SR                  U5      S9n	U R                  (       a  U	S-   $ U	$ s  snf )af  
Produces the GROUP BY part of the query.  This is a list of fields. The clauses are stored in the query under
self._groupbys as a list fields.

If an groupby field is used in the select clause,
determined by a matching alias, and the groupby_alias is set True
then the GROUP BY clause will use the alias,
otherwise the entire field will be rendered as SQL.
r   r  z GROUP BY {groupby}r  )r  z WITH TOTALSrZ   )	r  r0   r  r   r"   re   r   r  r  )
r2   r   r  groupby_aliasrg   r  r   r  r?   sqls
             r3   r  QueryBuilder._group_sql  s      -1]];]GG];^^E@P1P}U[[:J:XjYZu}}p
piopq	 $ $**388G3D*E''
 <s   C,c                   / nU R                    Vs1 s H  ofR                  iM     nnU R                   H  u  pU(       a@  UR                  (       a/  UR                  U;   a  [        UR                  U=(       d    U5      OUR                  " SXS.UD6n
UR                  U	b  SR                  XR                  S9OU
5        M     SR                  SR                  U5      S9$ s  snf )a  
Produces the ORDER BY part of the query.  This is a list of fields and possibly their directionality, ASC or
DESC. The clauses are stored in the query under self._orderbys as a list of tuples containing the field and
directionality (which can be None).

If an order by field is used in the select clause,
determined by a matching, and the orderby_alias
is set True then the ORDER BY clause will use
the alias, otherwise the field will be rendered as SQL.
rH  r  r  r  r  r  rZ   )	r  r0   r[  r"   re   r   r   r  r  )r2   r   r  orderby_aliasrg   r  r   r  r?   r  r  s              r3   r  QueryBuilder._orderby_sql  s    " -1]];]GG];%)^^!E !U[[U[[DT5T ekk+;+IzJ]]fjf_ef  NNTbTn!((d;O;O(Ptx &4 %++CHHW4E+FF <s   C#c                    g)Nz WITH ROLLUPrZ   rB   s    r3   r  QueryBuilder._rollup_sql  s    r6   c                X    SR                  U R                  R                  " SSU0UD6S9$ )Nz HAVING {having}r   )r7  rZ   )r   r  re   rC  s      r3   r  QueryBuilder._having_sql  s/    !((0E0E0fQ[0f_e0f(ggr6   c                X    SR                  U R                  R                  " SSU0UD6S9$ )Nz QUALIFY {qualify}r   )r:  rZ   )r   r  re   rC  s      r3   r  QueryBuilder._qualify_sql  s/    #**4>>3I3I3jU_3jci3j*kkr6   c                     SU R                    3$ )Nz OFFSET rs  rB   s    r3   r  QueryBuilder._offset_sql  s    $,,((r6   c                     SU R                    3$ )Nz LIMIT rm  rB   s    r3   r  QueryBuilder._limit_sql  s    &&r6   c                h   ^ SR                  SR                  U4S jU R                   5       5      S9$ )Nz
 SET {set}r  c              3     >#    U  H?  u  pS R                  UR                  " S0 [        TSS9D6UR                  " S0 TD6S9v   MA     g7f)z{field}={value}F)r  )r?   r  NrZ   )r   re   dict)r  r?   r  rg   s      r3   r  (QueryBuilder._set_sql.<locals>.<genexpr>#  sV       %2LE "((--M$ve*LMUZUbUbUlekUl )  %2s   AA
)r  )r   r  r  rf   s    `r3   r  QueryBuilder._set_sql!  s:    ""  %)MM	  # 
 	
r6   c                    U" U /UQ70 UD6$ )a  Call a function on the current object and return the result.

Example usage:

.. code-block:: python

    from pypika import Query, functions as fn
    from pypika.queries import QueryBuilder

    def rows_by_group(query: QueryBuilder, *groups) -> QueryBuilder:
        return (
            query
            .select(*groups, fn.Count("*").as_("n_rows"))
            .groupby(*groups)
        )

    base_query = Query.from_("table")

    col1_agg = base_query.pipe(rows_by_group, "col1")
    col2_agg = base_query.pipe(rows_by_group, "col2")
    col1_col2_agg = base_query.pipe(rows_by_group, "col1", "col2")

Makes chaining functions together easier, especially when the functions are
defined elsewhere. For example, you could define a function that filters
rows by a date range and then group by a set of columns:


.. code-block:: python

    from datetime import datetime, timedelta

    from pypika import Field

    def days_since(query: QueryBuilder, n_days: int) -> QueryBuilder:
        return (
            query
            .where("date" > fn.Date(datetime.now().date() - timedelta(days=n_days)))
        )

    (
        base_query
        .pipe(days_since, n_days=7)
        .pipe(rows_by_group, "col1", "col2")
    )
rZ   )r2   funcrF  rg   s       r3   pipeQueryBuilder.pipe+  s    \ D*4*6**r6   )&r  r  r  r  r  r  rf  r  r  r  r  r  r\  r  r]  r[  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r^  r  r  r  r  )
r  Dialects | Noner  rt   ra  r  r  rt   r  rt   r   )r  zSelectable | Query | strrQ   rR   r  Table | Noner  rd  rQ   rR   )r  r+   r>   rP   rQ   rR   )r<   rP  rQ   rR   )r   r   rQ   rR   rQ   rR   )r  rQ  r   rQ  rQ   rR   )r   r   rQ   rR   r   zTerm | EmptyCriterionrQ   rR   )r   zstr | int | TermrQ   rR   )r   zlist | tuple | set | Termrg   r   rQ   rR   )ri  r   rg   r   rQ   rR   )r   z0Table | QueryBuilder | AliasedQuery | SelectablerQ  r   rQ   Joiner[Self])r   #Table | QueryBuilder | AliasedQueryrQ   rg  r  r  r  )r?   zField | strr  r   rQ   rR   )r  r  rQ   rR   )r   r   rQ   zQueryBuilder | Fieldr.   )r  Sequence[Field]r   r   rQ   	list[str])r  rP   rQ   rR   )r  r   rQ   rR   )r  r   rQ   rR   )rQ   zlist[Field])r  JoinrQ   rR   )r<   r   rQ   rt   )r  r   rQ   rt   )r  r(   rQ   rR   rS   )rl   r(   rQ   rt   ru   rg   r[  rQ   rR   r  r  )r  rP   rQ   rP   rs   )F)r  rt   rg   r   rQ   rP   r   )NNT)
r   r   r  r   rI  rt   rg   r   rQ   rP   )
r   r   r  r   rM  rt   rg   r   rQ   rP   )nrT   rU   rV   rW   r  r  r  r  r  r   	QUERY_CLSr   r4   r  r    r   r  rD  r   r   r  r   r
  r   r  r  r!  r%  r)  r,  r1  r4  r7  r:  r  r?  rD  rj  r   rT  r  rU  rZ  r_  rd  rh  rl  rp  rt  rw  ro  ru  ry  r}  r  r  r  r  r  r  r  r  rK   r   r  r  r  r	  r  r  r  r/  rN  r  r   r   rm   r   rq   r  re   r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r`  rY   rw   rx   s   @r3   r(   r(     s   
 J!I $(+/*6 9# 9# %)9# (	9#
 9# 9# 9#v$ 7 74 #4 #4J   Q Q 	\ 	\ ! ! Q Q 
' 
'     5 5 3 3         ( ( 
% 
% & & ' ' ( ( ! ! 2 22 @ @ V^VdVdBDBKSB	B B&/.4/5/4/.     ] ] a a a a a a ] ] - -!%! ! ! 
 \ \	=#"'
!?*"w"2&M3{z






  S













s
 "&'+"	 % 	
  
B "&'+"	GG %G 	G
 G 
G@hl)'
.+ .+r6   c                  J    \ rS rSrS	S jrS
SS jjrSS jrSS jrSS jrSr	g)rM  i\  c                4    Xl         X l        X0l        X@l        g r.   )r`   r   rQ  rL  )r2   r`   r   rQ  rL  s        r3   r4   Joiner.__init__]  s    
	$r6   Nc                    Uc"  [        SR                  U R                  S95      eU R                  R	                  [        U R                  U R                  X5      5        U R                  $ )NzIParameter 'criterion' is required for a {type} JOIN but was not supplied.r   )r   r   rL  r`   r  JoinOnr   rQ  )r2   r   collates      r3   on	Joiner.onc  sY    44:FF4P 
 	

6$))TXXyJKzzr6   c                p   U(       d"  [        SR                  U R                  S95      eS nU H@  n[        X0R                  R
                  S   S9[        X0R                  S9:H  nUc  UOX$-  nMB     U R                  R                  [        U R                  U R                  U5      5        U R                  $ )NzFParameter 'fields' is required for a {type} JOIN but was not supplied.rr  r   r;   )
r   r   rL  r   r`   rf  r   r  rs  rQ  )r2   ri  r   r?   constituents        r3   on_fieldJoiner.on_fieldm  s    [bbhlhwhwbx  	EZZ-=-=a-@AU5XaXaEbbK'0'8i>UI  	

6$))TXXyABzzr6   c                    U(       d  [        S5      eU R                  R                  [        U R                  U R
                  U Vs/ s H  n[        U5      PM     sn5      5        U R                  $ s  snf )NzUParameter 'fields' is required when joining with a using clause but was not supplied.)r   r`   r  	JoinUsingr   rQ  r   )r2   ri  r?   s      r3   usingJoiner.using{  sZ     wxx

9TYYU[:\U[E5<U[:\]^zz ;]s   A3c                    U R                   R                  [        U R                  [        R
                  5      5        U R                   $ )zReturn cross join)r`   r  rk  r   r   rs  rB   s    r3   rs  Joiner.cross  s-    

4		8>>:;zzr6   )rQ  r   r`   rL  )
r`   r'   r   rh  rQ  r   rL  rP   rQ   rR   r.   )r   zCriterion | Nonert  r   rQ   r'   )ri  r   rQ   r'   )rQ   r'   )
rT   rU   rV   rW   r4   ru  ry  r}  rs  rY   rZ   r6   r3   rM  rM  \  s    %r6   rM  c                  F    \ rS rSrSS jrS	S jrS
S jr\SS j5       rSr	g)rk  i  c                    Xl         X l        g r.   )r   rQ  rP  s      r3   r4   Join.__init__  s    	r6   c                    SR                  U R                  R                  " SSSS.UD6S9nU R                  R                  (       a#  SR                  X R                  R                  S9$ U$ )NzJOIN {table}Tr  r;   z{type} {join})r  r   rZ   )r   r   re   rQ  r  )r2   rg   rJ  s      r3   re   Join.get_sql  sa    ##))##MTdMfM $ 
 88>>"))s)HH
r6   c                    g r.   rZ   r2   rf  r  s      r3   r  Join.validate      r6   c                D    U R                   R                  X5      U l         ga  
Replaces all occurrences of the specified table with the new table. Useful when reusing
fields across queries.

:param current_table:
    The table to be replaced.
:param new_table:
    The table to replace with.
:return:
    A copy of the join with the tables replaced.
N)r   r  r2   r  r  s      r3   r  Join.replace_table  s     II++ME	r6   )rQ  r   N)r   r   rQ  r   rQ   rR   rs   rf  Sequence[Table]r  r  rQ   rR   rc  )
rT   rU   rV   rW   r4   re   r  r    r  rY   rZ   r6   r3   rk  rk    s'     F Fr6   rk  c                  ^   ^  \ rS rSrSSU 4S jjjrS	U 4S jjrS
S jr\SS j5       rSr	U =r
$ )rs  i  c                <   > [         TU ]  X5        X0l        X@l        g r.   )r_   r4   r   rt  )r2   r   rQ  criteriart  ra   s        r3   r4   JoinOn.__init__  s    #!r6   c                   > [         TU ]  " S0 UD6nSR                  UU R                  R                  " SSS0UD6U R                  (       a  SU R                   3S9$ SS9$ )Nz{join} ON {criterion}{collate}r  Tz	 COLLATE r  )r  r   rt  rZ   )r_   re   r   r   rt  r2   rg   join_sqlra   s      r3   re   JoinOn.get_sql  ss    7?,V,/66nn,,EdEfE26,,i~. 7 
 	
 EG 7 
 	
r6   c           
     ~   [        U R                  R                  5        Vs/ s H  o3R                  PM     sn5      n[        U5      U Vs1 s H  oUR                  iM     sn-  U R                  1-  nXF-
  nU(       a5  [        SR                  SR                  [        [        U5      5      S95      eg s  snf s  snf )NzInvalid join criterion. One field is required from the joined item and another from the selected table or an existing join.  Found [{tables}], )r   )
r  r   r  r<   r   r   r   r  maprP   )r2   rf  r  fcriterion_tablesr  available_tablesmissing_tabless           r3   r  JoinOn.validate  s    1G1G1IJ1IA1IJKu:v(Fvtv(FF$))T)<YY_Y_99Sn%=> Z` Z    K(Fs   B5B:c                    U R                   U:X  a  UOU R                   U l         U R                  R                  X5      U l        gr  )r   r   r  r  s      r3   r  JoinOn.replace_table  s2     "&m!;I	55mOr6   )rt  r   r   r.   )
r   r   rQ  r   r  r(   rt  r   rQ   rR   rs   r  rc  rT   rU   rV   rW   r4   re   r  r    r  rY   rw   rx   s   @r3   rs  rs    s-     


 P Pr6   rs  c                  Z   ^  \ rS rSrSU 4S jjrSU 4S jjrS	S jr\S
S j5       rSr	U =r
$ )r|  i  c                0   > [         TU ]  X5        X0l        g r.   )r_   r4   ri  )r2   r   rQ  ri  ra   s       r3   r4   JoinUsing.__init__  s    #r6   c                   >^ [         TU ]  " S0 TD6nSR                  USR                  U4S jU R                   5       5      S9$ )Nz{join} USING ({fields})r  c              3  F   >#    U  H  oR                   " S0 TD6v   M     g 7frd   r   )r  r?   rg   s     r3   r  $JoinUsing.get_sql.<locals>.<genexpr>  s     MMM3F3r  )r  ri  rZ   )r_   re   r   r  ri  r  s    ` r3   re   JoinUsing.get_sql  sE    7?,V,(//88MMM 0 
 	
r6   c                    g r.   rZ   r  s      r3   r  JoinUsing.validate  r  r6   c                    U R                   U:X  a  UOU R                   U l         U R                   Vs/ s H  o3R                  X5      PM     snU l        gs  snf r  )r   ri  r  )r2   r  r  r?   s       r3   r  JoinUsing.replace_table  sF     "&m!;I	RVR]R]^R]**=DR]^^s   A)ri  r   )r   r   rQ  r   ri  ri  rQ   rR   rs   r  rc  r  rx   s   @r3   r|  r|    s(    
 _ _r6   r|  c                     \ rS rSrSrSrSrSr\r	S!S"S jjr
S#S jr\S$S j5       r\S%S	 j5       r\S%S
 j5       r\S%S j5       r\S&S j5       r\S'S j5       r\S(S j5       r\S(S j5       r\  S)           S*S jj5       r\S+S j5       r\S%S j5       rS,S jrS,S jrS-S jrS.S jrS.S jrS.S jrS-S jrS-S jrS-S jr S,S jr!S/S jr"S-S jr#S-S jr$S r%g)0r#  i  z-
Query builder used to build CREATE queries.
r   r  Nc                    S U l         SU l        SU l        S U l        / U l        / U l        SU l        S U l        / U l        SU l	        Xl
        S U l        S U l        S U l        S U l        S U l        g r  )_create_table
_temporary	_unlogged
_as_selectr  _period_fors_with_system_versioning_primary_key_uniques_if_not_existsr  _foreign_key_foreign_key_reference_table_foreign_key_reference_foreign_key_on_update_foreign_key_on_deleter2   r  s     r3   r4   CreateQueryBuilder.__init__  sz    !',$ # ,0)&*#7;#7;#r6   c                    UR                  SU R                  5        UR                  SU R                  5        UR                  SU R                  5        g Nr   r  r  r  r  r  r  rf   s     r3   r  'CreateQueryBuilder._set_kwargs_defaults  A    ,80$2K2KL)T\\2r6   c                    U R                   (       a  [        S5      e[        U[        5      (       a  Xl         g[        U5      U l         g)z
Creates the table.

:param table:
    An instance of a Table object or a string table name.

:raises AttributeError:
    If the table is already created.

:return:
    CreateQueryBuilder.
z1'Query' object already has attribute create_tableN)r  r   rj   r   r  s     r3   r$  CreateQueryBuilder.create_table  s6      !TUU&0&>&>UE%Lr6   c                    SU l         g)z>
Makes the table temporary.

:return:
    CreateQueryBuilder.
TN)r  rB   s    r3   	temporaryCreateQueryBuilder.temporary)  s     r6   c                    SU l         g)z=
Makes the table unlogged.

:return:
    CreateQueryBuilder.
TN)r  rB   s    r3   unloggedCreateQueryBuilder.unlogged3  s     r6   c                    SU l         g)z;
Adds system versioning.

:return:
    CreateQueryBuilder.
TNr  rB   s    r3   with_system_versioning)CreateQueryBuilder.with_system_versioning=  s     (,$r6   c                   U R                   (       a  [        S5      eU Hd  n[        U[        5      (       a  [	        U5      nO%[        U[
        5      (       a  [	        US   US   S9nU R                  R                  U5        Mf     g)z
Adds the columns.

:param columns:
    Type:  Union[str, TypedTuple[str, str], Column]

    A list of columns.

:raises AttributeError:
    If the table is an as_select table.

:return:
    CreateQueryBuilder.
z.'Query' object already has attribute as_selectr   r   r	  N)r  r   rj   rP   r   r   r  r   r2   r
  r  s      r3   r
  CreateQueryBuilder.columnsG  sj      ?? !QRRF&#&&FE**F1I6!9MMM  ( r6   c                N    U R                   R                  [        XU5      5        g)z
Adds a PERIOD FOR clause.

:param name:
    The period name.

:param start_column:
    The column that starts the period.

:param end_column:
    The column that ends the period.

:return:
    CreateQueryBuilder.
N)r  r   r  r  s       r3   
period_forCreateQueryBuilder.period_fora  s    " 	  4z!JKr6   c                X    U R                   R                  U R                  U5      5        g)z
Adds a UNIQUE constraint.

:param columns:
    Type:  Union[str, Column]

    A list of columns.

:return:
    CreateQueryBuilder.
N)r  r   _prepare_columns_inputr2   r
  s     r3   uniqueCreateQueryBuilder.uniquet  s!     	T88ABr6   c                h    U R                   (       a  [        S5      eU R                  U5      U l         g)z
Adds a primary key constraint.

:param columns:
    Type:  Union[str, Column]

    A list of columns.

:raises AttributeError:
    If the primary key is already defined.

:return:
    CreateQueryBuilder.
z0'Query' object already has attribute primary_keyN)r  r   r  r  s     r3   primary_keyCreateQueryBuilder.primary_key  s,       !STT 77@r6   c                    U R                   (       a  [        S5      eU R                  U5      U l         X l        U R                  U5      U l        X@l        XPl        g)a	  
Adds a foreign key constraint.

:param columns:
    Type:  List[Union[str, Column]]

    A list of foreign key columns.

:param reference_table:
    Type: Union[str, Table]

    The parent table name.

:param reference_columns:
    Type: List[Union[str, Column]]

    Parent key columns.

:param on_delete:
    Type: ReferenceOption

    Delete action.

:param on_update:
    Type: ReferenceOption

    Update option.

:raises AttributeError:
    If the foreign key is already defined.

:return:
    CreateQueryBuilder.
z0'Query' object already has attribute foreign_keyN)r  r   r  r  r  r  r  )r2   r
  reference_tablereference_columns	on_delete	on_updates         r3   foreign_keyCreateQueryBuilder.foreign_key  sS    V  !STT 77@,;)&*&A&ABS&T#&/#&/#r6   c                    U R                   (       a  [        S5      e[        U[        5      (       d  [	        S5      eXl        g)z
Creates the table from a select statement.

:param query_builder:
    The query.

:raises AttributeError:
    If columns have been defined for the table.

:return:
    CreateQueryBuilder.
z,'Query' object already has attribute columnsz.Expected 'item' to be instance of QueryBuilderN)r  r   rj   r(   r   r  )r2   query_builders     r3   	as_selectCreateQueryBuilder.as_select  s5     == !OPP-66LMM'r6   c                    SU l         g r  r  rB   s    r3   if_not_exists CreateQueryBuilder.if_not_exists  
    "r6   c                X   U R                  U5        U R                  (       d  gU R                  (       d  U R                  (       d  gU R                  " S0 UD6nU R                  (       a  X R
                  " S0 UD6-   $ U R                  " S0 UD6nU R                  " S0 UD6nU SU SU 3$ )zR
Gets the sql statement string.

:return: The create table statement.
:rtype: str
r  z ()rZ   )r  r  r  r  _create_table_sql_as_select_sql	_body_sql_table_options_sql)r2   rg   r$  bodytable_optionss        r3   re   CreateQueryBuilder.get_sql  s     	!!&)!!}}T__--77??"5"5"?"???~~''//9&9r$q88r6   c           	         SnU R                   (       a  SnOU R                  (       a  SnSnU R                  (       a  SnSR                  UUU R                  R
                  " S0 UD6S9$ )Nr  z
TEMPORARY z	UNLOGGED zIF NOT EXISTS z/CREATE {table_type}TABLE {if_not_exists}{table})
table_typer  r<   rZ   )r  r  r  r   r  re   )r2   rg   r  r  s       r3   r  $CreateQueryBuilder._create_table_sql  sh    
??%J^^$J,M@GG!'$$,,6v6 H 
 	
r6   c                6    SnU R                   (       a  US-  nU$ )Nr  z WITH SYSTEM VERSIONINGr  )r2   rg   r  s      r3   r  %CreateQueryBuilder._table_options_sql  s!    ''66Mr6   c                d    U R                    Vs/ s H  o"R                  " S0 UD6PM     sn$ s  snf rd   )r  re   )r2   rg   r  s      r3   _column_clauses"CreateQueryBuilder._column_clauses  s(    7;}}E}V((}EEE   -c                d    U R                    Vs/ s H  o"R                  " S0 UD6PM     sn$ s  snf rd   )r  re   )r2   rg   r  s      r3   _period_for_clauses&CreateQueryBuilder._period_for_clauses  s.    ?C?P?PQ?P"",V,?PQQQr   c           	        ^ U R                    Vs/ s H+  nSR                  SR                  U4S jU 5       5      S9PM-     sn$ s  snf )NzUNIQUE ({unique})r  c              3  F   >#    U  H  oR                   " S0 TD6v   M     g 7frd   r   r  r  rg   s     r3   r  9CreateQueryBuilder._unique_key_clauses.<locals>.<genexpr>  s      6jciY_7J7J7TV7Tcir  )r  )r  r   r  )r2   rg   r  s    ` r3   _unique_key_clauses&CreateQueryBuilder._unique_key_clauses  sL     --
'  &&chh6jci6j.j&k'
 	
 
s   2Ac                h   ^ SR                  SR                  U4S jU R                   5       5      S9$ )NzPRIMARY KEY ({columns})r  c              3  F   >#    U  H  oR                   " S0 TD6v   M     g 7frd   r  r  s     r3   r  9CreateQueryBuilder._primary_key_clause.<locals>.<genexpr>$       [IZv00:6:IZr  r   )r   r  r  rf   s    `r3   _primary_key_clause&CreateQueryBuilder._primary_key_clause"  s3    (//HH[IZIZ[[ 0 
 	
r6   c                  ^ SR                  SR                  U4S jU R                   5       5      U R                  R                  " S0 TD6SR                  U4S jU R
                   5       5      S9nU R                  (       a  USU R                  R                  -   -  nU R                  (       a  USU R                  R                  -   -  nU$ )	NzEFOREIGN KEY ({columns}) REFERENCES {table_name} ({reference_columns})r  c              3  F   >#    U  H  oR                   " S0 TD6v   M     g 7frd   r  r  s     r3   r  9CreateQueryBuilder._foreign_key_clause.<locals>.<genexpr>)  r  r  c              3  F   >#    U  H  oR                   " S0 TD6v   M     g 7frd   r  r  s     r3   r  r  +  s     &oSn':':'DV'DSnr  )r
  rK  r  z ON DELETE z ON UPDATE rZ   )	r   r  r  r  re   r  r  r  r  )r2   rg   r  s    ` r3   _foreign_key_clause&CreateQueryBuilder._foreign_key_clause'  s    X__HH[IZIZ[[88@@J6J!hh&oSWSnSn&oo ` 

 &&md&A&A&G&GGGF&&md&A&A&G&GGGFr6   c                `   U R                   " S0 UD6nX R                  " S0 UD6-  nX R                  " S0 UD6-  nU R                  (       a!  UR	                  U R
                  " S0 UD65        U R                  (       a!  UR	                  U R                  " S0 UD65        SR                  U5      $ )Nr  rZ   )	r  r  r	  r  r   r  r  r  r  )r2   rg   r  s      r3   r  CreateQueryBuilder._body_sql4  s    &&00++5f55++5f55NN433=f=>NN433=f=>xx  r6   c                T    SR                  U R                  R                  " S0 UD6S9$ )Nz AS ({query})r  rZ   )r   r  re   rf   s     r3   r  !CreateQueryBuilder._as_select_sql@  s/    %%//))3F3 & 
 	
r6   c                r    U Vs/ s H%  n[        U[        5      (       a  UO
[        U5      PM'     sn$ s  snf r.   )rj   r   r  s      r3   r  )CreateQueryBuilder._prepare_columns_inputE  s1    Y`aY`v:ff556&>IY`aaas   ,4c                "    U R                  5       $ r.   r   rB   s    r3   r   CreateQueryBuilder.__str__H  r  r6   c                "    U R                  5       $ r.   r  rB   s    r3   r   CreateQueryBuilder.__repr__K  r  r6   )r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r.   r  rb  rQ   rR   rl  r<   rR  rQ   rR   re  r
  zstr | tuple[str, str] | ColumnrQ   rR   )r  r  r  r  rQ   rR   )r
  r  rQ   rR   )NN)r
  list[str | Column]r  rP  r  r$  r  r   r  r   rQ   rR   )r  r(   rQ   rR   rs   rS   )rQ   rj  )r
  r$  rQ   list[Column])&rT   rU   rV   rW   r  r  r  r  r   rm  r4   r  r    r$  r  r  r  r
  r  r  r  r  r  r  re   r  r  r  r  r	  r  r  r  r  r  r   r   rY   rZ   r6   r3   r#  r#    s    JI<$3
 Q Q$     , , ) )2 L L$ C C A A&  &*%)00#00 %00 .	00
 #00 #00 
00 00d ( (* # #92
"FR



!

br6   r#  c                      \ rS rSrSS jr\SS j5       r\SS j5       r\SS j5       r\SS j5       r	\SS j5       r
\SS j5       rSS	 jrSS
 jrSS jrSrg)r(  iO  c                X    S U l         / U l        S U l        S U l        SU l        SU l        g r  )_indexr  _tabler  
_is_uniquer  rB   s    r3   r4   CreateIndexBuilder.__init__P  s-    #r6   c                    Xl         g r.   )r(  r2   r+  s     r3   r)  CreateIndexBuilder.create_indexX  rq  r6   c                    U Hd  n[        U[        5      (       a  [        U5      nO%[        U[        5      (       a  [        US   US   S9nU R                  R                  U5        Mf     g )Nr   r   r	  )rj   rP   r   r   r  r   r  s      r3   r
  CreateIndexBuilder.columns\  sU    F&#&&FE**F1I6!9MMM  ( r6   c                    Xl         g r.   )r)  r  s     r3   ru  CreateIndexBuilder.one  rq  r6   c                ^    U R                   (       a  U =R                   U-  sl         gXl         g)z
Partial index where clause.
N)r  r0  s     r3   r4  CreateIndexBuilder.wherei  s    
 <<LLI%L$Lr6   c                    SU l         g r  )r*  rB   s    r3   r  CreateIndexBuilder.uniques  	    r6   c                    SU l         g r  r  rB   s    r3   r   CreateIndexBuilder.if_not_existsw  r  r6   c                "   U R                   (       a  [        U R                   5      S:X  a  [        S5      eU R                  (       d  [        S5      eSR	                  U R                    Vs/ s H  oR
                  PM     sn5      nU R                  (       a  SOSnU R                  (       a  SOSnSU S	U S
U R                   SU R                   SU S3nU R                  (       a  USU R                   3-  nUR                  SS
5      $ s  snf )Nr   z#Cannot create index without columnsz!Cannot create index without tabler  UNIQUEr  zIF NOT EXISTSzCREATE z INDEX r  z ON (r  z WHERE z  )r  r   r   r)  r  r>   r*  r  r(  r  r  )r2   ccolumns_str
unique_strif_not_exists_strbase_sqls         r3   re   CreateIndexBuilder.get_sql{  s    }}DMM 2a 7 !FGG{{ !DEEii ?A ?@!%Xb
/3/B/BOZL0A/B!DKK=PTUYU`U`Taabcnboopq<<'$,,00Hc** !@s   +Dc                "    U R                  5       $ r.   r   rB   s    r3   r   CreateIndexBuilder.__str__  r  r6   c                "    U R                  5       $ r.   r  rB   s    r3   r   CreateIndexBuilder.__repr__  r  r6   )r  r  r(  r*  r)  r  Nre  )r+  rQ  rQ   rR   r#  r"  rf  rS   )rT   rU   rV   rW   r4   r    r)  r
  ru  r4  r  r  re   r   r   rY   rZ   r6   r3   r(  r(  O  s    $   ) )   % %   # #+r6   r(  c                      \ rS rSrSrSrSrSr\r	SSS jjr
SS jr\SS j5       r\SS	 j5       r\SS
 j5       r\SS j5       r\SS j5       r\SS j5       rSS jrSS jrSS jrSS jrSrg)r.  i  z+
Query builder used to build DROP queries.
r   r  Nc                :    S U l         SU l        S U l        Xl        g )Nr  )_drop_target_kind_drop_target
_if_existsr  r  s     r3   r4   DropQueryBuilder.__init__  s    !%46r6   c                    UR                  SU R                  5        UR                  SU R                  5        UR                  SU R                  5        g r  r  rf   s     r3   r  %DropQueryBuilder._set_kwargs_defaults  r  r6   c                l    [        U[        5      (       a  UO
[        U5      nU R                  SU5        g )NDATABASE)rj   r   _set_target)r2   r0  targets      r3   r/  DropQueryBuilder.drop_database  s*    '(;;(ASV,r6   c                l    [        U[        5      (       a  UO
[        U5      nU R                  SU5        g )NTABLE)rj   r   rQ  )r2   r<   rR  s      r3   r3  DropQueryBuilder.drop_table  s)    $UE22e&)r6   c                (    U R                  SU5        g )NUSERrQ  )r2   r7  s     r3   r6  DropQueryBuilder.drop_user      &r6   c                (    U R                  SU5        g )NVIEWrY  )r2   r<  s     r3   r;  DropQueryBuilder.drop_view  r[  r6   c                (    U R                  SU5        g )NINDEXrY  r-  s     r3   r?  DropQueryBuilder.drop_index  s    %(r6   c                    SU l         g r  )rK  rB   s    r3   	if_existsDropQueryBuilder.if_exists  r7  r6   c                T    U R                   (       a  [        S5      eXl        X l         g )Nz4'DropQuery' object already has attribute drop_target)rJ  r   rI  )r2   kindrR  s      r3   rQ  DropQueryBuilder._set_target  s#     !WXX!%"r6   c                J   U R                  U5        U R                  (       a  SOSnSn[        U R                  [        [
        45      (       a  U R                  R                  " S0 UD6nO [        U R                  U R                  5      nSR                  U R                  X#S9$ )Nz
IF EXISTS r  zDROP {kind} {if_exists}{name})rf  rc  r>   rZ   )r  rK  rj   rJ  r   r   re   r"   r  r   rI  )r2   rg   rc  target_names       r3   re   DropQueryBuilder.get_sql  s    !!&)$(OOL	d''(E):;;++33=f=K'(9(94??KK.55''9 6 
 	
r6   c                "    U R                  5       $ r.   r   rB   s    r3   r   DropQueryBuilder.__str__  r  r6   c                "    U R                  5       $ r.   r  rB   s    r3   r   DropQueryBuilder.__repr__  r  r6   )rJ  rI  rK  r  r.   r!  rl  )r0  zDatabase | strrQ   rR   r"  )r7  rP   rQ   rR   )r<  rP   rQ   rR   )r+  rP   rQ   rR   re  )rf  rP   rR  zDatabase | Table | strrQ   rR   rs   rS   )rT   rU   rV   rW   r  r  r  r  r   rm  r4   r  r    r/  r3  r6  r;  r?  rc  rQ  re   r   r   rY   rZ   r6   r3   r.  r.    s     JI3
 - - * * ' ' ' ' ) )  #
r6   r.  )r   rT  rg   r   rQ   zlist[Table])r   rT  rQ   r%  )C
__future__r   syscollections.abcr   r   	functoolsr   typingr   r   r	   r
   pypika.enumsr   r   r   r   pypika.termsr   r   r   r   r   r   r   r   r   r   r   r   r   pypika.utilsr   r   r   r   r    r!   r"   r#   version_infor&   typing_extensions
__author__	__email__r'   r+   r\   rz   r   r   r   r   r  r  rS  r   rW  r(   rM  rk  rs  r|  r#  r(  r.  rZ   r6   r3   <module>r{     sf   " 
 $   7 7 J J   	 	 	 
7"*
	 T( 6$: $$ 6)v )}9J }9@2#, #,L" & @- @-FW:J W:tW+:t W+t*WR[ *ZF FB(PT (PV_ _@W Wt
= =@H Hr6   