o
    [hD>                     @   s   d dl Z d dlmZmZ d dlmZ d dlmZ d dlm	Z	 d dl
mZmZmZmZmZ d dlmZ d dlmZ d d	lmZ d d
lmZ edd ZG dd deZdS )    N)	lru_cachepartial)settings)BaseDatabaseOperations)InsertUnnest)InetJsonberrorsis_psycopg3mogrifysplit_tzname_delta)
OnConflict)Cast)_lazy_re_compilec                 C   s   | d u rt jS tt j| dS )N)cls)jsondumpsr   )encoder r   /home/ubuntu/experiments/live_experiments/Pythonexperiments/Otree/venv/lib/python3.10/site-packages/django/db/backends/postgresql/operations.pyget_json_dumps   s   r   c                       s  e Zd ZdZdZdZeg dZddddZe	r-d	d
l
mZ ejejejejejejdZdd ZedZdd Zd_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"d#Zd$d% Z fd&d'Zd(d) Zd_d*d+Z d,d- Z!d.d/ Z"d0d1 Z#d2d3 Z$d4d5 Z%d6d6d7d8d9Z&d:d; Z'd`d<d=Z(d>d? Z)d@dA Z*dBdC Z+dDdE Z,e	rdFdG Z-ndHdG Z-dIdJ Z.e	rdKdL Z/dMdN Z0dOdP Z1dQdR Z2dSdT Z3dUdV Z4 fdWdXZ5d_ fdYdZ	Z6 fd[d\Z7 fd]d^Z8  Z9S )aDatabaseOperationsz&django.db.backends.postgresql.compilerZvarcharZEXPLAIN)ZANALYZEZBUFFERSZCOSTSZGENERIC_PLANZMEMORYZSETTINGS	SERIALIZEZSUMMARYZTIMINGVERBOSEZWALintegerZbigintZsmallint)	AutoFieldZBigAutoFieldZSmallAutoFieldr   )numeric)ZSmallIntegerFieldZIntegerFieldZBigIntegerFieldZPositiveSmallIntegerFieldZPositiveIntegerFieldZPositiveBigIntegerFieldc                 C   s.   |  }|dv rd|| jdd  S dS )N)GenericIPAddressFieldIPAddressFieldZ	TimeFieldZ	UUIDFieldzCAST(%%s AS %s)(r   %s)Zget_internal_typedb_type
connectionsplit)selfZoutput_fieldinternal_typer   r   r   unification_cast_sql@   s
   z'DatabaseOperations.unification_cast_sqlz[A-Z_]+c                 C   s   |dkrd| d|fS |dkrd| d|fS |dkr$d| d|fS |  }| j|s5td	|d
| d| d|fS )NZweek_dayzEXTRACT(DOW FROM z) + 1Ziso_week_dayzEXTRACT(ISODOW FROM )Ziso_yearzEXTRACT(ISOYEAR FROM zInvalid lookup type: zEXTRACT(z FROM )upper_extract_format_re	fullmatch
ValueErrorr%   lookup_typesqlparamsr   r   r   date_extract_sqlW   s   z#DatabaseOperations.date_extract_sqlNc                 C   *   |  |||\}}d| d|g|R fS NDATE_TRUNC(%s, r(   _convert_sql_to_tzr%   r.   r/   r0   tznamer   r   r   date_trunc_sqlf      z!DatabaseOperations.date_trunc_sqlc                 C   s6   t |\}}}|r|dkrdnd}| | | S |S )N+-r   )r%   r8   signoffsetr   r   r   _prepare_tzname_deltak   s
   z(DatabaseOperations._prepare_tzname_deltac                 C   s4   |rt jr| |}| dg ||R fS ||fS )Nz AT TIME ZONE %s)r   ZUSE_TZr?   )r%   r/   r0   r8   Ztzname_paramr   r   r   r6   r   s   

z%DatabaseOperations._convert_sql_to_tzc                 C   "   |  |||\}}d| d|fS )Nr    z)::dater5   r%   r/   r0   r8   r   r   r   datetime_cast_date_sqlx      z)DatabaseOperations.datetime_cast_date_sqlc                 C   r@   )Nr    )::timer5   rA   r   r   r   datetime_cast_time_sql|   rC   z)DatabaseOperations.datetime_cast_time_sqlc                 C   s@   |  |||\}}|dkrd| ddg|R fS | |||S Nsecondz#EXTRACT(SECOND FROM DATE_TRUNC(%s, z)))r6   r1   r7   r   r   r   datetime_extract_sql   s   z'DatabaseOperations.datetime_extract_sqlc                 C   r2   r3   r5   r7   r   r   r   datetime_trunc_sql   r:   z%DatabaseOperations.datetime_trunc_sqlc                 C   s.   |dkrd| ddg|R fS |  |||S rF   )r1   r-   r   r   r   time_extract_sql   s   z#DatabaseOperations.time_extract_sqlc                 C   r2   )Nr4   rD   r5   r7   r   r   r   time_trunc_sql   s   z!DatabaseOperations.time_trunc_sqlc                 C      dS )Nz DEFERRABLE INITIALLY DEFERREDr   r%   r   r   r   deferrable_sql      z!DatabaseOperations.deferrable_sqlc                    s"   t |tr
d| S t ||S )NzSELECT * FROM )
isinstancer   superbulk_insert_sql)r%   fieldsZplaceholder_rows	__class__r   r   rR      s   

