U
    ovgH                     @   s$  d Z ddlZddlZddlmZ ddlmZ ddlm	Z	 ddlm
Z
 ddlmZ dd	lmZ dd
lmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlm Z  ddl!m"Z" G dd de j#Z$G dd de j%Z&G dd  d e&e j'Z(G d!d" d"e&Z)G d#d$ d$eZ*G d%d& d&eZ+G d'd( d(e jj,Z-G d)d* d*e jj.Z/G d+d, d,e jj0Z1G d-d. d.eZ2G d/d0 d0eZ3G d1d2 d2eZ4G d3d4 d4e j5Z6G d5d6 d6e j7Z8G d7d8 d8e j9Z:G d9d: d:e j;Z<G d;d< d<e j=Z>G d=d> d>e j?Z@G d?d@ d@e jAZBG dAdB dBe jCZDG dCdD dDeZEG dEdF dFeeZFG dGdH dHejGZHG dIdJ dJejIZJeK ZLG dKdL dLeZMG dMdN dNZNG dOdP dPeZOG dQdR dReZPG dSdT dTeZQeQZRdS )Ua	  
.. dialect:: postgresql+pg8000
    :name: pg8000
    :dbapi: pg8000
    :connectstring: postgresql+pg8000://user:password@host:port/dbname[?key=value&key=value...]
    :url: https://pypi.org/project/pg8000/

.. versionchanged:: 1.4  The pg8000 dialect has been updated for version
   1.16.6 and higher, and is again part of SQLAlchemy's continuous integration
   with full feature support.

.. _pg8000_unicode:

Unicode
-------

pg8000 will encode / decode string values between it and the server using the
PostgreSQL ``client_encoding`` parameter; by default this is the value in
the ``postgresql.conf`` file, which often defaults to ``SQL_ASCII``.
Typically, this can be changed to ``utf-8``, as a more useful default::

    # client_encoding = sql_ascii # actually, defaults to database encoding
    client_encoding = utf8

The ``client_encoding`` can be overridden for a session by executing the SQL:

.. sourcecode:: sql

    SET CLIENT_ENCODING TO 'utf8';

SQLAlchemy will execute this SQL on all new connections based on the value
passed to :func:`_sa.create_engine` using the ``client_encoding`` parameter::

    engine = create_engine(
        "postgresql+pg8000://user:pass@host/dbname", client_encoding="utf8"
    )

.. _pg8000_ssl:

SSL Connections
---------------

pg8000 accepts a Python ``SSLContext`` object which may be specified using the
:paramref:`_sa.create_engine.connect_args` dictionary::

    import ssl

    ssl_context = ssl.create_default_context()
    engine = sa.create_engine(
        "postgresql+pg8000://scott:tiger@192.168.0.199/test",
        connect_args={"ssl_context": ssl_context},
    )

If the server uses an automatically-generated certificate that is self-signed
or does not match the host name (as seen from the client), it may also be
necessary to disable hostname checking::

    import ssl

    ssl_context = ssl.create_default_context()
    ssl_context.check_hostname = False
    ssl_context.verify_mode = ssl.CERT_NONE
    engine = sa.create_engine(
        "postgresql+pg8000://scott:tiger@192.168.0.199/test",
        connect_args={"ssl_context": ssl_context},
    )

.. _pg8000_isolation_level:

pg8000 Transaction Isolation Level
-------------------------------------

The pg8000 dialect offers the same isolation level settings as that
of the :ref:`psycopg2 <psycopg2_isolation_level>` dialect:

* ``READ COMMITTED``
* ``READ UNCOMMITTED``
* ``REPEATABLE READ``
* ``SERIALIZABLE``
* ``AUTOCOMMIT``

.. seealso::

    :ref:`postgresql_isolation_level`

    :ref:`psycopg2_isolation_level`


    N   )ranges)ARRAY)_DECIMAL_TYPES)_FLOAT_TYPES)
