3
( \                 @   s   d dl mZ d dlmZmZmZ d dlmZmZm	Z	 d dl
mZ ddlmZmZ eddZd	d
 Zdd Zdd Zdd Zdd Zdd ZdS )    )parse)KeywordCTEDML)
IdentifierIdentifierListParenthesis)
namedtuple   )TableMetadataColumnMetadataTableExpressionzname columns start stopc             C   s   | s| |t  fS t| \}}|s*| |f fS t|}g }xr|D ]j}|j|  k oV|jk n  r| |j| }| |j|j } | ||fS dd |jD }|jt|j| q<W | |d jd } ||d j| }| |t |fS )zDSimplify a query by converting CTEs into table metadata objects
    c             s   s   | ]}t |d f V  qd S )N)r   ).0name r   H/usr/share/pgadmin4/web/pgadmin/utils/sqlautocomplete/parseutils/ctes.py	<genexpr>&   s    z%isolate_query_ctes.<locals>.<genexpr>r
   Nr   )	tupleextract_cteslenstartstopcolumnsappendr   r   )Z	full_textZtext_before_cursorctes	remainderZcurrent_positionmetacteZcolsr   r   r   isolate_query_ctes   s"    


r   c       
      C   s  t | d }|jd	ddd\}}|o,|jtks6g | fS |j|\}}|sPg dfS t|j|}g }t|trxd|j D ]4}t|j|j	|}t
||| }|sqt|j| qtW n"t|trt
||}|r|j| |j	|d }djdd |j|d D }	||	fS )
z Extract constant table expresseions from a query

        Returns tuple (ctes, remainder_sql)

        ctes is a list of TableExpression namedtuples
        remainder_sql is the text from the original query after the CTEs have
        been stripped.
    r   r
   T)skip_wsskip_cm c             s   s   | ]}t |V  qd S )N)str)r   tokr   r   r   r   Z   s    zextract_ctes.<locals>.<genexpr>Nr   )r   
token_nextZttyper   token_start_postokens
isinstancer   get_identifiersZtoken_indexget_cte_from_tokenr   r   join)
Zsqlpidxr$   	start_posr   tZcte_start_offsetr   r   r   r   r   r   0   s.    




r   c       	      C   s`   | j  }|sd S | jt\}}|s&d S |t| j| }tt|}|| }t|}t||||S )N)	Zget_real_nametoken_next_byr   r&   r'   r   r#   extract_column_namesr   )	r$   Zpos0Zcte_namer-   Zparensr.   Zcte_lenZstop_posZcolumn_namesr   r   r   r*   _   s    r*   c             C   sr   | j td\}}|o|jj }|dkr<| j |tdf\}}n|dksHf S | j|ddd\}}td	d
 t|D S )N)r/   insertupdatedeleteZ	returningZselectT)r    r!   c             s   s   | ]}|j  V  qd S )N)Zget_name)r   r/   r   r   r   r      s    z'extract_column_names.<locals>.<genexpr>)r2   r3   r4   )r0   r   valuelowerr   r%   r   _identifiers)Zparsedr-   r$   Ztok_valr   r   r   r1   r   s    r1   c             C   s   t dd | d | D S )Nc             s   s   | ]}t t|V  qd S )N)r   r#   )r   r/   r   r   r   r      s    z"token_start_pos.<locals>.<genexpr>)sum)r'   r-   r   r   r   r&      s    r&   c             c   sB   t | tr.x2| j D ]}t |tr|V  qW nt | tr>| V  d S )N)r(   r   r)   r   )r$   r/   r   r   r   r7      s    


r7   N)Zsqlparser   Zsqlparse.tokensr   r   r   Zsqlparse.sqlr   r   r   collectionsr	   r   r   r   r   r   r   r*   r1   r&   r7   r   r   r   r   <module>   s   
 /