
    Win*                      d dl mZ d dlZd dlmZ d dlmZ d dlmZ d dlm	Z	m
Z
mZmZ d dlmZmZmZmZ d dlmZmZmZmZmZmZmZmZmZmZmZmZmZ d d	l m!Z!m"Z"m#Z#m$Z$m%Z%m&Z&m'Z'm(Z( e	rejR                  d
k\  rd dlm*Z* nd dl+m*Z* dZ,dZ- edd      Z. G d de      Z/ G d de/      Z0 G d d      Z1 G d de1      Z2 G d de/      Z3d4dZ4 G d d      Z5d5dZ6 G d d       Z7e3Z8 G d! d"      Z9 G d# d$e/e      Z: G d% de/e      Z; G d& d'ee.         Z< G d( d)      Z= G d* d+e=      Z> G d, d-e=      Z? G d. d/      Z@ G d0 d1      ZA G d2 d3      ZBy)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                  l    e Zd Zd	dZed	d       Zd
dZedd       Ze	d
d       Z
e	d
d       ZddZy)
Selectablec                    || _         y Naliasselfr/   s     X/home/obispo/Crisostomo_bridge/mision_env/lib/python3.12/site-packages/pypika/queries.py__init__zSelectable.__init__2   s	    
    c                    || _         y r-   r.   r0   s     r2   as_zSelectable.as_5   s	    
r4   c                    t        ||       S )Ntable)r   r1   names     r2   fieldzSelectable.field9   s    T&&r4   c                    t        |       S r-   )r   r1   s    r2   starzSelectable.star<   s    Dzr4   c                $    | j                  |      S r-   r<   r:   s     r2   __getattr__zSelectable.__getattr__@       zz$r4   c                $    | j                  |      S r-   rA   r:   s     r2   __getitem__zSelectable.__getitem__D   rC   r4   c                    | j                   S r-   r.   r>   s    r2   get_table_namezSelectable.get_table_nameH   s    zzr4   N)r/   strreturnNone)r;   rH   rI   r   )rI   r   rI   rH   )__name__
__module____qualname__r3   r    r6   r<   propertyr?   r#   rB   rE   rG    r4   r2   r+   r+   1   sa      '          r4   r+   c                  :     e Zd Zdd fdZddZddZd	dZ xZS )
AliasedQueryc                B    t         |   |       || _        || _        y )Nr.   )superr3   r;   query)r1   r;   rU   	__class__s      r2   r3   zAliasedQuery.__init__M   s!    t$	
r4   c                j    | j                   | j                  S  | j                   j                  di |S NrP   )rU   r;   get_sqlr1   kwargss     r2   rY   zAliasedQuery.get_sqlR   s0    ::99!tzz!!+F++r4   c                X    t        |t              xr | j                  |j                  k(  S r-   )
isinstancerR   r;   r1   others     r2   __eq__zAliasedQuery.__eq__W   s!    %.J499

3JJr4   c                >    t        t        | j                              S r-   )hashrH   r;   r>   s    r2   __hash__zAliasedQuery.__hash__Z   s    C		N##r4   r-   )r;   rH   rU   zSelectable | NonerI   rJ   r[   r   rI   rH   )r_   rR   rI   boolrI   int)rL   rM   rN   r3   rY   r`   rc   __classcell__rV   s   @r2   rR   rR   L   s    
,
K$r4   rR   c                  B    e Zd ZdddZd	dZd	dZed
d       ZdddZy)SchemaNc                     || _         || _        y r-   )_name_parent)r1   r;   parents      r2   r3   zSchema.__init___   s    
r4   c                    t        |t              xr4 | j                  |j                  k(  xr | j                  |j                  k(  S r-   )r]   rk   rm   rn   r^   s     r2   r`   zSchema.__eq__c   s6    %(hTZZ5;;-Fh4<<[`[h[hKhhr4   c                &    | j                  |       S r-   r`   r^   s     r2   __ne__zSchema.__ne__f       ;;u%%%r4   c                    t        ||       S )NschemaTabler1   items     r2   rB   zSchema.__getattr__i   s    T$''r4   c                    t        | j                  |      }| j                  /dj                   | j                  j                  dd|i||      S |S )Nz{parent}.{schema}
quote_char)ro   rw   rP   )r"   rm   rn   formatrY   )r1   r}   r[   
schema_sqls       r2   rY   zSchema.get_sqlm   s[    "4::z:
<<#&--+t||++LzLVL! .  
 r4   r-   )r;   rH   ro   zSchema | NonerI   rJ   )r_   rk   rI   re   )r{   rH   rI   ry   r}   
str | Noner[   r   rI   rH   )	rL   rM   rN   r3   r`   rs   r#   rB   rY   rP   r4   r2   rk   rk   ^   s+    i& ( (	r4   rk   c                      e Zd Zedd       Zy)Databasec                    t        ||       S N)ro   rk   rz   s     r2   rB   zDatabase.__getattr__z   s    d4((r4   N)r{   rH   rI   rk   )rL   rM   rN   r#   rB   rP   r4   r2   r   r   y   s    ) )r4   r   c                       e Zd Zedd       Z	 	 	 d	 	 	 	 	 	 	 	 	 d fdZddZddZedd       Z	edd       Z
ddZddZdd	Zdd
ZddZddZddZddZ xZS )ry   c                    t        | t              r| S t        | t        t        f      rt	        d | dd  t        | d               S | t        |       S y )Nc                    t        ||       S r   r   )objss     r2   <lambda>z$Table._init_schema.<locals>.<lambda>   s    #)> r4      r   )r]   rk   listtupler   rv   s    r2   _init_schemazTable._init_schema   sV     ff%MftUm,>qr
FSYZ[S\L]^^&>!r4   c                    t         |   |       || _        | j                  |      | _        |xs t
        | _        d | _        d | _        t        | j                  t
              st        d      y )Nz,Expected 'query_cls' to be subclass of Query)rT   r3   _table_namer   _schemaQuery
_query_cls_for_for_portion
issubclass	TypeError)r1   r;   rw   r/   	query_clsrV   s        r2   r3   zTable.__init__   sf     	((0#,u	 $//51JKK 2r4   c                6    | j                   xs | j                  S r-   )r/   r   r>   s    r2   rG   zTable.get_table_name   s    zz-T---r4   c                   |j                  d      }t        | j                  |      }| j                  -dj	                   | j                  j
                  di ||      }| j                  r.dj	                  | | j                  j
                  di |      }n9| j                  r-dj	                  | | j                  j
                  di |      }t        || j                  fi |S )Nr}   z{schema}.{table})rw   r9   z{table} FOR {criterion})r9   	criterionz"{table} FOR PORTION OF {criterion}rP   )
getr"   r   r   r~   rY   r   r   r!   r/   )r1   r[   r}   	table_sqls       r2   rY   zTable.get_sql   s    ZZ-
!$"2"2J?	<<#*119M9M9M9WPV9W_h1iI99188yTeTXT]T]TeTeTohnTo8pI<CC+D4+<+<+D+D+Nv+N D I  	4::@@@r4   c                n    | j                   rt        d      | j                  rt        d      || _         y )N)'Query' object already has attribute for_0'Query' object already has attribute for_portion)r   AttributeErrorr   )r1   temporal_criterions     r2   for_z
Table.for_   s1    99 !LMM !STT&	r4   c                n    | j                   rt        d      | j                  rt        d      || _         y )Nr   r   )r   r   r   )r1   period_criterions     r2   for_portionzTable.for_portion   s2     !STT99 !LMM,r4   c                &    | j                  d      S N"r}   rY   r>   s    r2   __str__zTable.__str__       ||s|++r4   c                    t        |t              sy| j                  |j                  k7  ry| j                  |j                  k7  ry| j                  |j                  k7  ryyNFT)r]   ry   r   r   r/   r^   s     r2   r`   zTable.__eq__   sO    %'u000<<5==(::$r4   c                    | j                   r&dj                  | j                  | j                         S dj                  | j                        S )NzTable('{}', schema='{}')zTable('{}'))r   r~   r   r>   s    r2   __repr__zTable.__repr__   s=    <<-44T5E5Et||TT##D$4$455r4   c                &    | j                  |       S r-   rr   r^   s     r2   rs   zTable.__ne__   rt   r4   c                *    t        t        |             S r-   )rb   rH   r>   s    r2   rc   zTable.__hash__   s    CIr4   c                R     | j                   j                  |       j                  | S )a  
        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r1   termss     r2   r   zTable.select   s&     2t$$T*11599r4   c                8    | j                   j                  |       S )za
        Perform an UPDATE operation on the current table

        :return: QueryBuilder
        )r   updater>   s    r2   r   zTable.update   s     %%d++r4   c                R     | j                   j                  |       j                  | S )a  
        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     r2   r   zTable.insert   s&     1t##D)00%88r4   )rw   "str | list | tuple | Schema | NonerI   r   NNN)