_INT_TYPES)ENUMINTERVAL)
PGCompiler)	PGDialect)PGExecutionContext)PGIdentifierPreparer)JSON)JSONB)JSONPathType)_SpaceVector)	OIDVECTOR)CITEXT   )exc)util)
processors)sqltypes)quoted_namec                   @   s   e Zd ZdZdS )	_PGStringTN__name__
__module____qualname__render_bind_cast r!   r!   I/tmp/pip-unpacked-wheel-uqd9otp_/sqlalchemy/dialects/postgresql/pg8000.pyr   }   s   r   c                   @   s   e Zd ZdZdd ZdS )
_PGNumericTc                 C   sv   | j rB|tkrttj| jS |tks.|tkr2d S t	
d| n0|tkrNd S |tks^|tkrdtjS t	
d| d S )NzUnknown PG numeric type: %d)Z	asdecimalr   r   Zto_decimal_processor_factorydecimalDecimalZ_effective_decimal_return_scaler   r   r   ZInvalidRequestErrorZto_floatselfdialectcoltyper!   r!   r"   result_processor   s$     z_PGNumeric.result_processorNr   r   r   r    r*   r!   r!   r!   r"   r#      s   r#   c                   @   s   e Zd ZdZdZdS )_PGFloatfloatTNr   r   r   Z__visit_name__r    r!   r!   r!   r"   r,      s   r,   c                   @   s   e Zd Zdd ZdS )_PGNumericNoBindc                 C   s   d S Nr!   )r'   r(   r!   r!   r"   bind_processor   s    z_PGNumericNoBind.bind_processorN)r   r   r   r1   r!   r!   r!   r"   r/      s   r/   c                   @   s   e Zd ZdZdd ZdS )_PGJSONTc                 C   s   d S r0   r!   r&   r!   r!   r"   r*      s    z_PGJSON.result_processorNr+   r!   r!   r!   r"   r2      s   r2   c                   @   s   e Zd ZdZdd ZdS )_PGJSONBTc                 C   s   d S r0   r!   r&   r!   r!   r"   r*      s    z_PGJSONB.result_processorNr+   r!   r!   r!   r"   r3      s   r3   c                   @   s   e Zd Zdd ZdS )_PGJSONIndexTypec                 C   s   t dd S )Nzshould not be here)NotImplementedErrorr'   dbapir!   r!   r"   get_dbapi_type   s    z_PGJSONIndexType.get_dbapi_typeNr   r   r   r8   r!   r!   r!   r"   r4      s   r4   c                   @   s   e Zd ZdZdZdS )_PGJSONIntIndexTypeZjson_int_indexTNr.   r!   r!   r!   r"   r:      s   r:   c                   @   s   e Zd ZdZdZdS )_PGJSONStrIndexTypeZjson_str_indexTNr.   r!   r!   r!   r"   r;      s   r;   c                   @   s   e Zd ZdS )_PGJSONPathTypeNr   r   r   r!   r!   r!   r"   r<      s   r<   c                   @   s   e Zd Zdd ZdS )_PGEnumc                 C   s   |j S r0   )UNKNOWNr6   r!   r!   r"   r8      s    z_PGEnum.get_dbapi_typeNr9   r!   r!   r!   r"   r>      s   r>   c                   @   s$   e Zd ZdZdd Zedd ZdS )_PGIntervalTc                 C   s   |j S r0   r	   r6   r!   r!   r"   r8      s    z_PGInterval.get_dbapi_typec                 K   s   t |jdS )N)Z	precision)r@   Zsecond_precision)clsintervalkwr!   r!   r"   adapt_emulated_to_native   s    z$_PGInterval.adapt_emulated_to_nativeN)r   r   r   r    r8   classmethodrD   r!   r!   r!   r"   r@      s   r@   c                   @   s   e Zd ZdZdS )_PGTimeStampTNr   r!   r!   r!   r"   rF      s   rF   c                   @   s   e Zd ZdZdS )_PGDateTNr   r!   r!   r!   r"   rG      s   rG   c                   @   s   e Zd ZdZdS )_PGTimeTNr   r!   r!   r!   r"   rH      s   rH   c                   @   s   e Zd ZdZdS )
_PGIntegerTNr   r!   r!   r!   r"   rI      s   rI   c                   @   s   e Zd ZdZdS )_PGSmallIntegerTNr   r!   r!   r!   r"   rJ      s   rJ   c                   @   s   e Zd ZdS )_PGNullTypeNr=   r!   r!   r!   r"   rK      s   rK   c                   @   s   e Zd ZdZdS )_PGBigIntegerTNr   r!   r!   r!   r"   rL      s   rL   c                   @   s   e Zd ZdZdS )
_PGBooleanTNr   r!   r!   r!   r"   rM      s   rM   c                   @   s   e Zd ZdZdS )_PGARRAYTNr   r!   r!   r!   r"   rN      s   rN   c                   @   s   e Zd ZdS )_PGOIDVECTORNr=   r!   r!   r!   r"   rO      s   rO   c                   @   s   e Zd Zdd Zdd ZdS )_Pg8000Rangec                    s   |j j  fdd}|S )Nc                    s&   t | tjr" | j| j| j| j} | S r0   )
isinstancer   RangelowerupperboundsemptyvalueZpg8000_Ranger!   r"   to_range  s       z-_Pg8000Range.bind_processor.<locals>.to_ranger7   rR   )r'   r(   rZ   r!   rY   r"   r1     s    z_Pg8000Range.bind_processorc                 C   s   dd }|S )Nc                 S   s&   | d k	r"t j| j| j| j| jd} | S )NrU   rV   r   rR   rS   rT   rU   Zis_emptyrW   r!   r!   r"   rZ     s    z/_Pg8000Range.result_processor.<locals>.to_ranger!   )r'   r(   r)   rZ   r!   r!   r"   r*     s    
z_Pg8000Range.result_processorNr   r   r   r1   r*   r!   r!   r!   r"   rP     s   rP   c                   @   s   e Zd Zdd Zdd ZdS )_Pg8000MultiRangec                    s   |j j  fdd}|S )Nc                    sX   t | trPg }| D ]8}t |tjr@| |j|j|j|j q|| q|S | S d S r0   )	rQ   listr   rR   appendrS   rT   rU   rV   )rX   mrvrY   r!   r"   to_multirange#  s    
z7_Pg8000MultiRange.bind_processor.<locals>.to_multiranger[   )r'   r(   rd   r!   rY   r"   r1      s    z _Pg8000MultiRange.bind_processorc                 C   s   dd }|S )Nc                 S   s$   | d krd S t dd | D S d S )Nc                 s   s(   | ] }t j|j|j|j|jd V  qdS )r\   Nr]   ).0rc   r!   r!   r"   	<genexpr>8  s      zL_Pg8000MultiRange.result_processor.<locals>.to_multirange.<locals>.<genexpr>)r   Z
MultiRangerW   r!   r!   r"   rd   4  s
    