z"DatabaseOperations.bulk_insert_sqlc                 C   s   |  S )z
        Given a cursor object that has just performed an INSERT...RETURNING
        statement into a table, return the tuple of returned data.
        )Zfetchall)r%   cursorr   r   r   fetch_returned_insert_rows   s   z-DatabaseOperations.fetch_returned_insert_rowsc                 C   s2   d}|dv r|dv rd}nd}|dv rd| }|S )Nr!   )	iexactcontains	icontains
startswithistartswithendswith	iendswithregexZiregex)r   r   zHOST(%s)z%s::text)rX   rZ   r\   r^   z	UPPER(%s)r   )r%   r.   r&   lookupr   r   r   lookup_cast   s   zDatabaseOperations.lookup_castc                 C   s   d S Nr   rM   r   r   r   no_limit_value   rO   z!DatabaseOperations.no_limit_valuec                 C   s   |gS rb   r   )r%   r/   r   r   r   prepare_sql_script   s   z%DatabaseOperations.prepare_sql_scriptc                 C   s    | dr|dr|S d| S )N"z"%s")r[   r]   )r%   namer   r   r   
quote_name   s   zDatabaseOperations.quote_namec                 C   s   t ||| jS rb   )r   r#   )r%   r/   r0   r   r   r   compose_sql   s   zDatabaseOperations.compose_sqlc                 C   rL   )Nz(SELECT set_config('TimeZone', %s, false)r   rM   r   r   r   set_time_zone_sql   rO   z$DatabaseOperations.set_time_zone_sqlF)reset_sequencesallow_cascadec                   sd   |sg S  dd fdd|D g}|r | d |r*| d dd| gS )	NZTRUNCATE, c                 3   s     | ]}  |V  qd S rb   )	SQL_FIELDrg   ).0tabler%   styler   r   	<genexpr>   s    z/DatabaseOperations.sql_flush.<locals>.<genexpr>zRESTART IDENTITYZCASCADEz%s; )SQL_KEYWORDjoinappend)r%   rq   Ztablesrj   rk   Z	sql_partsr   rp   r   	sql_flush   s   zDatabaseOperations.sql_flushc              
   C   sR   g }|D ]"}|d }|d pd}| d|d|| |||f  q|S )Nro   columnidz7%s setval(pg_get_serial_sequence('%s','%s'), 1, false);SELECT)rv   rt   	SQL_TABLErg   rm   )r%   rq   	sequencesr/   Zsequence_infoZ
table_nameZcolumn_namer   r   r   sequence_reset_by_name_sql   s   z-DatabaseOperations.sequence_reset_by_name_sqlc                 C   s    |r	d|  | S d|  | S )NzUSING INDEX TABLESPACE %szTABLESPACE %s)rg   )r%   Z
tablespaceinliner   r   r   tablespace_sql   s   z!DatabaseOperations.tablespace_sqlc                 C   s   ddl m} g }| j}|D ]G}|jjD ]@}t||jrS|d|d|	||jj
||j|||j|||j|d|d|	||jj
f   nqq|S )Nr   )modelszZ%s setval(pg_get_serial_sequence('%s','%s'), coalesce(max(%s), 1), max(%s) %s null) %s %s;rz   zIS NOTZFROM)Z	django.dbr   rg   _metaZlocal_fieldsrP   r   rv   rt   r{   db_tablerm   rx   )r%   rq   Z
model_listr   outputqnmodelfr   r   r   sequence_reset_sql   s.   
z%DatabaseOperations.sequence_reset_sqlc                 C      |S rb   r   )r%   xr   r   r   prep_for_iexact_query  rO   z(DatabaseOperations.prep_for_iexact_queryc                 C   rL   )a  
        Return the maximum length of an identifier.

        The maximum length of an identifier is 63 by default, but can be
        changed by recompiling PostgreSQL after editing the NAMEDATALEN
        macro in src/include/pg_config_manual.h.

        This implementation returns 63, but can be overridden by a custom
        database backend that inherits most of its behavior from this one.
        ?   r   rM   r   r   r   max_name_length  s   z"DatabaseOperations.max_name_lengthc                 C   s0   |rdd |D }dd | g|fS dgg fS )Nc                 S   s   g | ]	}|D ]}|qqS r   r   )rn   Z
param_listparamr   r   r   
<listcomp>,  s    z3DatabaseOperations.distinct_sql.<locals>.<listcomp>zDISTINCT ON (%s)rl   ZDISTINCTru   )r%   rS   r0   r   r   r   distinct_sql*  s   
zDatabaseOperations.distinct_sqlc                 C   sR   | j jjrz| ||W S  tjy   Y d S w |jr'|jjd ur'|jj S d S rb   )	r#   featuresZuses_server_side_bindingrh   r	   Z	DataErrorZ_queryquerydecoder%   rV   r/   r0   r   r   r   last_executed_query3  s   
z&DatabaseOperations.last_executed_queryc                 C   s   |j d ur
|j  S d S rb   )r   r   r   r   r   r   r   @  s   