r;   rH   rw   zSchema | str | Noner/   r   r   ztype[Query] | NonerI   rJ   rK   rd   )r   r   rI   rJ   )r   r   rI   rJ   )rI   re   )r_   r   rI   re   rf   )r   z'int | float | str | bool | Term | FieldrI   r(   rI   r(   )rL   rM   rN   staticmethodr   r3   rG   rY   r    r   r   r   r`   r   rs   rc   r   r   r   rh   ri   s   @r2   ry   ry      s    	 	 '+ (,LL $L 	L
 &L 
L .A  ' ' - -,6
&:,9r4   ry   c            	     6   g }| D ]  }t        |t              rBt        |      dk(  r4t        |d   |d   |j	                  d      |j	                  d            }n,t        ||j	                  d      |j	                  d            }|j                  |        |S )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   rw   r   )r;   r/   rw   r   )r;   rw   r   )r]   r   lenry   r   append)namesr[   tablesr;   ts        r2   make_tablesr      s     F dE"s4yA~!W1gzz(+ **[1	A zz(+ **[1A
 	a Mr4   c                  J    e Zd ZdZ	 	 	 d	 	 	 	 	 	 	 	 	 ddZd	dZd	dZd
dZy)ColumnzRepresents a column.Nc                    || _         || _        || _        |t        |t              r|| _        y t        |      | _        y r-   )r;   typenullabler]   r   r   default)r1   column_namecolumn_typer   r   s        r2   r3   zColumn.__init__  s:      		 ")/Z5NwT`ahTir4   c                t    |j                  d      }dj                  t        | j                  |            }|S )Nr}   z{name})r;   )r   r~   r"   r;   )r1   r[   r}   
column_sqls       r2   get_name_sqlzColumn.get_name_sql'  s9    ZZ-
__tyy*5 % 

 r4   c                h   dj                   | j                  di || j                  rdj                  | j                        nd| j                  dj                  | j                  rdnd      nd| j                  r.dj                  d | j                  j
                  di |z         nd      }|S )	Nz{name}{type}{nullable}{default}z {} NULLzNOT NULLzDEFAULT )r;   r   r   r   rP   )r~   r   r   r   r   rY   )r1   r[   r   s      r2   rY   zColumn.get_sql0  s    6==""",V,,0IIdii(2NRmmNgU\\DMM&zJmoQUQ]Q]ELL.Bdll.B.B.LV.L!LMce	 > 

 r4   c                &    | j                  d      S r   r   r>   s    r2   r   zColumn.__str__:  r   r4   r   )
r   rH   r   r   r   zbool | Noner   zAny | Term | NonerI   rJ   rd   rK   )rL   rM   rN   __doc__r3   r   rY   r   rP   r4   r2   r   r     sZ    
 #' $%)
j
j  
j 	
j
 #
j 

j,r4   r   c                     g }| D ]Q  }t        |t              r"t        |      dk(  rt        |d   |d         }nt        |      }|j	                  |       S |S )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   )r]   r   r   r   r   )r   columnsr;   columns       r2   make_columnsr   >  s]     G dE"s4yA~QT!WEF-Fv Nr4   c                      e Zd ZddZddZy)	PeriodForc                    || _         t        |t              r|n
t        |      | _        t        |t              r|| _        y t        |      | _        y r-   )r;   r]   r   start_column
end_columnr1   r;   r   r   s       r2   r3   zPeriodFor.__init__P  s?    	,6|V,LLRXYeRf(2:v(F*FS]L^r4   c           	         |j                  d      }dj                  t        | j                  |       | j                  j
                  di | | j                  j
                  di |      }|S )Nr}   z9PERIOD FOR {name} ({start_column_name},{end_column_name}))r;   start_column_nameend_column_namerP   )r   r~   r"   r;   r   r   r   )r1   r[   r}   period_for_sqls       r2   rY   zPeriodFor.get_sqlU  sl    ZZ-
T[[tyy*5<d//<<FvF8DOO88B6B \ 
 r4   N)r;   rH   r   str | Columnr   r   rI   rJ   rd   )rL   rM   rN   r3   rY   rP   r4   r2   r   r   O  s    _
	r4   r   c                     e Zd ZdZedd       Zedd       Zedd       Zedd       Zedd       Z	edd       Z
edd       Zedd	       Zedd
       Zedd       Zedd       Zedd       Zedd       Zedd       Zed d       Zy)!r   ai  
    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                    t        di |S rX   )r(   )clsr[   s     r2   _builderzQuery._builderw  s    %f%%r4   c                D     | j                   di |j                  |      S )aH  
        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
        rP   )r   r   r   r9   r[   s      r2   r   zQuery.from_{  s#     s||%f%++E22r4   c                4    t               j                  |      S )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   r9   s     r2   r   zQuery.create_table  s     "#0077r4   c                4    t               j                  |      S )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     r2   r   zQuery.create_index  s     "#0077r4   c                4    t               j                  |      S )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     r2   r   zQuery.drop_database  s      !//99r4   c                4    t               j                  |      S )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 table: An instance of a Table object or a string table name.

        :return: DropQueryBuilder
        )r   
drop_tabler   s     r2   r   zQuery.drop_table  s      !,,U33r4   c                4    t               j                  |      S )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     r2   r  zQuery.drop_user        !++D11r4   c                4    t               j                  |      S )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     r2   r  zQuery.drop_view  r  r4   c                4    t               j                  |      S )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     r2   r	  zQuery.drop_index  s      !,,U33r4   c                D     | j                   di |j                  |      S )aH  
        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
        rP   )r   r   r   s      r2   r   z
Query.into  s#     s||%f%**511r4   c                F     | j                   di |j                  ||      S rX   )r   with_)r   r9   r;   r[   s       r2   r  zQuery.with_  s#    s||%f%++E488r4   c                @      | j                   di |j                  | S )a  
        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
        rP   )r   r   )r   r   r[   s      r2   r   zQuery.select  s%     -|s||%f%,,e44r4   c                D     | j                   di |j                  |      S )aD  
        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
        rP   )r   r   r   s      r2   r   zQuery.update  s#     s||%f%,,U33r4   c                $    | |d<   t        |fi |S )z
        Convenience method for creating a Table that uses this Query class.

        :param table_name:
            Type: str

            A string table name.

        :return: Table
        r   rx   )r   
table_namer[   s      r2   ry   zQuery.Table  s     "{Z*6**r4   c                "    | |d<   t        |i |S )a!  
        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   r[   s      r2   TableszQuery.Tables  s     "{E,V,,r4   N)r[   r   rI   r(   )r9   zSelectable | strr[   r   rI   r(   )r9   str | TablerI   r   )r   str | IndexrI   r   )r   zDatabase | TablerI   r   )r9   r  rI   r   )r  rH   rI   r   )r  rH   rI   r   )r   r  rI   r   )r9   Table | strr[   r   rI   r(   )r9   zstr | Selectabler;   rH   r[   r   rI   r(   )r   zint | float | str | bool | Termr[   r   rI   r(   )r9   r  rI   r(   )r  rH   rI   _TableClass)r   tuple[str, str] | strr[   r   rI   zlist[_TableClass])rL   rM   rN   r   classmethodr   r   r   r   r   r   r  r  r	  r   r  r   r   ry   r  rP   r4   r2   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 + + - -r4   r   c                      e Zd ZdZdef	 	 	 	 	 	 	 	 	 d fdZedd       Zedd       Zedd       Z	edd       Z
edd       Zedd	       Zedd
       Zedd       ZddZddZddZddZdddZdddZddZddZ xZS ) _SetOperationa  
    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                ~    t         |   |       || _        ||fg| _        g | _        d | _        d | _        || _        y r-   )rT   r3   
base_query_set_operation	_orderbys_limit_offset_wrapper_cls)r1   r  set_operation_queryset_operationr/   wrapper_clsrV   s         r2   r3   z_SetOperation.__init__1  sG     	$ -/BCD'r4   c                   |D ]}  }t        |t              r$t        || j                  j                  d         n| j                  j                  |      }| j                  j                  ||j                  d      f        y Nr   r8   order)	r]   rH   r   r  _fromwrap_constantr  r   r   r1   fieldsr[   r<   s       r2   orderbyz_SetOperation.orderbyC  ss     	@E eS) e4??#8#8#;<__2259  NN!!5&**W*=">?	@r4   c                    || _         y r-   r  r1   limits     r2   r0  z_SetOperation.limitN  	    r4   c                    || _         y r-   r   r1   offsets     r2   r5  z_SetOperation.offsetR  	    r4   c                Z    | j                   j                  t        j                  |f       y r-   )r  r   r   unionr^   s     r2   r8  z_SetOperation.unionV  !    ""L$6$6#>?r4   c                Z    | j                   j                  t        j                  |f       y r-   )r  r   r   	union_allr^   s     r2   r;  z_SetOperation.union_allZ  !    ""L$:$:E#BCr4   c                Z    | j                   j                  t        j                  |f       y r-   )r  r   r   	intersectr^   s     r2   r>  z_SetOperation.intersect^  r<  r4   c                Z    | j                   j                  t        j                  |f       y r-   )r  r   r   	except_ofr^   s     r2   r@  z_SetOperation.except_ofb  r<  r4   c                Z    | j                   j                  t        j                  |f       y r-   )r  r   r   minusr^   s     r2   rB  z_SetOperation.minusf  r9  r4   c                $    | j                  |      S r-   r8  r^   s     r2   __add__z_SetOperation.__add__j      zz%  r4   c                $    | j                  |      S r-   r;  r^   s     r2   __mul__z_SetOperation.__mul__m      ~~e$$r4   c                $    | j                  |      S r-   rB  r^   s     r2   __sub__z_SetOperation.__sub__p  rF  r4   c                "    | j                         S r-   r   r>   s    r2   r   z_SetOperation.__str__s      ||~r4   c                   d}|j                  d| j                  j                         |j                  d| j                  j                          | j                  j                  d
d| j                  j
                  i|}|}| j                  D ]  \  }} |j                  d
d| j                  j
                  i|}	t        | j                  j                        t        |j                        k7  rt        dj                  ||	            ||j                  |j                  |	      z  } | j                  r| | j                  d
i |z  }| j                  || j                         z  }| j                   r|| j#                         z  }|r dj                  d
d	|i|}|r%t%        || j&                  xs | j(                  fi |S |S )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})rU   rP   )
setdefaultr  rQ  
QUOTE_CHARrY   wrap_set_operation_queriesr  r   _selectsr   r~   valuer  _orderby_sqlr  
_limit_sqlr   _offset_sqlr!   r/   r   )
r1   
with_aliasrR  r[   set_operation_templatebase_querystringquerystringr#  r"  set_operation_querystrings
             r2   rY   z_SetOperation.get_sqlv  s   !9)T__%<%<= 	,(B(BC24??22qDOO<f<fqjpq&262E2E 	.M.(C(;(C(C )CC)GM)% 4??++,4G4P4P0QQ+SSYSY/8Q TZ T  188"((7P 9  K	" >>,4,,6v66K;;"4??,,K<<4++--K,+,,I;I&IK#K1Ot?O?OZSYZZr4   c                   g }| j                   j                  D ch c]  }|j                   }}| j                  D ]y  \  }}|j                  r$|j                  |v rt	        |j                  |      n |j
                  dd|i|}|j                  |dj                  ||j                        n|       { dj                  dj                  |            S c c}w )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},r,  rP   )
r  rZ  r/   r  r"   rY   r   r~   r[  join)	r1   r}   r[   clausesr   selected_aliasesr<   directionalityrg  s	            r2   r\  z_SetOperation._orderby_sql  s     -1__-E-EFAGGFF%)^^ 		!E> ;;5;;2B#B ekk:6"U]]CjCFC  NNTbTn!((d>;O;O(Ptx		 %++CHHW4E+FF Gs   Cc                :    dj                  | j                        S )Nz OFFSET {offset})r5  )r~   r   r>   s    r2   r^  z_SetOperation._offset_sql  s    !(((==r4   c                :    dj                  | j                        S )Nz LIMIT {limit})r0  )r~   r  r>   s    r2   r]  z_SetOperation._limit_sql  s    &&T[[&99r4   )
r  r(   r"  r(   r#  r   r/   r   r$  type[ValueWrapper])r+  r   r[   r   rI   rJ   r0  rg   rI   rJ   r5  rg   rI   rJ   )r_   r+   rI   rJ   )r_   r+   rI   r  r_   r(   rI   r  rK   FFr_  re   rR  re   r[   r   rI   rH   r-   r   )rL   rM   rN   r   r   r3   r    r,  r0  r5  r8  r;  r>  r@  rB  rE  rI  rM  r   rY   r\  r^  r]  rh   ri   s   @r2   r  r  (  s    !*6( ( *( $	(
 ( (($ @ @     @ @ D D D D D D @ @!%!+ZG0>:r4   r  c                      e Zd ZdZdZdZdZdZeZ	dde
ddf	 	 	 	 	 	 	 	 	 dc fdZdddZeded	       Zedfd
       Zedgd       Zedhd       Zedid       Zedjd       Zedhd       Zedid       Zedid       Zedid       Zedkd       Zedkd       Zedjd       Zedjd       Zedjd       Zedld       Zedmd       Zedmd       Zedmd       Z ednd       Z!edjd       Z"edod       Z#edpd       Z$ee%jL                  f	 	 	 	 	 dqd        Z'drd!Z(drd"Z)drd#Z*drd$Z+drd%Z,drd&Z-drd'Z.drd(Z/drd)Z0edsd*       Z1edtd+       Z2edud,       Z3edud-       Z4edud.       Z5edud/       Z6edud0       Z7edvd1       Z8dud2Z9dud3Z:dud4Z;edwd5       Z<dx fd6Z=e>dydzd7       Z?d{d8Z@d|d9ZAd}d:ZBd~d;ZCdd<ZDdd=ZEdd>ZFdd?ZGdid@ZHddAZIddBZJddCZKddDZLddEZMddFZNdddGZOddHZPddIZQddJZRddKZSddLZTddMZUddNZVe>ddO       ZWddPZXdddQZYddRZZddSZ[dddTZ\dddUZ]ddVZ^ddWZ_dyddXZ`dyddYZa	 	 	 d	 	 	 	 	 	 	 	 	 ddZZb	 	 	 d	 	 	 	 	 	 	 	 	 dd[Zcdd\Zddydd]Zedydd^Zfdd_Zgdd`ZhddaZidb Zj xZkS )r(   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                H   t         |   d        g | _        d | _        d | _        d| _        d| _        g | _        g | _        g | _	        g | _
        g | _        g | _        d| _        d| _        d| _        d | _        d | _        g | _        d| _        d | _        d | _        g | _        g | _        g | _        g | _        d | _        d | _        g | _        d| _        t=               | _        d| _         d| _!        d| _"        d| _#        || _$        || _%        || _&        || _'        || _(        y )NFr   ))rT   r3   r(  _insert_table_update_table_delete_from_replace_withrZ  _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_tablerQ  
as_keywordrY  r!  	immutable)r1   rQ  rY  r$  r  r  rV   s         r2   r3   zQueryBuilder.__init__  s-    	
!!!
  !!#&5 "! #$*D''"r4   c                :   t        |       j                  t        |             }|j                  j                  | j                         t	        | j
                        |_        t	        | j                        |_        t	        | j                        |_        t	        | j                        |_        t	        | j                        |_	        t	        | j                        |_
        t	        | j                        |_        t	        | j                        |_        t	        | j                        |_        t	        | j                        |_        t	        | j                        |_        t	        | j                         |_        t	        | j"                        |_        |S r-   )r   __new____dict__r   r   r  r(  r  rZ  r  r  r  r  r  r  r  r  r  )r1   newones     r2   __copy__z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r4   c                J   | j                   j                  t        |t              rt	        |      n|       t        |t
        t        f      rW|j                  Jt        |t
              r|j                  }nd}t        | j                  |      }d|z  |_        |dz   | _        yyy)a  
        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   )
r(  r   r]   rH   ry   r(   r  r/   r  max)r1   
selectablesub_query_counts      r2   r   zQueryBuilder.from_  s     	

z*c/J%
+PZ[j<"?@ZEUEUE]*l3","<"<"#!$"6"6HO%7J#2Q#6D  F^@r4   c                   | j                   D cg c]  }||k(  r|n| c}| _         | j                  |k(  r|n| j                  | _        | j                  |k(  r|n| j                  | _        | j                  D cg c]  }|j	                  ||       c}| _        | j
                  D cg c]  }|j	                  ||       c}| _        | j                  D cg c]  }|j	                  ||       c}| _        | j                  D cg c]"  }|D cg c]  }|j	                  ||       c}$ c}}| _        | j                  r| j                  j	                  ||      nd| _        | j                  r| j                  j	                  ||      nd| _	        | j                  D 	cg c]  }	|	j	                  ||       c}	| _
        | j                  r| j                  j	                  ||      nd| _        | j                  r| j                  j	                  ||      nd| _        | j                  D 
cg c]  }
|
d   j	                  ||      |
d   f c}
| _        | j                  D cg c]  }|j	                  ||       c}| _        || j                  v r7| j                  j!                  |       | j                  j#                  |       yyc c}w c c}w c c}w c c}w c c}w c c}}w c c}	w c c}
w c c}w )ak  
        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   )r(  r{  r|  r  replace_tablerZ  r  r  r  r  r  r  r  r  r  r  removeadd)r1   current_table	new_tabler9   alias_queryr   r   
value_listr[  groupbyr,  rl  s               r2   r  zQueryBuilder.replace_table6  s    SWR\R\]5M#9iuD]
*.*<*<*MYSWSeSe*.*<*<*MYSWSeSe]a]g]ghkk//yIh
VZVcVcdF--mYGdVZVcVcdF--mYGdfjfrfr
Xb
SuU  	:S
 PT||t||11-KaeUYUdUd$//77yQjnY]YgYghg'//yIhQUQ^Q^33M9MdhSWSaSa55mYOgk\`\j\j
QXWQZ%%mY?L
 QUP[P[\t))-C\D444$$++M:$$((3 5+ ^ iddS
 i
 ]sA   K9K(KK	K'K")K'#K-0!K2'K7"K'c                R    t        ||      }| j                  j                  |       y r-   )rR   r  r   )r1   r  r;   r   s       r2   r  zQueryBuilder.with_\  s     z*

!r4   c                    | j                   t        ddz        | j                  rd| _        t	        |t
              r|| _         y t        |      | _         y )N$'Query' object has no attribute '%s'r   T)r{  r   rZ  r  r]   ry   r1   r9   s     r2   r   zQueryBuilder.intoa  sJ    ) !G&!PQQ== $D&0&>UE%Lr4   c                B   |D ]  }t        |t              r| j                  |       %t        |t              r| j	                  |       Gt        |t
        t        f      r| j                  |       o| j                  | j                  || j                                y N)r$  )
r]   r   _select_fieldrH   _select_field_strr   r   _select_otherr)  r!  r1   r   rg  s      r2   r   zQueryBuilder.selectk  s     	\D$&""4(D#&&&t,D8-A"BC""4(""4#5#5dHYHY#5#Z[	\r4   c                v    | j                   s| j                  s| j                  rt        ddz        d| _         y )Nr  deleteT)r}  rZ  r|  r   r>   s    r2   r  zQueryBuilder.deletew  s2    1C1C !G(!RSS r4   c                    | j                   | j                  s| j                  rt        ddz        t	        |t
              r|| _         y t        |      | _         y )Nr  r   )r|  rZ  r}  r   r]   ry   r  s     r2   r   zQueryBuilder.update~  sI    )T]]d>O>O !G(!RSS&0&>UE%Lr4   c                
   | j                   t        ddz        |rt        |d   t        t        f      r|d   }|D ]D  }t        |t
              rt        || j                         }| j                  j                  |       F y )Nr  r   r   r8   )	r{  r   r]   r   r   rH   r   r  r   r  s      r2   r   zQueryBuilder.columns  sy    % !G(!RSSZa4-8!HE 	'D$$T););<MM  &	'r4   c                0     | j                   |  d| _        y NF_apply_termsr~  r   s     r2   r   zQueryBuilder.insert  s    5!r4   c                0     | j                   |  d| _        y NTr  r   s     r2   replacezQueryBuilder.replace  s    5!r4   c                    |g|D ]c  }t        |t              r| j                  j                  |       /t        |t              s@| j                  j                  t        |             e y r-   )r]   r   r  r   rH   r1   rg  r   r   s       r2   force_indexzQueryBuilder.force_index  sW     	5A!U###**1-As###**584		5r4   c                    |g|D ]c  }t        |t              r| j                  j                  |       /t        |t              s@| j                  j                  t        |             e y r-   )r]   r   r  r   rH   r  s       r2   	use_indexzQueryBuilder.use_index  sW     	3A!U#!!((+As#!!((q2		3r4   c                    d| _         y r  r  r>   s    r2   distinctzQueryBuilder.distinct  s	    r4   c                    d| _         y r  r  r>   s    r2   
for_updatezQueryBuilder.for_update  s
    r4   c                    d| _         y r  )r  r>   s    r2   ignorezQueryBuilder.ignore  s	    r4   c                    | j                  |      sd| _        | j                  r| xj                  |z  c_        y || _        y r  )_validate_tabler  r  r1   r   s     r2   prewherezQueryBuilder.prewhere  s4    ##I."&D??OOy(O'DOr4   c                    t        |t              ry | j                  |      sd| _        | j                  r| xj                  |z  c_        y || _        y r  )r]   r   r  r  r  r  s     r2   wherezQueryBuilder.where  sA    i0##I."&D<<LLI%L$DLr4   c                x    t        |t              ry | j                  r| xj                  |z  c_        y || _        y r-   )r]   r   r  r  s     r2   havingzQueryBuilder.having  s+    i0==MMY&M%DMr4   c                x    t        |t              ry | j                  r| xj                  |z  c_        y || _        y r-   )r]   r   r  r  s     r2   qualifyzQueryBuilder.qualify  s+    i0>>NNi'N&DNr4   c                "   |D ]  }t        |t              rt        || j                  d         }nBt        |t              r2t        t        |      | j                  d         j                  |      }| j                  j                  |        y )Nr   r8   )r]   rH   r   r(  rg   r)  r  r   r  s      r2   r  zQueryBuilder.groupby  sn     	(D$$TA7D#&SYdjjm<JJ4PNN!!$'	(r4   c                    d| _         y r  )r  r>   s    r2   with_totalszQueryBuilder.with_totals  s
     r4   c           	     0   d|j                  d      k(  }| j                  rt        ddz        |D cg c]'  }t        |t        t
        t        f      rt        | n|) }}|r6|s| j                  st        d      d| _        | xj                  |z  c_        y dt        | j                        k  r@t        | j                  d   t              r#| j                  d   xj                  |z  c_        y | j                  j                  t        |        y c c}w )	Nmysqlvendorr  rollupzWAt least one group is required. Call Query.groupby(term) or passas parameter to rollup.Tr   )r   r  r   r]   r   r   r  r   r  r   r   r   argsr   )r1   r   r[   	for_mysqlrg  s        r2   r  zQueryBuilder.rollup  s    vzz(33	 !G(!RSS\abTXD42D!E4Obb%p  "&DNNe#NT^^$$DNN24F)ONN2##u,# NN!!&%.1# cs   ,Dc                    |D ]i  }t        |t              rt        || j                  d         n| j	                  |      }| j
                  j                  ||j                  d      f       k y r&  )r]   rH   r   r(  r)  r  r   r   r*  s       r2   r,  zQueryBuilder.orderby  s_     	@E9CE39OE%tzz!}5UYUgUghmUnENN!!5&**W*=">?	@r4   c                b   t        |t              rt        | ||d      S t        |t              r,|j                  | j                  |       t        | ||d      S t        |t              rt        | ||d      S t        |t              rt        | ||d      S t        dt        |      z        )Nr9   )
type_labelrR  zCannot join on type '%s')
r]   ry   Joinerr(   r/   _tag_subqueryrR   r+   
ValueErrorr   r1   r{   hows      r2   rl  zQueryBuilder.join  s     dE"$cg>>l+zz!""4($cjAAl+$cg>>j)$cjAA3d4j@AAr4   c                B    | j                  |t        j                        S r-   )rl  r   innerrz   s     r2   
inner_joinzQueryBuilder.inner_join&      yyx~~..r4   c                B    | j                  |t        j                        S r-   )rl  r   leftrz   s     r2   	left_joinzQueryBuilder.left_join)      yyx}}--r4   c                B    | j                  |t        j                        S r-   )rl  r   
left_outerrz   s     r2   left_outer_joinzQueryBuilder.left_outer_join,      yyx2233r4   c                B    | j                  |t        j                        S r-   )rl  r   rightrz   s     r2   
right_joinzQueryBuilder.right_join/  r  r4   c                B    | j                  |t        j                        S r-   )rl  r   right_outerrz   s     r2   right_outer_joinzQueryBuilder.right_outer_join2  s    yyx3344r4   c                B    | j                  |t        j                        S r-   )rl  r   outerrz   s     r2   
outer_joinzQueryBuilder.outer_join5  r  r4   c                B    | j                  |t        j                        S r-   )rl  r   
full_outerrz   s     r2   full_outer_joinzQueryBuilder.full_outer_join8  r  r4   c                B    | j                  |t        j                        S r-   )rl  r   crossrz   s     r2   
cross_joinzQueryBuilder.cross_join;  r  r4   c                B    | j                  |t        j                        S r-   )rl  r   rb   rz   s     r2   	hash_joinzQueryBuilder.hash_join>  r  r4   c                    || _         y r-   r.  r/  s     r2   r0  zQueryBuilder.limitA  r1  r4   c                    || _         y r-   r3  r4  s     r2   r5  zQueryBuilder.offsetE  r6  r4   c                P    t        | |t        j                  | j                        S r  )r  r   r8  r!  r^   s     r2   r8  zQueryBuilder.unionI      T5,*<*<$J[J[\\r4   c                P    t        | |t        j                  | j                        S r  )r  r   r;  r!  r^   s     r2   r;  zQueryBuilder.union_allM      T5,*@*@dN_N_``r4   c                P    t        | |t        j                  | j                        S r  )r  r   r>  r!  r^   s     r2   r>  zQueryBuilder.intersectQ  r  r4   c                P    t        | |t        j                  | j                        S r  )r  r   r@  r!  r^   s     r2   r@  zQueryBuilder.except_ofU  r  r4   c                P    t        | |t        j                  | j                        S r  )r  r   rB  r!  r^   s     r2   rB  zQueryBuilder.minusY  r  r4   c                    t        |t              st        |      n|}t        |t              s| j                  || j                        }| j
                  j                  ||f       y r  )r]   r   r   r)  r!  r  r   )r1   r<   r[  s      r2   r  zQueryBuilder.set]  sQ    $.ue$<e%%&&&u$:K:K&LEeU^,r4   c                $    | j                  |      S r-   rD  r^   s     r2   rE  zQueryBuilder.__add__d  rF  r4   c                $    | j                  |      S r-   rH  r^   s     r2   rI  zQueryBuilder.__mul__g  rJ  r4   c                $    | j                  |      S r-   rL  r^   s     r2   rM  zQueryBuilder.__sub__j  rF  r4   c                H    |j                   | _        |j                  | _        y r-   )startr   stopr  )r1   slices     r2   r  zQueryBuilder.slicem  s    {{jjr4   c                d    t        |t              st        |   |      S | j                  |      S r-   )r]   r  rT   rE   )r1   r{   rV   s     r2   rE   zQueryBuilder.__getitem__r  s,    $&7&t,,zz$r4   c                h    | D cg c]"  }|j                   xs |j                  |      $ c}S c c}w )Nr   )r/   rY   )	field_setr}   r<   s      r2   _list_aliaseszQueryBuilder._list_aliasesw  s-    QZ[Cu}}
}CC[[[s   '/c                    dt        | j                        k(  rt        d| d      |dk(  rd| _        t	               g| _        y | j                  t        || j                  d                y )Nr   zCannot select z, no FROM table specified.*Tr8   )r   r(  r   r  r   rZ  r  r   )r1   rg  s     r2   r  zQueryBuilder._select_field_str{  sa    DJJ >$7Q!RSS3; $D!VHDM5TZZ];<r4   c                   | j                   ry |j                  | j                  v ry t        |t              rj| j
                  D cg c]*  }t        |d      r|j                  |j                  k7  s)|, c}| _        | j                  j                  |j                         | j
                  j                  |       y c c}w )Nr9   )	r  r9   r  r]   r   rZ  hasattrr  r   )r1   rg  r   s      r2   r  zQueryBuilder._select_field  s    ::111dD!%)]]!'&':RVZV`V`djdpdpVpDM $$((4T"s   *B=0B=c                :    | j                   j                  |       y r-   )rZ  r   )r1   functions     r2   r  zQueryBuilder._select_other  s    X&r4   c                    g S r-   rP   r>   s    r2   fields_zQueryBuilder.fields_  s    	r4   c                   | j                   | j                  gz   | j                  z   j                  | j                         t        fdD              }t        j                  t              r@j                  j                  *|r(j                  j                  dz   j                  _	        | j                  j                         y )Nc              3  ^   K   | ]$  }t        |t              xr j                  v  & y wr-   )r]   ry   r{   ).0clausebase_tablesrl  s     r2   	<genexpr>z'QueryBuilder.do_join.<locals>.<genexpr>  s*     nX^Z6S499;SSns   *-2)r(  r|  r  validater  anyr]   r{   ry   r/   r   r   )r1   rl  table_in_queryr)  s    ` @r2   do_joinzQueryBuilder.do_join  s    jjD$6$6#77$**Dk4;;/nbmnndii'DIIOO,C #ii33c9DIIO4 r4   c                @    t        fd| j                  D              S )Nc              3  <   K   | ]  }|j                   k(    y wr-   )r{   )r'  rl  r9   s     r2   r*  z)QueryBuilder.is_joined.<locals>.<genexpr>  s     >$5DII%>s   )r-  r  r  s    `r2   	is_joinedzQueryBuilder.is_joined  s    >$++>>>r4   c                T   | j                   | j                  gz   }|j                         D ]v  }|j                  |v }|j                  | j                  D cg c]  }|j
                   c}v }t        |j                  du| | |j                  | j                  k7  g      sv y yc c}w )z
        Returns False if the term references a table not already part of the
        FROM clause or JOINS and True otherwise.
        NFT)r(  r|  r$  r9   r  r{   all)r1   rg  r)  r<   table_in_base_tablesrl  table_in_joinss          r2   r  zQueryBuilder._validate_table  s    
 jjD$6$6#77\\^ 	E#(;;+#= "[[4;;,O4TYY,OONKKt+,,&&KK4#5#55	 	  -Ps   B%c                V    d| j                   z  |_        | xj                   dz  c_         y )Nr  r   )r  r/   )r1   rR  s     r2   r  zQueryBuilder._tag_subquery  s%    $"6"66!r4   c           
     ,   | j                   t        ddz        |syt        |d   t        t        t
        f      s|g}|D ]L  }| j                  j                  |D cg c]%  }t        |t              r|n| j                  |      ' c}       N yc c}w )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   r]   r   r   r  r  r   r   r)  )r1   r   valuesr[  s       r2   r  zQueryBuilder._apply_terms  s    
 % !G(!RSS%(T5#$67GE 	wFLLnt uej*UD*AtGYGYZ_G`!` uv	w us   *B
c                :    | j                  | j                        S )N)rQ  )rY   rQ  r>   s    r2   r   zQueryBuilder.__str__  s    ||DLL|11r4   c                "    | j                         S r-   r   r>   s    r2   r   zQueryBuilder.__repr__  rO  r4   c                Z    t        |t              sy| j                  |j                  k(  syyr   )r]   r(   r/   r^   s     r2   r`   zQueryBuilder.__eq__  s%    %.zzU[[(r4   c                &    | j                  |       S r-   rr   r^   s     r2   rs   zQueryBuilder.__ne__  rt   r4   c                f    t        | j                        t        d | j                  D              z   S )Nc              3  2   K   | ]  }t        |        y wr-   )rb   )r'  r(  s     r2   r*  z(QueryBuilder.__hash__.<locals>.<genexpr>  s     %Lvd6l%Ls   )rb   r/   sumr(  r>   s    r2   rc   zQueryBuilder.__hash__  s%    DJJ#%L%L"LLLr4   c                   |j                  d| j                         |j                  d| j                         |j                  d| j                         |j                  d| j                         |j                  d| j
                         y )Nr}   secondary_quote_charalias_quote_charr  rQ  )rW  rX  SECONDARY_QUOTE_CHARALIAS_QUOTE_CHARr  rQ  rZ   s     r2   _set_kwargs_defaultsz!QueryBuilder._set_kwargs_defaults  sl    ,80$2K2KL,d.C.CD,8)T\\2r4   c                
   | j                         | j                  s%| j                  s| j                  s| j                  sy| j                  r| j                  s| j
                  sy| j                  r| j                  syt        | j                        }dt        | j                        k  }dt        | j                        k  xr t        | j                  d   t              }| j                  }| j                  xr | j                  }t        |||||g      d<   | j                  r| j                  r | j                   di nd}	|	 | j"                  di z  }	| j                  r*|	ddj%                  fd| j                  D              z   z  }	|	 | j&                  di z  }	| j                  r|	 | j(                  di z  }	| j*                  r|	 | j,                  di z  }	| j.                  |	| j1                         z  }	|	S | j                  r | j2                  di }	n"| j4                  s| j                  r| j                  r | j                   di nd}	| j6                  r|	 | j8                  di z  }	n|	 | j:                  di z  }	| j<                  r|	 | j>                  di z  }	| j
                  r|	 | j@                  di z  }	|	S |	d | jB                  di z   z  }	nV| j                  r | j                   di nd}	|	 | jB                  di z  }	| j                  r|	 | jD                  di z  }	| j                  r|	 | j(                  di z  }	| jF                  r|	 | jH                  di z  }	| jJ                  r|	 | jL                  di z  }	| jN                  r|	 | jP                  di z  }	| j                  r*|	ddj%                  fd| j                  D              z   z  }	| jR                  r|	 | jT                  di z  }	| j*                  r|	 | j,                  di z  }	| jV                  r4|	 | jX                  di z  }	| jZ                  r|	| j]                         z  }	| j^                  r|	 | j`                  di z  }	| jb                  r|	 | jd                  di z  }	| jf                  r|	 | jh                  di z  }	 | jj                  |	fi }	| jl                  r|	 | jn                  di z  }	|rdjq                  |		      }	|r>| jr                  | jt                  n| jr                  d
<   tw        |	| jx                  fi S |	S )Nr   r   r   with_namespace c              3  B   K   | ]  } |j                   di   y wrX   r   r'  rl  r[   s     r2   r*  z'QueryBuilder.get_sql.<locals>.<genexpr>  s     -]ldll.DV.D-]   c              3  B   K   | ]  } |j                   di   y wrX   r   rL  s     r2   r*  z'QueryBuilder.get_sql.<locals>.<genexpr>J  s     )YT,$,,*@*@)YrM  rV  rU   rD  rP   )=rG  rZ  r{  r}  r|  r  r  re   r  r   r(  r]   r(   r  r-  r  	_with_sql_update_sqlrl  _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_CHARrF  r!   r/   )
r1   r_  rR  r[   	has_joinshas_multiple_from_clauseshas_subquery_from_clausehas_reference_to_foreign_tablehas_update_fromrb  s
      `      r2   rY   zQueryBuilder.get_sql  sD   !!&)!3!3t7H7HDL^L^t}}dmm%	$%DJJ$7!#$s4::#6#b:djjQRmUa;b )-)<)<&,,;#&)(.$
  6:jj.$..262bK+4++5f55K{{sSXX-]QUQ\Q\-]%]]]=4==2622Kzz~t~~777||t888{{&t00*$**4V4K""t'9'96:jj.$..262bK}}0t00:6::/t//9&99}}0t00:6::||/t//9&99""s%5T%5%5%?%??? 7;jj.$..262bK+4++5f55K!!~t~~777::>4>>3F33K;;?4??4V44K0400:6::K.4..888K;;3)YT[[)Y!YYYK??-4--777K<<?4??4V44K>>?4??4V44K!!t//11==+4++5f55K>>,4,,6v66K>>,4,,6v66K,d,,[CFC/4//9&99K%,,;,?K)-)D)D)L%%RVRmRm %& $KFvFFr4   c                    | j                   || j                         z  }| j                  r|| j                         z  }|S r-   )r  r]  r   r^  )r1   rb  r[   s      r2   rd  zQueryBuilder._apply_paginationp  s=    ;;"4??,,K<<4++--Kr4   c                R    ddj                  fd| j                  D              z   S )NzWITH rj  c              3  n   K   | ],  }|j                   d z    |j                  ddddz   dz    . yw)z AS (FrR  r_  z) NrP   )r;   rY   r'  r(  r[   s     r2   r*  z)QueryBuilder._with_sql.<locals>.<genexpr>z  sC      "
 KK'!NFNN$^Ee$^W]$^^aee"
s   25)rl  r  rZ   s    `r2   rP  zQueryBuilder._with_sqly  s,     "
**"
 
 
 	
r4   c                *    | j                   rd}|S d}|S )Nz	DISTINCT r   r  )r1   r[   r  s      r2   _distinct_sqlzQueryBuilder._distinct_sql  s    "&..; 79r4   c                *    | j                   rd}|S d}|S )Nz FOR UPDATEr   r  )r1   r[   r  s      r2   re  zQueryBuilder._for_update_sql  s"    &*&6&6]
 =?
r4   c                    dj                   | j                  di dj                  fd| j                  D                    S )NzSELECT {distinct}{select}rj  c              3  H   K   | ]  } |j                   dd d d  ywT)r_  rR  NrP   r   r'  rg  r[   s     r2   r*  z+QueryBuilder._select_sql.<locals>.<genexpr>  s'     mW[LDLLRD4R6Rm   ")r  r   rP   )r~   rr  rl  rZ  rZ   s    `r2   rZ  zQueryBuilder._select_sql  sG    *11'T''1&188m_c_l_lmm 2 
 	
r4   c                    dj                   | j                  j                  di || j                  rd      S d      S )NzINSERT {ignore}INTO {table}zIGNORE r   )r9   r  rP   )r~   r{  rY   r  rZ   s     r2   rW  zQueryBuilder._insert_sql  sN    ,33,$$$,,6v6 $9 4 
 	
24 4 
 	
r4   c                Z    dj                   | j                  j                  di |      S )NzREPLACE INTO {table}r8   rP   r~   r{  rY   rZ   s     r2   rV  zQueryBuilder._replace_sql  s3    %,,,$$$,,6v6 - 
 	
r4   c                      y)NDELETErP   )r[   s    r2   rU  zQueryBuilder._delete_sql  s    r4   c                Z    dj                   | j                  j                  di |      S )NzUPDATE {table}r8   rP   )r~   r|  rY   rZ   s     r2   rQ  zQueryBuilder._update_sql  s-    &&-GT-?-?-G-G-Q&-Q&RRr4   c                l    dj                  dj                  fd| j                  D                    S )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})rj  c              3  F   K   | ]  } |j                   dd di  yw)rI  FNrP   r   rw  s     r2   r*  z,QueryBuilder._columns_sql.<locals>.<genexpr>  s$     dd\T\\II&Ids   !r   )r~   rl  r  r1   rI  r[   s     `r2   rX  zQueryBuilder._columns_sql  s6     $$HHdVZVcVcdd % 
 	
r4   c                l    dj                  dj                  fd| j                  D                    S )Nz VALUES ({values})z),(c              3  R   K   | ]  }d j                  fd|D                 yw)rj  c              3  H   K   | ]  } |j                   dd d d  ywrv  r   rw  s     r2   r*  z5QueryBuilder._values_sql.<locals>.<genexpr>.<genexpr>  s'     `TXOOO`rx  N)rl  )r'  rowr[   s     r2   r*  z+QueryBuilder._values_sql.<locals>.<genexpr>  s&      eh`\_``s   $')r9  )r~   rl  r  rZ   s    `r2   rY  zQueryBuilder._values_sql  s:    #**:: lplxlx  + 
 	
r4   c                ^    dj                   | j                  j                  dddi|      S )Nz INTO {table}r_  Fr8   rP   r{  rZ   s     r2   r[  zQueryBuilder._into_sql  s8    %%,$$$,,HHH & 
 	
r4   c                l    dj                  dj                  fd| j                  D                    S )Nz FROM {selectable}rj  c              3  H   K   | ]  } |j                   dd d d  ywTro  NrP   r   rp  s     r2   r*  z)QueryBuilder._from_sql.<locals>.<genexpr>  s(     r]c X XQW Xrrx  r  )r~   rl  r(  r  s     `r2   rS  zQueryBuilder._from_sql  s4    #**xxrgkgqgqrr + 
 	
r4   c                l    dj                  dj                  fd| j                  D                    S )Nz USING {selectable}rj  c              3  H   K   | ]  } |j                   dd d d  ywr  r   rp  s     r2   r*  z*QueryBuilder._using_sql.<locals>.<genexpr>  s(     s]c X XQW Xsrx  r  )r~   rl  r  r  s     `r2   r\  zQueryBuilder._using_sql  s4    $++xxsgkgrgrss , 
 	
r4   c                l    dj                  dj                  fd| j                  D                    S )Nz FORCE INDEX ({indexes})rj  c              3  B   K   | ]  } |j                   di   y wrX   r   r'  r   r[   s     r2   r*  z0QueryBuilder._force_index_sql.<locals>.<genexpr>  s     V]U]]4V4VrM  indexes)r~   rl  r  rZ   s    `r2   r]  zQueryBuilder._force_index_sql  s3    )00HHV$BUBUVV 1 
 	
r4   c                l    dj                  dj                  fd| j                  D                    S )Nz USE INDEX ({indexes})rj  c              3  B   K   | ]  } |j                   di   y wrX   r   r  s     r2   r*  z.QueryBuilder._use_index_sql.<locals>.<genexpr>  s     T]U]]4V4TrM  r  )r~   rl  r  rZ   s    `r2   r^  zQueryBuilder._use_index_sql  s3    '..HHT$BSBSTT / 
 	
r4   c                `    dj                   | j                  j                  d|dd|      S )Nz PREWHERE {prewhere}Tr}   rR  )r  rP   )r~   r  rY   r1   r}   r[   s      r2   r_  zQueryBuilder._prewhere_sql  s9    %,,,T__,,\
T\U[\ - 
 	
r4   c                `    dj                   | j                  j                  d|dd|      S )Nz WHERE {where}Tr  )r  rP   )r~   r  rY   r  s      r2   rT  zQueryBuilder._where_sql  s4    &&-AT\\-A-A-qZbf-qjp-q&rrr4   c           	        g }| j                   D ch c]  }|j                   }}| j                  D ]l  }|rD|j                  r8|j                  |v r*|j                  t	        |j                  |xs |             I|j                   |j
                  d||d|       n dj                  dj                  |            }	| j                  r|	dz   S |	S c c}w )a  
        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}   rD  z GROUP BY {groupby}rj  )r  z WITH TOTALSrP   )	rZ  r/   r  r   r"   rY   r~   rl  r  )
r1   r}   rD  groupby_aliasr[   rm  r   rn  r<   sqls
             r2   r`  zQueryBuilder._group_sql  s      -1]];AGG;;^^ 	rE@P1P}U[[:J:XjYZ}u}}p
Uepiopq		r $**388G3D*E''
 <s   Cc                   g }| j                   D ch c]  }|j                   }}| j                  D ]  \  }}	|r4|j                  r(|j                  |v rt        |j                  |xs |      n |j                  d||d|}
|j                  |	dj                  |
|	j                        n|
        dj                  dj                  |            S c c}w )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.
        r  re  rf  ri  rj  rk  rP   )	rZ  r/   r  r"   rY   r   r~   r[  rl  )r1   r}   rD  orderby_aliasr[   rm  r   rn  r<   ro  rg  s              r2   r\  zQueryBuilder._orderby_sql  s    " -1]];AGG;;%)^^ 		!E> !U[[U[[DT5T ekk+;+IzJ"U]]fjK[f_ef  NNTbTn!((d>;O;O(Ptx		 %++CHHW4E+FF <s   Cc                     y)Nz WITH ROLLUPrP   r>   s    r2   ra  zQueryBuilder._rollup_sql  s    r4   c                ^    dj                   | j                  j                  dd|i|      S )Nz HAVING {having}r}   )r  rP   )r~   r  rY   r  s      r2   rb  zQueryBuilder._having_sql  s2    !((0E0E0E0fQ[0f_e0f(ggr4   c                ^    dj                   | j                  j                  dd|i|      S )Nz QUALIFY {qualify}r}   )r  rP   )r~   r  rY   r  s      r2   rc  zQueryBuilder._qualify_sql  s2    #**3I4>>3I3I3jU_3jci3j*kkr4   c                     d| j                    S )Nz OFFSET r3  r>   s    r2   r^  zQueryBuilder._offset_sql  s    $,,((r4   c                     d| j                    S )Nz LIMIT r.  r>   s    r2   r]  zQueryBuilder._limit_sql  s    &&r4   c                l    dj                  dj                  fd| j                  D                    S )Nz
 SET {set}rj  c              3     K   | ]E  \  }}d j                   |j                  di t        d       |j                  di        G yw)z{field}={value}F)rI  )r<   r[  NrP   )r~   rY   dict)r'  r<   r[  r[   s      r2   r*  z(QueryBuilder._set_sql.<locals>.<genexpr>#  s\       !E5 "(('%--M$ve*LMUbUZUbUbUlekUl ) s   AA)r  )r~   rl  r  rZ   s    `r2   rR  zQueryBuilder._set_sql!  s:    ""  %)MM	  # 
 	
r4   c                     || g|i |S )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")
            )
        rP   )r1   funcr  r[   s       r2   pipezQueryBuilder.pipe+  s    \ D*4*6**r4   )
rQ  Dialects | NonerY  re   r$  rr  r  re   r  re   r   )r  zSelectable | Query | strrI   rJ   r  Table | Noner  r  rI   rJ   )r  r+   r;   rH   rI   rJ   )r9   r  rI   rJ   )r   r   rI   rJ   rI   rJ   )rg  r  r   r  rI   rJ   )r   r   rI   rJ   r   zTerm | EmptyCriterionrI   rJ   )r   zstr | int | TermrI   rJ   )r   zlist | tuple | set | Termr[   r   rI   rJ   )r+  r   r[   r   rI   rJ   )r{   z0Table | QueryBuilder | AliasedQuery | Selectabler  r   rI   Joiner[Self])r{   #Table | QueryBuilder | AliasedQueryrI   r  rs  rt  ru  )r<   zField | strr[  r   rI   rJ   )r  r  rI   rJ   )r{   r   rI   zQueryBuilder | Fieldr-   )r  Sequence[Field]r}   r   rI   	list[str])rg  rH   rI   rJ   )rg  r   rI   rJ   )r"  r   rI   rJ   )rI   zlist[Field])rl  JoinrI   rJ   )r9   ry   rI   re   )rg  r   rI   re   )rR  r(   rI   rJ   rK   )r_   r(   rI   re   rf   r[   r  rI   rJ   rv  rw  )rb  rH   rI   rH   rd   )F)rI  re   r[   r   rI   rH   r   )NNT)
r}   r   rD  r   r  re   r[   r   rI   rH   )
r}   r   rD  r   r  re   r[   r   rI   rH   )lrL   rM   rN   r   rX  rE  rF  rf  r   	QUERY_CLSr   r3   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  rl  r  r  r  r  r  r  r  r  r  r0  r5  r8  r;  r>  r@  rB  r  rE  rI  rM  r  rE   r   r  r  r  r  r$  r/  r2  r  r  r  r   r   r`   rs   rc   rG  rY   rd  rP  rr  re  rZ  rW  rV  rU  rQ  rX  rY  r[  rS  r\  r]  r^  r_  rT  r`  r\  ra  rb  rc  r^  r]  rR  r  rh   ri   s   @r2   r(   r(     s   
 J!I $(+/*6 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)'
.+r4   c                  6    e Zd ZddZdd	dZd
dZd
dZddZy)r  c                <    || _         || _        || _        || _        y r-   )rU   r{   r  r  )r1   rU   r{   r  r  s        r2   r3   zJoiner.__init__]  s    
	$r4   Nc                    |%t        dj                  | j                              | j                  j	                  t        | j                  | j                  ||             | j                  S )NzIParameter 'criterion' is required for a {type} JOIN but was not supplied.r   )r   r~   r  rU   r/  JoinOnr{   r  )r1   r   collates      r2   onz	Joiner.onc  s[    44:FF4P 
 	

6$))TXXy'JKzzr4   c                x   |s%t        dj                  | j                              d }|D ]G  }t        || j                  j
                  d         t        || j                        k(  }||n||z  }I | j                  j                  t        | j                  | j                  |             | j                  S )NzFParameter 'fields' is required for a {type} JOIN but was not supplied.r  r   r8   )
r   r~   r  r   rU   r(  r{   r/  r  r  )r1   r+  r   r<   constituents        r2   on_fieldzJoiner.on_fieldm  s    [bbhlhwhwbx  	 	VETZZ-=-=a-@AU5X\XaXaEbbK'0'8i+>UI	V 	

6$))TXXyABzzr4   c                    |st        d      | j                  j                  t        | j                  | j
                  |D cg c]  }t        |       c}             | j                  S c c}w )NzUParameter 'fields' is required when joining with a using clause but was not supplied.)r   rU   r/  	JoinUsingr{   r  r   )r1   r+  r<   s      r2   usingzJoiner.using{  sT     wxx

9TYYU[:\E5<:\]^zz ;]s   A+c                    | j                   j                  t        | j                  t        j
                               | j                   S )zReturn cross join)rU   r/  r  r{   r   r  r>   s    r2   r  zJoiner.cross  s-    

4		8>>:;zzr4   )
rU   r'   r{   r  r  r   r  rH   rI   rJ   r-   )r   zCriterion | Noner  r   rI   r'   )r+  r   rI   r'   )rI   r'   )rL   rM   rN   r3   r  r  r  r  rP   r4   r2   r  r  \  s    %r4   r  c                  6    e Zd ZddZddZddZed	d       Zy)
r  c                     || _         || _        y r-   )r{   r  r  s      r2   r3   zJoin.__init__  s    	r4   c                    dj                   | j                  j                  dddd|      }| j                  j                  r'dj                  || j                  j                        S |S )NzJOIN {table}Tro  r8   z{type} {join})rl  r   rP   )r~   r{   rY   r  r[  )r1   r[   r  s      r2   rY   zJoin.get_sql  se    ###$))##MTdMfM $ 
 88>>"))s)HH
r4   c                     y r-   rP   r1   r(  r  s      r2   r,  zJoin.validate      r4   c                F    | j                   j                  ||      | _         yaX  
        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  r1   r  r  s      r2   r  zJoin.replace_table  s     II++M9E	r4   N)r{   r   r  r   rI   rJ   rd   r(  Sequence[Table]r  r  rI   rJ   r  )rL   rM   rN   r3   rY   r,  r    r  rP   r4   r2   r  r    s'     F Fr4   r  c                  H     e Zd Zdd fdZd fdZddZed	d       Z xZS )
r  c                B    t         |   ||       || _        || _        y r-   )rT   r3   r   r  )r1   r{   r  criteriar  rV   s        r2   r3   zJoinOn.__init__  s     s#!r4   c                    t        |   di |}dj                  | | j                  j                  dddi|| j                  rd| j                         S d      S )Nz{join} ON {criterion}{collate}rR  Tz	 COLLATE r   )rl  r   r  rP   )rT   rY   r~   r   r  r1   r[   join_sqlrV   s      r2   rY   zJoinOn.get_sql  su    7?,V,/66,dnn,,EdEfE26,,i~. 7 
 	
 EG 7 
 	
r4   c           
     t   t        | j                  j                         D cg c]  }|j                   c}      }t        |      |D ch c]  }|j                   c}z  | j                  hz  }||z
  }|r8t        dj                  dj                  t        t        |                        y c c}w c c}w )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$  r9   r{   r   r~   rl  maprH   )r1   r(  r  fcriterion_tablesrl  available_tablesmissing_tabless           r2   r,  zJoinOn.validate  s    1G1G1IJAJKu:v(Ft(FF$))T),<<YY_Y_99Sn%=> Z` Z    K(Fs   B0
B5c                    | j                   |k(  r|n| j                   | _         | j                  j                  ||      | _        yr  )r{   r   r  r  s      r2   r  zJoinOn.replace_table  s4     "&m!;I	55mYOr4   r-   )
r{   r   r  r   r  r(   r  r   rI   rJ   rd   r  r  	rL   rM   rN   r3   rY   r,  r    r  rh   ri   s   @r2   r  r    s(    


 P Pr4   r  c                  F     e Zd Zd fdZd fdZddZedd       Z xZS )	r  c                4    t         |   ||       || _        y r-   )rT   r3   r+  )r1   r{   r  r+  rV   s       r2   r3   zJoinUsing.__init__  s    s#r4   c                    t        |   di }dj                  |dj                  fd| j                  D                    S )Nz{join} USING ({fields})rj  c              3  B   K   | ]  } |j                   di   y wrX   r   )r'  r<   r[   s     r2   r*  z$JoinUsing.get_sql.<locals>.<genexpr>  s     MMEMM3F3MrM  )rl  r+  rP   )rT   rY   r~   rl  r+  r  s    ` r2   rY   zJoinUsing.get_sql  sE    7?,V,(//88MMM 0 
 	
r4   c                     y r-   rP   r  s      r2   r,  zJoinUsing.validate  r  r4   c                    | j                   |k(  r|n| j                   | _         | j                  D cg c]  }|j                  ||       c}| _        yc c}w r  )r{   r+  r  )r1   r  r  r<   s       r2   r  zJoinUsing.replace_table  sD     "&m!;I	RVR]R]^u**=)D^^s   A)r{   r   r  r   r+  r  rI   rJ   rd   r  r  r  ri   s   @r2   r  r    s(    
 _ _r4   r  c                  |   e Zd ZdZdZdZdZeZdd dZ	d!dZ
ed"d       Zed#d       Zed#d	       Zed#d
       Zed$d       Zed%d       Zed&d       Zed&d       Ze	 	 d'	 	 	 	 	 	 	 	 	 	 	 d(d       Zed)d       Zed#d       Zd*dZd*dZd+dZd,dZd,dZd,dZd+dZd+dZd+dZd*dZ d-dZ!d+dZ"d+dZ#y).r   z5
    Query builder used to build CREATE queries.
    r   ry  Nc                    d | _         d| _        d| _        d | _        g | _        g | _        d| _        d | _        g | _        d| _	        || _
        d | _        d | _        d | _        d | _        d | _        y r  )_create_table
_temporary	_unlogged
_as_selectr  _period_fors_with_system_versioning_primary_key_uniques_if_not_existsrQ  _foreign_key_foreign_key_reference_table_foreign_key_reference_foreign_key_on_update_foreign_key_on_deleter1   rQ  s     r2   r3   zCreateQueryBuilder.__init__  s|    !',$ # ,0)&*#7;#7;#r4   c                    |j                  d| j                         |j                  d| j                         |j                  d| j                         y Nr}   rC  rQ  rW  rX  rE  rQ  rZ   s     r2   rG  z'CreateQueryBuilder._set_kwargs_defaults  A    ,80$2K2KL)T\\2r4   c                    | j                   rt        d      t        |t              r|| _         yt        |      | _         y)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   r]   ry   r  s     r2   r   zCreateQueryBuilder.create_table  s5      !TUU&0&>UE%Lr4   c                    d| _         y)z^
        Makes the table temporary.

        :return:
            CreateQueryBuilder.
        TN)r  r>   s    r2   	temporaryzCreateQueryBuilder.temporary)  s     r4   c                    d| _         y)z]
        Makes the table unlogged.

        :return:
            CreateQueryBuilder.
        TN)r  r>   s    r2   unloggedzCreateQueryBuilder.unlogged3  s     r4   c                    d| _         y)z[
        Adds system versioning.

        :return:
            CreateQueryBuilder.
        TNr  r>   s    r2   with_system_versioningz)CreateQueryBuilder.with_system_versioning=  s     (,$r4   c                    | j                   rt        d      |D ]\  }t        |t              rt	        |      }n#t        |t
              rt	        |d   |d         }| j                  j                  |       ^ y)a  
        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   r]   rH   r   r   r  r   r1   r   r   s      r2   r   zCreateQueryBuilder.columnsG  si      ?? !QRR 	)F&#&FE*F1I6!9MMM  (	)r4   c                P    | j                   j                  t        |||             y)a&  
        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       r2   
period_forzCreateQueryBuilder.period_fora  s!    " 	  4z!JKr4   c                X    | j                   j                  | j                  |             y)z
        Adds a UNIQUE constraint.

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

            A list of columns.

        :return:
            CreateQueryBuilder.
        N)r  r   _prepare_columns_inputr1   r   s     r2   uniquezCreateQueryBuilder.uniquet  s!     	T88ABr4   c                ^    | j                   rt        d      | j                  |      | _         y)a  
        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     r2   primary_keyzCreateQueryBuilder.primary_key  s,       !STT 77@r4   c                    | j                   rt        d      | j                  |      | _         || _        | j                  |      | _        || _        || _        y)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  )r1   r   reference_tablereference_columns	on_delete	on_updates         r2   foreign_keyzCreateQueryBuilder.foreign_key  sY    V  !STT 77@,;)&*&A&ABS&T#&/#&/#r4   c                v    | j                   rt        d      t        |t              st	        d      || _        y)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   r]   r(   r   r  )r1   query_builders     r2   	as_selectzCreateQueryBuilder.as_select  s4     == !OPP-6LMM'r4   c                    d| _         y r  r  r>   s    r2   if_not_existsz CreateQueryBuilder.if_not_exists  
    "r4   c                2   | j                  |       | j                  sy| j                  s| j                  sy | j                  di |}| j                  r| | j
                  di |z   S  | j                  di |} | j                  di |}| d| d| S )zr
        Gets the sql statement string.

        :return: The create table statement.
        :rtype: str
        r   z ()rP   )rG  r  r  r  _create_table_sql_as_select_sql	_body_sql_table_options_sql)r1   r[   r   bodytable_optionss        r2   rY   zCreateQueryBuilder.get_sql  s     	!!&)!!}}T__-t--77??"5$"5"5"?"???t~~''///9&9r$q88r4   c           	         d}| j                   rd}n| j                  rd}d}| j                  rd}dj                  || | j                  j
                  di |      S )Nr   z
TEMPORARY z	UNLOGGED zIF NOT EXISTS z/CREATE {table_type}TABLE {if_not_exists}{table})
table_typer  r9   rP   )r  r  r  r~   r  rY   )r1   r[   r!  r  s       r2   r  z$CreateQueryBuilder._create_table_sql  sj    
??%J^^$J,M@GG!',$$$,,6v6 H 
 	
r4   c                ,    d}| j                   r|dz  }|S )Nr   z WITH SYSTEM VERSIONINGr  )r1   r[   r  s      r2   r  z%CreateQueryBuilder._table_options_sql  s!    ''66Mr4   c                `    | j                   D cg c]  } |j                  di | c}S c c}w rX   )r  rY   )r1   r[   r   s      r2   _column_clausesz"CreateQueryBuilder._column_clauses  s(    7;}}EV((EEE   +c                `    | j                   D cg c]  } |j                  di | c}S c c}w rX   )r  rY   )r1   r[   r  s      r2   _period_for_clausesz&CreateQueryBuilder._period_for_clauses  s-    ?C?P?PQ"
"",V,QQQr%  c           	         | j                   D cg c],  }dj                  dj                  fd|D                    . c}S c c}w )NzUNIQUE ({unique})rj  c              3  B   K   | ]  } |j                   di   y wrX   r   r'  r   r[   s     r2   r*  z9CreateQueryBuilder._unique_key_clauses.<locals>.<genexpr>  s#     6jY_7Jv7J7J7TV7T6jrM  )r  )r  r~   rl  )r1   r[   r  s    ` r2   _unique_key_clausesz&CreateQueryBuilder._unique_key_clauses  sG     --
  &&chh6jci6j.j&k
 	
 
s   1Ac                l    dj                  dj                  fd| j                  D                    S )NzPRIMARY KEY ({columns})rj  c              3  B   K   | ]  } |j                   di   y wrX   r*  r+  s     r2   r*  z9CreateQueryBuilder._primary_key_clause.<locals>.<genexpr>$  "     [v0V00:6:[rM  r  )r~   rl  r  rZ   s    `r2   _primary_key_clausez&CreateQueryBuilder._primary_key_clause"  s3    (//HH[IZIZ[[ 0 
 	
r4   c                   dj                  dj                  fd| j                  D               | j                  j                  di dj                  fd| j
                  D                    }| j                  r|d| j                  j                  z   z  }| j                  r|d| j                  j                  z   z  }|S )	NzEFOREIGN KEY ({columns}) REFERENCES {table_name} ({reference_columns})rj  c              3  B   K   | ]  } |j                   di   y wrX   r*  r+  s     r2   r*  z9CreateQueryBuilder._foreign_key_clause.<locals>.<genexpr>)  r/  rM  c              3  B   K   | ]  } |j                   di   y wrX   r*  r+  s     r2   r*  z9CreateQueryBuilder._foreign_key_clause.<locals>.<genexpr>+  s"     &o':v':':'DV'D&orM  )r   r  r  z ON DELETE z ON UPDATE rP   )	r~   rl  r  r  rY   r  r  r[  r  )r1   r[   r(  s    ` r2   _foreign_key_clausez&CreateQueryBuilder._foreign_key_clause'  s    X__HH[IZIZ[[@t88@@J6J!hh&oSWSnSn&oo ` 

 &&md&A&A&G&GGGF&&md&A&A&G&GGGFr4   c                P    | j                   di |}| | j                  di |z  }| | j                  di |z  }| j                  r!|j	                   | j
                  di |       | j                  r!|j	                   | j                  di |       dj                  |      S )Nrj  rP   )	r$  r'  r,  r  r   r0  r  r4  rl  )r1   r[   rm  s      r2   r  zCreateQueryBuilder._body_sql4  s    &$&&00+4++5f55+4++5f55NN3433=f=>NN3433=f=>xx  r4   c                Z    dj                   | j                  j                  di |      S )Nz AS ({query})rO  rP   )r~   r  rY   rZ   s     r2   r  z!CreateQueryBuilder._as_select_sql@  s1    %%)$//))3F3 & 
 	
r4   c                b    |D cg c]  }t        |t              r|n
t        |      ! c}S c c}w r-   )r]   r   r  s      r2   r  z)CreateQueryBuilder._prepare_columns_inputE  s(    Y`av:ff56&>Iaaas   $,c                "    | j                         S r-   r   r>   s    r2   r   zCreateQueryBuilder.__str__H  rO  r4   c                "    | j                         S r-   r<  r>   s    r2   r   zCreateQueryBuilder.__repr__K  rO  r4   r-   rQ  r  rI   rJ   r  r9   r  rI   rJ   r  r   zstr | tuple[str, str] | ColumnrI   rJ   )r   r   r   r   rI   rJ   )r   r   rI   rJ   )NN)r   list[str | Column]r  r  r  r=  r  r   r  r   rI   rJ   )r  r(   rI   rJ   rd   rK   )rI   r  )r   r=  rI   list[Column])$rL   rM   rN   r   rX  rE  rF  r   r  r3   rG  r    r   r  r  r   r   r  r  r
  r  r  r  rY   r  r  r$  r'  r,  r0  r4  r  r  r  r   r   rP   r4   r2   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r4   r   c                      e Zd ZddZedd       Zedd       Zedd       Zedd       Zedd       Z	edd       Z
ddZdd	Zdd
Zy)r   c                X    d | _         g | _        d | _        d | _        d| _        d| _        y r  )_indexr  _tabler  
_is_uniquer  r>   s    r2   r3   zCreateIndexBuilder.__init__P  s-    #r4   c                    || _         y r-   )rA  r1   r   s     r2   r   zCreateIndexBuilder.create_indexX  r1  r4   c                    |D ]\  }t        |t              rt        |      }n#t        |t              rt        |d   |d         }| j                  j                  |       ^ y )Nr   r   r   )r]   rH   r   r   r  r   r  s      r2   r   zCreateIndexBuilder.columns\  sT     	)F&#&FE*F1I6!9MMM  (	)r4   c                    || _         y r-   )rB  r  s     r2   r  zCreateIndexBuilder.one  r1  r4   c                V    | j                   r| xj                   |z  c_         y|| _         y)z-
        Partial index where clause.
        N)r  r  s     r2   r  zCreateIndexBuilder.wherei  s     
 <<LLI%L$DLr4   c                    d| _         y r  )rC  r>   s    r2   r  zCreateIndexBuilder.uniques  	    r4   c                    d| _         y r  r  r>   s    r2   r  z CreateIndexBuilder.if_not_existsw  r  r4   c                   | j                   rt        | j                         dk(  rt        d      | j                  st        d      dj	                  | j                   D cg c]  }|j
                   c}      }| j                  rdnd}| j                  rdnd}d| d	| d
| j                   d| j                   d| d}| j                  r|d| j                   z  }|j                  dd
      S c c}w )Nr   z#Cannot create index without columnsz!Cannot create index without tabler  UNIQUEr   zIF NOT EXISTSzCREATE z INDEX rJ  z ON (r  z WHERE z  )r  r   r   rB  rl  r;   rC  r  rA  r  r  )r1   ccolumns_str
unique_strif_not_exists_strbase_sqls         r2   rY   z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    C0c                "    | j                         S r-   r   r>   s    r2   r   zCreateIndexBuilder.__str__  rO  r4   c                "    | j                         S r-   r<  r>   s    r2   r   zCreateIndexBuilder.__repr__  rO  r4   Nr  )r   r  rI   rJ   r<  r;  r  rK   )rL   rM   rN   r3   r    r   r   r  r  r  r  rY   r   r   rP   r4   r2   r   r   O  s    $   ) )   % %   # #+r4   r   c                      e Zd ZdZdZdZdZeZdddZ	ddZ
edd       Zedd       Zedd	       Zedd
       Zedd       Zedd       ZddZddZddZddZy)r   z3
    Query builder used to build DROP queries.
    r   ry  Nc                <    d | _         d| _        d | _        || _        y )Nr   )_drop_target_kind_drop_target
_if_existsrQ  r  s     r2   r3   zDropQueryBuilder.__init__  s     !%46r4   c                    |j                  d| j                         |j                  d| j                         |j                  d| j                         y r  r  rZ   s     r2   rG  z%DropQueryBuilder._set_kwargs_defaults  r  r4   c                b    t        |t              r|n
t        |      }| j                  d|       y )NDATABASE)r]   r   _set_target)r1   r   targets      r2   r   zDropQueryBuilder.drop_database  s'    '(;(ASV,r4   c                b    t        |t              r|n
t        |      }| j                  d|       y )NTABLE)r]   ry   r^  )r1   r9   r_  s      r2   r   zDropQueryBuilder.drop_table  s&    $UE2e&)r4   c                (    | j                  d|       y )NUSERr^  )r1   r  s     r2   r  zDropQueryBuilder.drop_user      &r4   c                (    | j                  d|       y )NVIEWrd  )r1   r  s     r2   r  zDropQueryBuilder.drop_view  re  r4   c                (    | j                  d|       y )NINDEXrd  rE  s     r2   r	  zDropQueryBuilder.drop_index  s    %(r4   c                    d| _         y r  )rZ  r>   s    r2   	if_existszDropQueryBuilder.if_exists  rJ  r4   c                N    | j                   rt        d      || _        || _         y )Nz4'DropQuery' object already has attribute drop_target)rY  r   rX  )r1   kindr_  s      r2   r^  zDropQueryBuilder._set_target  s'     !WXX!%"r4   c                >   | j                  |       | j                  rdnd}d}t        | j                  t        t
        f      r | j                  j                  di |}n t        | j                  | j                        }dj                  | j                  ||      S )Nz
IF EXISTS r   zDROP {kind} {if_exists}{name})rm  rk  r;   rP   )rG  rZ  r]   rY  r   ry   rY   r"   rX  r~   rX  )r1   r[   rk  target_names       r2   rY   zDropQueryBuilder.get_sql  s    !!&)$(OOL	d''(E):;3$++33=f=K'(9(94??KK.55''9; 6 
 	
r4   c                "    | j                         S r-   r   r>   s    r2   r   zDropQueryBuilder.__str__  rO  r4   c                "    | j                         S r-   r<  r>   s    r2   r   zDropQueryBuilder.__repr__  rO  r4   r-   r:  r  )r   zDatabase | strrI   rJ   r;  )r  rH   rI   rJ   )r  rH   rI   rJ   )r   rH   rI   rJ   r  )rm  rH   r_  zDatabase | Table | strrI   rJ   rd   rK   )rL   rM   rN   r   rX  rE  rF  r   r  r3   rG  r    r   r   r  r  r	  rk  r^  rY   r   r   rP   r4   r2   r   r     s     JI3
 - - * * ' ' ' ' ) )  #
r4   r   )r   r  r[   r   rI   zlist[Table])r   r  rI   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+   rR   rk   r   ry   r   r   r   r   r  r   r  r(   r  r  r  r  r   r   r   rP   r4   r2   <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r4   