z9_Pg8000MultiRange.result_processor.<locals>.to_multiranger!   )r'   r(   r)   rd   r!   r!   r"   r*   3  s    z"_Pg8000MultiRange.result_processorNr^   r!   r!   r!   r"   r_     s   r_   c                   @   s   e Zd Zdd Zdd ZdS )PGExecutionContext_pg8000c                 C   s:   dt t| dd  t t dd  f }t| j |S )Nzc_%s_%s   )hexid_server_side_idServerSideCursorZ_dbapi_connectioncursor)r'   identr!   r!   r"   create_server_side_cursorF  s    *z3PGExecutionContext_pg8000.create_server_side_cursorc                 C   s   | j s
d S d S r0   )Zcompiledr'   r!   r!   r"   pre_execJ  s    z"PGExecutionContext_pg8000.pre_execN)r   r   r   ro   rq   r!   r!   r!   r"   rg   E  s   rg   c                   @   s   e Zd ZdZdd Zedd Zedd Zedd	 ZdddZ	dd Z
dd ZdddZdd Zdd Zdd ZdddZdS )rl   Tc                 C   s   || _ || _d S r0   )rn   rm   )r'   rm   rn   r!   r!   r"   __init__R  s    zServerSideCursor.__init__c                 C   s   | j jS r0   )rm   
connectionrp   r!   r!   r"   rs   V  s    zServerSideCursor.connectionc                 C   s   | j jS r0   )rm   rowcountrp   r!   r!   r"   rt   Z  s    zServerSideCursor.rowcountc                 C   s   | j jS r0   )rm   descriptionrp   r!   r!   r"   ru   ^  s    zServerSideCursor.descriptionr!   Nc                 C   s(   d| j  d | }| jj|||d | S )NzDECLARE z NO SCROLL CURSOR FOR )stream)rn   rm   execute)r'   	operationargsrv   opr!   r!   r"   rw   b  s    zServerSideCursor.executec                 C   s   | j || | S r0   )rm   executemany)r'   rx   Z
param_setsr!   r!   r"   r{   g  s    zServerSideCursor.executemanyc                 C   s   | j d| j  | j  S )NzFETCH FORWARD 1 FROM )rm   rw   rn   fetchonerp   r!   r!   r"   r|   k  s    zServerSideCursor.fetchonec                 C   s@   |d kr|   S | jdtt| d | j  | j  S d S )NzFETCH FORWARD z FROM )fetchallrm   rw   strintrn   )r'   numr!   r!   r"   	fetchmanyo  s    zServerSideCursor.fetchmanyc                 C   s   | j d| j  | j  S )NzFETCH FORWARD ALL FROM )rm   rw   rn   r}   rp   r!   r!   r"   r}   x  s    zServerSideCursor.fetchallc                 C   s    | j d| j  | j   d S )NzCLOSE )rm   rw   rn   closerp   r!   r!   r"   r   |  s    zServerSideCursor.closec                 G   s   | j j|  d S r0   )rm   setinputsizes)r'   Zsizesr!   r!   r"   r     s    zServerSideCursor.setinputsizesc                 C   s   d S r0   r!   )r'   sizecolumnr!   r!   r"   setoutputsize  s    zServerSideCursor.setoutputsize)r!   N)N)N)r   r   r   server_siderr   propertyrs   rt   ru   rw   r{   r|   r   r}   r   r   r   r!   r!   r!   r"   rl   O  s    




	rl   c                   @   s   e Zd Zdd ZdS )PGCompiler_pg8000c                 K   s$   | j |jf|d | j |jf| S )Nz %% )processleftright)r'   binaryoperatorrC   r!   r!   r"   visit_mod_binary  s    z"PGCompiler_pg8000.visit_mod_binaryN)r   r   r   r   r!   r!   r!   r"   r     s   r   c                   @   s   e Zd Zdd ZdS )PGIdentifierPreparer_pg8000c                 O   s   t j| f|| d| _d S )NF)r   rr   Z_double_percents)r'   ry   kwargsr!   r!   r"   rr     s    z$PGIdentifierPreparer_pg8000.__init__N)r   r   r   rr   r!   r!   r!   r"   r     s   r   c                K   @   s  e Zd ZdZdZdZdZdZdZe	Z