c                    s,   |sdS  fdd|D }dd | dfS )N) r   c                    s,   g | ]}d   |jjj  |jf qS )z%s.%s)rg   r   r   r   rx   rn   fieldrM   r   r   r   J  s    
z<DatabaseOperations.return_insert_columns.<locals>.<listcomp>zRETURNING %srl   r   r   )r%   rS   columnsr   rM   r   return_insert_columnsG  s   
z(DatabaseOperations.return_insert_columnsc                 C   s$   |d u s	t |dr|S | j| |S )NZresolve_expression)hasattrintegerfield_type_map)r%   valuer&   r   r   r   adapt_integerfield_valueV  s   z+DatabaseOperations.adapt_integerfield_valuec                 C   r   rb   r   r%   r   r   r   r   adapt_datefield_value[  rO   z(DatabaseOperations.adapt_datefield_valuec                 C   r   rb   r   r   r   r   r   adapt_datetimefield_value^  rO   z,DatabaseOperations.adapt_datetimefield_valuec                 C   r   rb   r   r   r   r   r   adapt_timefield_valuea  rO   z(DatabaseOperations.adapt_timefield_valuec                 C   s   |rt |S d S rb   )r   r   r   r   r   adapt_ipaddressfield_valued  s   z-DatabaseOperations.adapt_ipaddressfield_valuec                 C   s   t |t|dS )N)r   )r   r   )r%   r   r   r   r   r   adapt_json_valuei  s   z#DatabaseOperations.adapt_json_valuec           	         sF   |dkr|\}}|\}}g ||R }d||f |fS t  |||S )NZ	DateFieldz(interval '1 day' * (%s - %s)))rQ   subtract_temporals)	r%   r&   lhsrhsZlhs_sqlZ
lhs_paramsZrhs_sqlZ
rhs_paramsr0   rT   r   r   r   l  s   z%DatabaseOperations.subtract_temporalsc                    s   i }| dd  }r| dv r| |d< |r5dd | D }| jD ]}| |d }|d ur4|||< q$t j|fi |}|rE||d< |rW|ddd	d
 | D  7 }|S )N	serialize>   ZTEXTBINARYr   c                 S   s"   i | ]\}}|  |rd ndqS )truefalse)r)   )rn   rf   r   r   r   r   
<dictcomp>{  s    z;DatabaseOperations.explain_query_prefix.<locals>.<dictcomp>ZFORMATz (%s)rl   c                 s   s    | ]}d | V  qdS )z%s %sNr   )rn   ir   r   r   rr     s    z:DatabaseOperations.explain_query_prefix.<locals>.<genexpr>)popr)   itemsexplain_optionsrQ   explain_query_prefixru   )r%   formatoptionsextrar   Zvalid_optionr   prefixrT   r   r   r   t  s&   
 z'DatabaseOperations.explain_query_prefixc                    s\   |t jkrdS |t jkr%ddt| j|ddd t| j|D f S t ||||S )NzON CONFLICT DO NOTHINGz ON CONFLICT(%s) DO UPDATE SET %srl   c                 S   s   g | ]	}| d | qS )z = EXCLUDED.r   r   r   r   r   r     s    z=DatabaseOperations.on_conflict_suffix_sql.<locals>.<listcomp>)r   ZIGNOREZUPDATEru   maprg   rQ   on_conflict_suffix_sql)r%   rS   Zon_conflictZupdate_fieldsZunique_fieldsrT   r   r   r     s"   


	z)DatabaseOperations.on_conflict_suffix_sqlc                    s@   t  ||||\}}|| j|| jkrt||}||fS rb   )rQ   prepare_join_on_clauser"   r#   r   )r%   Z	lhs_tableZ	lhs_fieldZ	rhs_tableZ	rhs_fieldZlhs_exprZrhs_exprrT   r   r   r     s   
z)DatabaseOperations.prepare_join_on_clauserb   )F):__name__
__module____qualname__Zcompiler_moduleZ"cast_char_field_without_max_lengthZexplain_prefix	frozensetr   Zcast_data_typesr
   Zpsycopg.typesr   ZInt2ZInt4ZInt8r   r'   r   r*   r1   r9   r?   r6   rB   rE   rH   rI   rJ   rK   rN   rR   rW   ra   rc   rd   rg   rh   ri   rw   r}   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   __classcell__r   r   rT   r   r      s~    	



"
r   )r   	functoolsr   r   Zdjango.confr   Z"django.db.backends.base.operationsr   Z&django.db.backends.postgresql.compilerr   Z)django.db.backends.postgresql.psycopg_anyr   r   r	   r
   r   Zdjango.db.backends.utilsr   Zdjango.db.models.constantsr   Zdjango.db.models.functionsr   Zdjango.utils.regex_helperr   r   r   r   r   r   r   <module>   s    