eZeZdZdZdZeejejeejeejeejeeje ej!e"e#e$e%e%ejj&e'ejj(e)ejj*e+ejj,e-ej.e/e0e/ej1e2ej1e2ej3e4ej5e6ej7e8ej9e:ej;e<ej=e>ej?e@eAeBeCjDeEeCjFeEeCjGeEeCjHeEeCjIeEeCjJeEeCjKeLeCjMeLeCjNeLeCjOeLeCjPeLeCjQeLi$Zd,ddZRejSdd ZTeUd	d
 ZVdd ZWdd ZXdd ZYdd ZZdd Z[dd Z\dd Z]dd Z^dd Z_dd Z`dd  Zad-d"d#Zbd.d$d%Zcd&d' Zdd(d) ZeejSd*d+ ZfdS )/PGDialect_pg8000pg8000TformatNc                 K   s8   t j| f| || _| jdk r&td| jr4tdd S )N)r         z$pg8000 1.16.6 or greater is requiredznThe pg8000 dialect does not fully implement ipaddress type handling; INET is supported by default, CIDR is not)r   rr   client_encoding_dbapi_versionr5   _native_inet_types)r'   r   r   r!   r!   r"   rr     s    
zPGDialect_pg8000.__init__c                 C   s8   | j r0t| j dr0tdd td| j jD S dS d S )N__version__c                 S   s   g | ]}t |qS r!   )r   )re   xr!   r!   r"   
<listcomp>  s   z3PGDialect_pg8000._dbapi_version.<locals>.<listcomp>z(\d+)(?:[-\.]?|$))c   r   r   )r7   hasattrtuplerefindallr   rp   r!   r!   r"   r     s     	zPGDialect_pg8000._dbapi_versionc                 C   s   t dS )Nr   )
__import__)rA   r!   r!   r"   import_dbapi  s    zPGDialect_pg8000.import_dbapic                 C   s8   |j dd}d|kr$t|d |d< ||j g |fS )Nuser)usernameport)Ztranslate_connect_argsr   updatequery)r'   urloptsr!   r!   r"   create_connect_args  s
    z$PGDialect_pg8000.create_connect_argsc                 C   s*   t || jjrdt|krdS dt|kS )Nznetwork errorTzconnection is closed)rQ   r7   ZInterfaceErrorr~   )r'   ers   rm   r!   r!   r"   is_disconnect  s
    zPGDialect_pg8000.is_disconnectc                 C   s   dS )N)
AUTOCOMMITzREAD COMMITTEDzREAD UNCOMMITTEDzREPEATABLE READZSERIALIZABLEr!   )r'   dbapi_connectionr!   r!   r"   get_isolation_level_values  s    z+PGDialect_pg8000.get_isolation_level_valuesc                 C   sP   | dd}|dkrd|_n0d|_| }|d|  |d |  d S )N_ r   TFz;SET SESSION CHARACTERISTICS AS TRANSACTION ISOLATION LEVEL COMMIT)replaceZ
autocommitrm   rw   r   )r'   r   levelrm   r!   r!   r"   set_isolation_level  s    
z$PGDialect_pg8000.set_isolation_levelc                 C   s<   |  }z$|d|rdnd  |d W 5 |  X d S )N-SET SESSION CHARACTERISTICS AS TRANSACTION %sz	READ ONLYz
READ WRITEr   rm   r   rw   r'   rs   rX   rm   r!   r!   r"   set_readonly  s    
zPGDialect_pg8000.set_readonlyc                 C   s6   |  }z|d | d }W 5 |  X |dkS )Nzshow transaction_read_onlyr   onrm   r   rw   r|   r'   rs   rm   valr!   r!   r"   get_readonly*  s    

zPGDialect_pg8000.get_readonlyc                 C   s<   |  }z$|d|rdnd  |d W 5 |  X d S )Nr   Z
DEFERRABLEzNOT DEFERRABLEr   r   r   r!   r!   r"   set_deferrable4  s    
zPGDialect_pg8000.set_deferrablec                 C   s6   |  }z|d | d }W 5 |  X |dkS )Nzshow transaction_deferrabler   r   r   r   r!   r!   r"   get_deferrable?  s    

zPGDialect_pg8000.get_deferrablec                 C   s8   |  }|d|dd d |d |  d S )NzSET CLIENT_ENCODING TO ''z''r   )rm   rw   r   r   )r'   r   r   rm   r!   r!   r"   _set_client_encodingI  s    

z%PGDialect_pg8000._set_client_encodingc                 C   s   |j d|df d S Nr    )rs   Z	tpc_beginr'   rs   xidr!   r!   r"   do_begin_twophaseS  s    z"PGDialect_pg8000.do_begin_twophasec                 C   s   |j   d S r0   )rs   Ztpc_preparer   r!   r!   r"   do_prepare_twophaseV  s    z$PGDialect_pg8000.do_prepare_twophaseFc                 C   s   |j d|df d S r   )rs   Ztpc_rollbackr'   rs   r   Zis_preparedZrecoverr!   r!   r"   do_rollback_twophaseY  s    z%PGDialect_pg8000.do_rollback_twophasec                 C   s   |j d|df d S r   )rs   Z
tpc_commitr   r!   r!   r"   do_commit_twophase^  s    z#PGDialect_pg8000.do_commit_twophasec                 C   s   dd |j  D S )Nc                 S   s   g | ]}|d  qS )r   r!   )re   rowr!   r!   r"   r   d  s     z8PGDialect_pg8000.do_recover_twophase.<locals>.<listcomp>)rs   Ztpc_recover)r'   rs   r!   r!   r"   do_recover_twophasec  s    z$PGDialect_pg8000.do_recover_twophasec                    s   g  dd }  | jd k	r6fdd}  | jdkrRdd }  | jrnfdd}  | t dkr fdd}|S d S d S )	Nc                 S   s   | j t | j t< d S r0   )Zpy_typesr~   r   connr!   r!   r"   
on_connecti  s    z/PGDialect_pg8000.on_connect.<locals>.on_connectc                    s     |  j d S r0   )r   r   r   rp   r!   r"   r   p  s    Fc                 S   s$   |  ddd  |  ddd  d S )Nie  c                 S   s   | S r0   r!   sr!   r!   r"   <lambda>y      zAPGDialect_pg8000.on_connect.<locals>.on_connect.<locals>.<lambda>i  c                 S   s   | S r0   r!   r   r!   r!   r"   r   |  r   )register_in_adapterr   r!   r!   r"   r   w  s    c                    s    |  d j |  d j d S )Nr   i  )r   _json_deserializerr   rp   r!   r"   r     s    r   c                    s    D ]}||  qd S r0   r!   )r   fn)fnsr!   r"   r     s    )ra   r   r   r   len)r'   r   r!   )r   r'   r"   r   f  s     





zPGDialect_pg8000.on_connectc                 C   s   dS )N;r!   rp   r!   r!   r"   _dialect_specific_select_one  s    z-PGDialect_pg8000._dialect_specific_select_one)N)TF)TF)gr   r   r   ZdriverZsupports_statement_cacheZsupports_unicode_statementsZsupports_unicode_bindsZdefault_paramstyleZsupports_sane_multi_rowcountrg   Zexecution_ctx_clsr   Zstatement_compilerr   preparerZsupports_server_side_cursorsr    Zdescription_encodingr   Zupdate_copyr   Zcolspecsr   Stringr   Numericr/   Floatr,   r   r2   BooleanrM   NullTyperK   r   r3   r   r   r<   JSONIndexTyper4   JSONIntIndexTyper:   JSONStrIndexTyper;   ZIntervalr@   r
   DateTimerF   DaterG   TimerH   IntegerrI   SmallIntegerrJ   
BigIntegerrL   Enumr>   r   rN   r   rO   r   Z	INT4RANGErP   Z	INT8RANGEZNUMRANGEZ	DATERANGEZTSRANGEZ	TSTZRANGEZINT4MULTIRANGEr_   ZINT8MULTIRANGEZNUMMULTIRANGEZDATEMULTIRANGEZTSMULTIRANGEZTSTZMULTIRANGErr   Zmemoized_propertyr   rE   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r!   r!   r!   r"   r     s                                       *



	


   
   
/r   )S__doc__r$   r   r   r   arrayr   ZPGARRAYbaser   r   r   r   r
   r   r   r   r   jsonr   r   r   Z
pg_catalogr   r   typesr   r   r   Zenginer   Zsqlr   Zsql.elementsr   r   r   r   r#   r   r,   r/   r2   r3   r   r4   r   r:   r   r;   r<   r>   r@   r   rF   r   rG   r   rH   r   rI   r   rJ   r   rK   r   rL   r   rM   rN   rO   ZAbstractSingleRangeImplrP   ZAbstractMultiRangeImplr_   counterrk   rg   rl   r   r   r   r(   r!   r!   r!   r"   <module>	   sr   Y#
8	  