Ë
    Ìi`8 ã                   ó@  — d dl Z 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 d dlmZ d dl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mZmZ d dl Z d d
l!m"Z"m#Z#m$Z$m%Z%m&Z&m'Z'm(Z( d dl)m*Z*m+Z+ d dl,m-Z- d dl.m/Z/m0Z0m1Z1 d dl2m3Z3 d dl4m5Z5m6Z6 d dl7m8Z8m9Z9m:Z:m;Z;m<Z<m=Z=m>Z> d dl?m@Z@mAZAmBZB d dlCmDZDmEZEmFZFmGZG d dlHmIZJ d dlKmLZLmMZMmNZN d dlOmPZPmQZQmRZR d dlSmTZTmUZUmVZVmWZWmXZX d dlYmZZZm[Z[ d dl\m]Z]m^Z^ d dl_m`Z`maZambZbmcZcmdZd d dlemfZf d dlgmhZh d dlimjZj d dlkmlZlmmZmmnZnmoZompZpmqZqmrZrmsZs d dltmuZumvZvmwZwmxZxmyZymzZzm{Z{ d dl|m}Z}m~Z~ d d lm€Z€  e€e�«      Z‚erd dlƒZƒd!Z„d"Z…d#Z†d$Z‡d%Zˆd&d'd(d)œd*d'd+d)œgZ‰ G d,„ d-eŠe«      Z‹d.eeŠd/f   fd0„ZŒd1eŠd2d3fd4„Z�d5eeeŠeŠf      d.ed3geŽf   fd6„Z�d7ee	   d8eeT   d9eŠd.e	fd:„Z�d;eeT   d.eŠfd<„Z‘d=„ Z’ G d>„ d?«      Z“e G d@„ dA«      «       Z” G dB„ dCe«      Z• G dD„ dEe«      Z–eB G dF„ dGeP¬H«      «       Z—dI�j1                  «       Z™d.ed/eeš   f   fdJ„Z›y)Ké    N)Úas_completedÚFuture)Úcontextmanager)Ú	dataclass)Údatetime)ÚEnum)Úimport_module)ÚSpawnContext)ÚAnyÚCallableÚDictÚ	FrozenSetÚIterableÚIteratorÚListÚMappingÚOptionalÚSetÚTupleÚTypeÚ	TypedDictÚUnionÚTYPE_CHECKING)ÚAdapterExecuteRecordÚ"AdapterGetPartitionsMetadataRecordÚAdapterConvertTypeRecordÚ"AdapterStandardizeGrantsDictRecordÚ(AdapterListRelationsWithoutCachingRecordÚ!AdapterGetColumnsInRelationRecordÚSubmitPythonJobRecord)ÚBehaviorÚBehaviorFlag)ÚCallableMacroGenerator)ÚColumnLevelConstraintÚConstraintTypeÚModelLevelConstraint)ÚCatalogTable)Ú
fire_eventÚwarn_or_error)ÚDbtInternalErrorÚDbtRuntimeErrorÚDbtValidationErrorÚMacroArgTypeErrorÚMacroResultErrorÚNotImplementedErrorÚUnexpectedNullError)Úauto_record_functionÚrecord_functionÚsupports_replay)ÚAttrDictÚcast_to_strÚexecutorÚfilter_null_values)ÚColumn)ÚAdapterResponseÚBaseConnectionManagerÚ
Connection)ÚAdapterMetaÚ	availableÚavailable_property)ÚBaseRelationÚComponentNameÚInformationSchemaÚSchemaSearchMapÚAdapterTrackingRelationInfo)ÚRelationsCacheÚ_make_ref_key_dict)Ú
CapabilityÚCapabilityDict)ÚCatalogIntegrationÚCatalogIntegrationClientÚCatalogIntegrationConfigÚCatalogRelationÚ%CATALOG_INTEGRATION_MODEL_CONFIG_NAME)ÚCredentials)ÚMacroResolverProtocol)ÚRelationConfig)Ú	CacheMissÚCatalogGenerationErrorÚCodeExecutionÚCodeExecutionStatusÚCollectFreshnessReturnSignatureÚConstraintNotEnforcedÚConstraintNotSupportedÚListRelations)ÚNullRelationCacheAttemptedErrorÚNullRelationDropAttemptedErrorÚQuoteConfigTypeErrorÚ$RelationReturnedMultipleResultsErrorÚRenameToNoneAttemptedErrorÚ#SnapshotTargetNotSnapshotTableErrorÚUnexpectedNonTimestampError)ÚAdapterConfigÚMacroContextGeneratorCallable)ÚAdapterLoggerÚget_catalogÚget_catalog_relationsÚcollect_freshnessÚcollect_freshness_custom_sqlÚget_relation_last_modifiedÚ8require_batched_execution_for_custom_microbatch_strategyFz9https://docs.getdbt.com/docs/build/incremental-microbatch)ÚnameÚdefaultÚdocs_urlÚ enable_truthy_nulls_equals_macroÚ c                   ó   — e Zd ZdZdZdZy)ÚConstraintSupportÚenforcedÚnot_enforcedÚnot_supportedN)Ú__name__Ú
__module__Ú__qualname__ÚENFORCEDÚNOT_ENFORCEDÚNOT_SUPPORTED© ó    úW/var/www/html/strategist-ai/venv/lib/python3.12/site-packages/dbt/adapters/base/impl.pyrn   rn   ˆ   s   „ Ø€HØ!€LØ#�Mry   rn   Úreturnúagate.Tablec                  ó    — ddl m} d |«       fS )Nr   )Úempty_tablerl   )Údbt_common.clients.agate_helperr~   )ÚargsÚkwargsr~   s      rz   Ú_parse_callback_empty_tabler‚   Ž   s   € å;à‰{‹}ÐÐry   ÚkeyÚrowú	agate.Rowc                 ó‚   — | |j                  «       vr)t        dj                  | |j                  «       «      «      ‚||    S )Nz*Got a row without "{}" column, columns: {})Úkeysr*   Úformat)rƒ   r„   s     rz   Ú_expect_row_valuer‰   •   s>   € Ø
�#—(‘(“*ÑÜØ8×?Ñ?ÀÀSÇXÁXÃZÓPó
ð 	
ð ˆs‰8€Ory   Úused_schemasc                 ó¼   ‡— t        d„ | D «       «      Š| D ��cg c]  \  }}|�|�Œ|‘Œ c}}x}rt        j                  d|› �«       dddt        fˆfd„}|S c c}}w )zlReturn a function that takes a row and decides if the row should be
    included in the catalog output.
    c              3   ón   K  — | ]-  \  }}|€Œ	|€Œ|j                  «       |j                  «       f–— Œ/ y ­w©N©Úlower)Ú.0ÚdÚss      rz   ú	<genexpr>z*_catalog_filter_schemas.<locals>.<genexpr>£   s2   è ø€ ò Ù#' 1 a¸1¹=ÈQÉ]ˆ�‰‹�A—G‘G“IÔñùs   ‚
5�5�%5zCused_schemas contains None for either database or schema, skipping r„   r…   r{   c                 ó´   •— t        d| «      }t        d| «      }|€y|€t        j                  d|› �«       y|j                  «       |j                  «       f‰v S )NÚtable_databaseÚtable_schemaFz!table_database is None, skipping )r‰   ÚloggerÚdebugr�   )r„   r•   r–   Úschemass      €rz   Útestz%_catalog_filter_schemas.<locals>.test«   sf   ø€ Ü*Ð+;¸SÓAˆÜ(¨¸Ó=ˆð ÐØØÐ!Ü�L‰LÐ<¸\¸NÐKÔLØØ×$Ñ$Ó&¨×(:Ñ(:Ó(<Ð=ÀÐHÐHry   )Ú	frozensetr—   r˜   Úbool)rŠ   r‘   r’   Únull_schemasrš   r™   s        @rz   Ú_catalog_filter_schemasrž   �   s{   ø€ ô ñ Ø+7ôó €Gð '3×M™d˜a °a°iÀ1Á9šÓMÐM€|ÐMÜ�‰ØQÐR^ÐQ_Ð`ô	
ðI�+ð I¤$õ Ið €Kùó% Ns
   ™A¦AÚdtÚsourceÚ
field_namec                 óæ   — | €t        ||«      ‚t        | d«      st        ||| «      ‚| j                  r| j	                  t
        j                  «      S | j                  t
        j                  ¬«      S )z‹If dt has a timezone, return a new datetime that's in UTC. Otherwise,
    assume the datetime is already for UTC and add the timezone.
    Útzinfo©r£   )r0   Úhasattrr^   r£   Ú
astimezoneÚpytzÚUTCÚreplace)rŸ   r    r¡   s      rz   Ú_utcrª   »   s^   € ð 
€zÜ! *¨fÓ5Ð5ä�R˜Ô"Ü)¨*°f¸bÓAÐAà	�ŠØ�}‰}œTŸX™XÓ&Ð&à�z‰z¤§¡ˆzÓ*Ð*ry   Úrelc                 ó   — | €yt        | «      S )Nznull relation)Ústr)r«   s    rz   Ú_relation_namer®   Ë   s   € Ø
€{Øä�3‹xˆry   c                 óF   ‡ — ‰ j                   dk7  rt        d«      ‚ˆ fd„}|S )NÚsubmit_python_jobz5this should be only used to log submit_python_job nowc            	      ó<  •— | d   }|j                   j                  «       j                  }t        t	        || d   ¬«      «       t        j
                  «       } ‰| Ž }t        t        |j                  t        t        j
                  «       |z
  d«      ¬«      «       |S )Nr   é   )Ú	conn_nameÚcode_content)ÚstatusÚelapsed)	ÚconnectionsÚget_thread_connectionrh   r(   rR   ÚtimerS   Ú_messageÚround)r€   ÚselfÚconnection_nameÚ
start_timeÚresponseÚcode_execution_functions        €rz   Úexecution_with_logz.log_code_execution.<locals>.execution_with_log×   sƒ   ø€ Ø�A‰wˆØ×*Ñ*×@Ñ@ÓB×GÑGˆÜ”=¨?ÈÈaÉÔQÔRÜ—Y‘Y“[ˆ
Ù*¨DÐ1ˆÜÜØ×(Ñ(´%¼¿¹»ÀzÑ9QÐTUÓ2Vôô	
ð
 ˆry   )rr   Ú
ValueError)rÀ   rÁ   s   ` rz   Úlog_code_executionrÃ   Ò   s+   ø€ à×'Ñ'Ð+>Ò>ÜÐPÓQÐQôð Ðry   c                   ó0   — e Zd Zdededdfd„Zdedefd„Zy)ÚPythonJobHelperÚparsed_modelÚ
credentialr{   Nc                 ó   — t        d«      ‚)Nz&PythonJobHelper is not implemented yet©r/   )r¼   rÆ   rÇ   s      rz   Ú__init__zPythonJobHelper.__init__è   s   € Ü!Ð"JÓKÐKry   Úcompiled_codec                 ó   — t        d«      ‚)Nz6PythonJobHelper submit function is not implemented yetrÉ   )r¼   rË   s     rz   ÚsubmitzPythonJobHelper.submitë   s   € Ü!Ð"ZÓ[Ð[ry   )	rr   rs   rt   r   rM   rÊ   r­   r   rÍ   rx   ry   rz   rÅ   rÅ   ç   s6   „ ðL Tð L°{ð LÀtó Lð\ Cð \¨Cô \ry   rÅ   c                   ó&   — e Zd ZU dZeed<   eed<   y)ÚPythonSubmissionResultz$Result from submitting a Python job.Úrun_idrË   N)rr   rs   rt   Ú__doc__r­   Ú__annotations__rx   ry   rz   rÏ   rÏ   ï   s   … á.àƒKØÔry   rÏ   c                   ó,   — e Zd ZU eed<   eed<   eed<   y)ÚFreshnessResponseÚmax_loaded_atÚsnapshotted_atÚageN)rr   rs   rt   r   rÒ   Úfloatrx   ry   rz   rÔ   rÔ   ÷   s   … ØÓØÓØ	„Jry   rÔ   c                   ó^   — e Zd ZU ee   ed<   ee   ed<   ee   ed<   ee   ed<   ee   ed<   y)ÚSnapshotStrategyÚ
unique_keyÚ
updated_atÚrow_changedÚscd_idÚhard_deletesN)rr   rs   rt   r   r­   rÒ   rx   ry   rz   rÚ   rÚ   ý   s4   … Ø˜‘ÓØ˜‘ÓØ˜#‘ÓØ�S‰MÓØ˜3‘-Ôry   rÚ   c                   óL  — e Zd ZU dZeZee   ed<   eZ	ee   ed<   ee
   ed<   g Zeee      ed<   eZee   ed<   ej"                  ej&                  ej(                  ej*                  ej,                  ej.                  ej0                  ej.                  ej2                  ej*                  iZdZ ei «      Zded	d
fd„Zde d	efd„Z!e"de#d	efd„«       Z$e"de%d	e&e'   fd„«       Z(de)d	d
fd„Z*d	e&e)   fd„Z+dåd„Z,de-d	d
fd„Z.e/d	e0fd„«       Z1e1jd                  de3e4   d	d
fd„«       Z1e5d	e3e4   fd„«       Z6dæd	e7fd„Z8dåd„Z9dåd„Z:dåd„Z;dåd „Z<dåd!„Z=d	e#fd"„Z>e?	 dçde#d$e@d	eAd
   fd%„«       ZB e"j†                  eD«       eEeFd#d#d&¬'«      	 	 	 dèd(e#d)eGd*eGd+e&eH   d	eIeJd,f   f
d-„«       «       ZKd(e#d	eJfd.„ZL eMd/d0¬1«       e"j†                  d2„ «      d(e#d	e3e   fd3„«       «       ZN eEeOd#d#d&¬'«       e"j†                  eD«      d4e#d	eId,   fd5„«       «       ZPeQd	e#fd6„«       ZRd7e&e#   d8e#d	eGfd9„ZSd:ee%   d	eTe   fd;„ZUd:ee%   d	eVfd<„ZWd	eXeYe3e   f   fd=„ZZd:ee%   d	e3e   fd>„Z[	 dæd:ee%   d?e&eTe      d	d
fd@„Z\	 	 déd:ee%   dAeGdBe&eTe      d	d
fdC„Z] eMdDd0¬1«      e"dEe&e   d	e#fdF„«       «       Z^ eMdGd0¬1«      e"dEe&e   d	e#fdH„«       «       Z_ eMdId0¬1«      e"dJe&e   dKe&e   d	e#fdL„«       «       Z`eQeajÄ                  d	e#fdM„«       «       ZceQeajÄ                  d	eGfdN„«       «       ZdeajÄ                  d7e#d	e3e#   fdO„«       Ze eMdPd0¬1«       e"j†                  dQ„ «      d7e#d8e#d	eGfdR„«       «       Zf eMdSd0¬1«      eajÄ                  e"jÎ                  dEed	d
fdT„«       «       «       Zh eMdUd0¬1«      eajÄ                  e"jÎ                  dEed	d
fdV„«       «       «       Zi eMdWd0¬1«      eajÄ                  e"jÎ                  dJedKed	d
fdX„«       «       «       Zj eEekd#d#d&¬'«      eajÄ                  e"jØ                  dEed	e3e   fdY„«       «       «       ZmdEed	e&en   fdZ„Zo eMd[d0¬1«       e"jà                  d\d]„ «      d8e#d^e#d	e3e   fd_„«       «       ZqeajÄ                  d`edaed	d
fdb„«       Zr eEesd#d#d&¬'«      eajÄ                  dced	e3e   fdd„«       «       Zt eEeud#d#d&¬'«      e"ded,d	evfdf„«       «       Zw eMdgd0¬1«      e"jØ                  dJedKed	e3e   fdh„«       «       Zx eMdid0¬1«      e"jÎ                  	 dædEedje&eXe#e#f      d	d
fdk„«       «       Zy eMdld0¬1«      e"jÎ                  dEedjeXe#e#f   dmezd	d
fdn„«       «       Z{ eMdod0¬1«      e"jÎ                  dJedKed	d
fdp„«       «       Z|d7e&e#   d8e#d	e3e   fdq„Z}d7e#d8e#d^e#d	eXe#e#f   fdr„Z~dse3e   d7e#d8e#d^e#d	e3e   f
dt„Z eMdud0¬1«      e"jÎ                  d7e#d8e#d^e#d	e&e   fdv„«       «       Z€ eMdwd0¬1«       e"jà                  dxdy„ «      d8e#de#d	eGfdz„«       «       Z� eMd{d0¬1«      eajÄ                  e"jÎ                  dEefd|„«       «       «       Z‚ eMd}d0¬1«      eajÄ                  e"jÎ                  dEefd~„«       «       «       Zƒe"eQ eMdd0¬1«      eajÄ                  d^e#d	e#fd€„«       «       «       «       Z„ eMd�d0¬1«      e"d^e#d‚e#d	e#fdƒ„«       «       Z… eMd„d0¬1«      e"d…e#d†e&eG   d	e#fd‡„«       «       Z†eQeajÄ                  dˆd,d‰eHd	e#fdŠ„«       «       Z‡eQeajÄ                  dˆd,d‰eHd	e#fd‹„«       «       ZˆeQdˆd,d‰eHd	e#fdŒ„«       Z‰eQeajÄ                  dˆd,d‰eHd	e#fd�„«       «       ZŠeQeajÄ                  dˆd,d‰eHd	e#fdŽ„«       «       Z‹eQeajÄ                  dˆd,d‰eHd	e#fd�„«       «       ZŒeQeajÄ                  dˆd,d‰eHd	e#fd�„«       «       Z�e"eQ eEeŽd#d#d&¬'«      dˆd,d‰eHd	e&e#   fd‘„«       «       «       Z�eQdˆd,d‰eHd	e&e#   fd’„«       Z�	 	 	 	 	 dêd“e#de&e)   d”e&e#   d•e&eXe#e@f      d–e&eXe#e@f      d—eGd	e‘fd˜„Z’eQd4d,d™e“eIe#e#f      d	d,fdš„«       Z”d›eYdœeTe#   d™e“eIe#e#f      d	d,fd�„Z•d›eYdže3e   d™e“eIe#e#f      d	d,fdŸ„Z–	 dæd:ee%   d™e“eIe#e#f      dže&eTe      fd „Z—d¡d¢džeTe   fd£„Z˜d:ee%   d™e“eIe#e#f      d	eId,e3e™   f   fd¤„Zšd™e“eIe#e#f      džeTe   d	eId,e3e™   f   fd¥„Z›d¦„ Zœ	 dæd“e#d–eXe#e@f   de&e)   d	eIe&eJ   e�f   fd§„Zž	 dæd¨ed©e#dªe&e#   de&e)   d	eIe&eJ   e�f   f
d«„ZŸ	 dæd¨ed(e#de&e)   d	eIe&eJ   e�f   fd¬„Z 	 dæd­e3e   de&e)   d	eIe3e&eJ      eXee�f   f   fd®„Z¡	 dæd¨ede&e)   d	eIe&eJ   e�f   fd¯„Z¢d°e&e£   d±e&e£   d	e�fd²„Z¤d¡d¢d4d,d	eIe@e�f   fd³„Z¥de¦e#e@f   d	e@fd´„Z§de¦e#e@f   dµe@d	d
fd¶„Z¨	 dæd·e#d¸e#d¹e#dºe&e#   d	e#f
d»„Z©dëd¼e#d½eHd¾e#d	e#fd¿„Zª	 dìd¼e#dÀe#d	e#fdÁ„Z«	 	 dídÂedÃedje&e3e#      dÄe#d	e#f
dÅ„Z¬e5d	eXe#ee­   f   fdÆ„«       Z®e5d	e#fdÇ„«       Z¯e° eEe±d#d#d&¬'«      dÈevdÉe#d	eJfdÊ„«       «       Z²dËe@d	eJfdÌ„Z³dÍ„ Z´dÎ„ Zµe"jÎ                  dme#fdÏ„«       Z¶eQdÐeXe#e@f   d	e·fdÑ„«       Z¸eQdÒe·d	e&e#   fdÓ„«       Z¹e"eQ eMdÔd0¬1«      dÕeXe#eXe#e@f   f   d	e3e#   fdÖ„«       «       «       ZºeQd×e»e·e¼f   d	e&e#   fdØ„«       Z½eQdÐeXe#e@f   d	e¼fdÙ„«       Z¾e"eQ eMdÚd0¬1«      dÛe3eXe#e@f      d	e3e#   fdÜ„«       «       «       Z¿eQdÐeXe#e@f   d	e&e#   fdÝ„«       ZÀeQdÒe¼d	e&e#   fdÞ„«       ZÁeQd	efdß„«       ZÂeQdàeÃd	eGfdá„«       ZÄeQde%d	eÅfdâ„«       ZÆeQd	eXe#e@f   fdã„«       ZÇe"jÎ                  eQdeXe#e#f   d	e#fdä„«       «       ZÈy
)îÚBaseAdaptera’  The BaseAdapter provides an abstract base class for adapters.

    Adapters must implement the following methods and macros. Some of the
    methods can be safely overridden as a noop, where it makes sense
    (transactions on databases that don't support them, for instance). Those
    methods are marked with a (passable) in their docstrings. Check docstrings
    for type information, etc.

    To implement a macro, implement "${adapter_type}__${macro_name}" in the
    adapter's internal project.

    To invoke a method in an adapter macro, call it on the 'adapter' Jinja
    object using dot syntax.

    To invoke a method in model code, add the @available decorator atop a method
    declaration. Methods are invoked as macros.

    Methods:
        - exception_handler
        - date_function
        - list_schemas
        - drop_relation
        - truncate_relation
        - rename_relation
        - get_columns_in_relation
        - get_catalog_for_single_relation
        - get_column_schema_from_query
        - expand_column_types
        - list_relations_without_caching
        - is_cancelable
        - create_schema
        - drop_schema
        - quote
        - convert_text_type
        - convert_number_type
        - convert_boolean_type
        - convert_datetime_type
        - convert_date_type
        - convert_time_type
        - standardize_grants_dict

    Macros:
        - get_catalog
    ÚRelationr8   ÚConnectionManagerÚCATALOG_INTEGRATIONSÚAdapterSpecificConfigséd   Ú
mp_contextr{   Nc                 óÜ   — || _         t        |j                  ¬«      | _        | j	                  ||«      | _        d | _        d | _        t        | _	        t        | j                  «      | _        y )N)Úlog_cache_events)ÚconfigrD   ré   Úcacherã   r·   Ú_macro_resolverÚ_macro_context_generatorÚDEFAULT_BASE_BEHAVIOR_FLAGSÚbehaviorrI   rä   Ú_catalog_client)r¼   rê   rç   s      rz   rÊ   zBaseAdapter.__init__K  sZ   € ØˆŒÜ#°V×5LÑ5LÔMˆŒ
Ø×1Ñ1°&¸*ÓEˆÔØ@DˆÔØQUˆÔ%Ü3ˆŒÜ7¸×8QÑ8QÓRˆÕry   Úcatalog_integrationc                 ó8   — | j                   j                  |«      S r�   )rð   Úadd)r¼   rñ   s     rz   Úadd_catalog_integrationz#BaseAdapter.add_catalog_integrationT  s   € ð ×#Ñ#×'Ñ'Ð(;Ó<Ð<ry   rh   c                 ó8   — | j                   j                  |«      S r�   )rð   Úget©r¼   rh   s     rz   Úget_catalog_integrationz#BaseAdapter.get_catalog_integrationY  s   € à×#Ñ#×'Ñ'¨Ó-Ð-ry   rê   c                 óÞ   — |j                   sy |j                   j                  t        «      xs |j                   j                  d«      x}r"| j                  |«      }|j	                  |«      S y )NÚcatalog)rê   rö   rL   rø   Úbuild_relation)r¼   rê   Úcatalog_namerú   s       rz   Úbuild_catalog_relationz"BaseAdapter.build_catalog_relation]  sl   € à�}Š}Øð "Ÿ=™=×,Ñ,Ü1ó
ò *à�]‰]×Ñ˜yÓ)ð*ˆ<ð *ð ×2Ñ2°<Ó@ˆGØ×)Ñ)¨&Ó1Ð1àry   Úmacro_resolverc                 ó   — || _         y r�   ©rì   )r¼   rþ   s     rz   Úset_macro_resolverzBaseAdapter.set_macro_resolvern  s
   € Ø-ˆÕry   c                 ó   — | j                   S r�   r   ©r¼   s    rz   Úget_macro_resolverzBaseAdapter.get_macro_resolverq  s   € Ø×#Ñ#Ð#ry   c                 ó,   — | j                   �d | _         y y r�   r   r  s    rz   Úclear_macro_resolverz BaseAdapter.clear_macro_resolvert  s   € Ø×ÑÐ+Ø#'ˆDÕ ð ,ry   Úmacro_context_generatorc                 ó   — || _         y r�   )rí   )r¼   r  s     rz   Úset_macro_context_generatorz'BaseAdapter.set_macro_context_generatorx  s   € ð )@ˆÕ%ry   c                 ó   — | j                   S r�   )Ú	_behaviorr  s    rz   rï   zBaseAdapter.behavior~  s   € à�~‰~Ðry   Úflagsc                 óŠ   — |j                  | j                  «       t        | j                  di «      }t	        ||«      | _        y )Nr  )ÚextendÚ_behavior_flagsÚgetattrrê   r!   r  )r¼   r  Úuser_overridess      rz   rï   zBaseAdapter.behavior‚  s6   € à�‰�T×)Ñ)Ô*ô
 ! §¡¨g°rÓ:ˆä! %¨Ó8ˆ�ry   c                 ó   — g S )zê
        This method should be overwritten by adapter maintainers to provide platform-specific flags

        The BaseAdapter should NOT include any global flags here as those should be defined via DEFAULT_BASE_BEHAVIOR_FLAGS
        rx   r  s    rz   r  zBaseAdapter._behavior_flags�  s	   € ð ˆ	ry   c                 ó8   — | j                   j                  |«      S r�   )r·   Úset_connection_namer÷   s     rz   Úacquire_connectionzBaseAdapter.acquire_connection™  s   € Ø×Ñ×3Ñ3°DÓ9Ð9ry   c                 ó8   — | j                   j                  «        y r�   )r·   Úreleaser  s    rz   Úrelease_connectionzBaseAdapter.release_connectionœ  s   € Ø×Ñ× Ñ Õ"ry   c                 ó8   — | j                   j                  «        y r�   )r·   Úcleanup_allr  s    rz   Úcleanup_connectionszBaseAdapter.cleanup_connectionsŸ  s   € Ø×Ñ×$Ñ$Õ&ry   c                 ó8   — | j                   j                  «        y r�   )r·   Úclear_transactionr  s    rz   r  zBaseAdapter.clear_transaction¢  s   € Ø×Ñ×*Ñ*Õ,ry   c                 ó8   — | j                   j                  «        y r�   )r·   Úcommit_if_has_connectionr  s    rz   r  z$BaseAdapter.commit_if_has_connection¥  s   € Ø×Ñ×1Ñ1Õ3ry   c                 ó&   — | j                  d«       y )Nzselect 1 as id)Úexecuter  s    rz   Údebug_queryzBaseAdapter.debug_query¨  s   € Ø�‰Ð%Õ&ry   c                 ól   — | j                   j                  «       }|�|j                  €y|j                  S )Nz<None>)r·   Úget_if_existsrh   )r¼   Úconns     rz   Únice_connection_namez BaseAdapter.nice_connection_name«  s1   € Ø×Ñ×-Ñ-Ó/ˆØˆ<˜4Ÿ9™9Ð,ØØ�y‰yÐry   TÚquery_header_contextc              #   óî  K  — 	 | j                   j                  �&| j                   j                  j                  ||«       | j                  |«       d –— |r| j	                  «        | j                   j                  �%| j                   j                  j                  «        y y # |r| j	                  «        | j                   j                  �%| j                   j                  j                  «        w w xY w­wr�   )r·   Úquery_headerÚsetr  r  Úreset)r¼   rh   r'  Úshould_release_connections       rz   Úconnection_namedzBaseAdapter.connection_named±  sÊ   è ø€ ð
	6Ø×Ñ×,Ñ,Ð8Ø× Ñ ×-Ñ-×1Ñ1°$Ð8LÔMØ×#Ñ# DÔ)Ûá(Ø×'Ñ'Ô)à×Ñ×,Ñ,Ð8Ø× Ñ ×-Ñ-×3Ñ3Õ5ð 9øñ )Ø×'Ñ'Ô)à×Ñ×,Ñ,Ð8Ø× Ñ ×-Ñ-×3Ñ3Õ5ð 9üs   ‚C5„AB# ÁAC5Â#AC2Ã2C5Ú	thread_id)ÚmethodÚindex_on_thread_idÚid_field_nameÚsqlÚ
auto_beginÚfetchÚlimitr|   c                 ó@   — | j                   j                  ||||¬«      S )a
  Execute the given SQL. This is a thin wrapper around
        ConnectionManager.execute.

        :param str sql: The sql to execute.
        :param bool auto_begin: If set, and dbt is not currently inside a
            transaction, automatically begin one.
        :param bool fetch: If set, fetch results.
        :param Optional[int] limit: If set, only fetch n number of rows
        :return: A tuple of the query status and results (empty if fetch=False).
        :rtype: Tuple[AdapterResponse, "agate.Table"]
        )r2  r3  r4  r5  )r·   r!  )r¼   r2  r3  r4  r5  s        rz   r!  zBaseAdapter.executeÁ  s%   € ð, ×Ñ×'Ñ'¨C¸JÈeÐ[`Ð'ÓaÐary   c                 ó   — t        d«      ‚)a{  Submit the given SQL to the engine for validation, but not execution.

        This should throw an appropriate exception if the input SQL is invalid, although
        in practice that will generally be handled by delegating to an existing method
        for execution and allowing the error handler to take care of the rest.

        :param str sql: The sql to validate
        z3`validate_sql` is not implemented for this adapter!rÉ   )r¼   r2  s     rz   Úvalidate_sqlzBaseAdapter.validate_sqlÙ  s   € ô "Ð"WÓXÐXry   ÚAdapterGetColumnSchemaFromQueryÚ	Available)Úgroupc                  ó   — g S r�   rx   ©ÚaÚks     rz   ú<lambda>zBaseAdapter.<lambda>å  s   €  R€ ry   c                 óö   — | j                   j                  |«      \  }}|j                  D ���cg c]:  ^}}}| j                  j	                  || j                   j                  |«      «      ‘Œ< }}}}|S c c}}}w )zGGet a list of the Columns with names and data types from the given sql.)r·   Úadd_select_queryÚdescriptionr8   ÚcreateÚdata_type_code_to_name)r¼   r2  Ú_ÚcursorÚcolumn_nameÚcolumn_type_codeÚcolumnss          rz   Úget_column_schema_from_queryz(BaseAdapter.get_column_schema_from_queryä  sƒ   € ð ×$Ñ$×5Ñ5°cÓ:‰	ˆˆ6ð 6<×5GÑ5G÷
ð 
ð
 2�Ð-°ð	 �K‰K×ÑØ˜T×-Ñ-×DÑDÐEUÓVõð
ˆò 
ð ˆùô
s   ¯?A4Útablec                 ó|   — t        | j                  d«      r| j                  j                  |¬«      S t        d«      ‚)a¡  
        TODO: Can we move this to dbt-bigquery?
        Obtain partitions metadata for a BigQuery partitioned table.

        :param str table: a partitioned table id, in standard SQL format.
        :return: a partition metadata tuple, as described in
            https://cloud.google.com/bigquery/docs/creating-partitioned-tables#getting_partition_metadata_using_meta_tables.
        :rtype: "agate.Table"
        Úget_partitions_metadata)rL  z>`get_partitions_metadata` is not implemented for this adapter!)r¥   r·   rN  r/   )r¼   rL  s     rz   rN  z#BaseAdapter.get_partitions_metadataò  s?   € ô" �4×#Ñ#Ð%>Ô?Ø×#Ñ#×;Ñ;À%Ð;ÓHÐHä%ØPóð ry   c                 ó.   — | j                   j                  S )z�Get the type of this adapter. Types must be class-unique and
        consistent.

        :return: The type name
        :rtype: str
        )rã   ÚTYPE©Úclss    rz   ÚtypezBaseAdapter.type  s   € ð ×$Ñ$×)Ñ)Ð)ry   ÚdatabaseÚschemac                 ó‚   — ||f| j                   vr/t        t        | j                  «       t	        |«      |¬«      «       yy)z@Check if the schema is cached, and by default logs if it is not.)r³   rT  rU  FT)rë   r(   rP   r&  r5   )r¼   rT  rU  s      rz   Ú_schema_is_cachedzBaseAdapter._schema_is_cached  sD   € ð �fÐ T§Z¡ZÑ/ÜÜØ"×7Ñ7Ó9Ü(¨Ó2Ø!ôôð àry   Úrelation_configsc                 ó’   — |D �ch c]7  }| j                   j                  | j                  |¬«      j                  «       ’Œ9 c}S c c}w )zXGet the set of schema relations that the cache logic needs to
        populate.
        ©ÚquotingÚrelation_config)râ   Úcreate_fromrê   Úwithout_identifier)r¼   rX  r\  s      rz   Ú_get_cache_schemaszBaseAdapter._get_cache_schemas(  sQ   € ð $4ö	
ð  ð �M‰M×%Ñ%ØŸ™°_ð &ó ç Ñ Ó"ñ#ò
ð 	
ùò 
s   …<Ac                 ól   — t        «       }| j                  |«      }|D ]  }|j                  |«       Œ |S )a�  Get a mapping of each node's "information_schema" relations to a
        set of all schemas expected in that information_schema.

        There may be keys that are technically duplicates on the database side,
        for example all of '"foo", 'foo', '"FOO"' and 'FOO' could coexist as
        databases, and values could overlap as appropriate. All values are
        lowercase strings.
        )rB   Ú_get_catalog_relationsró   )r¼   rX  Úinfo_schema_name_mapÚ	relationsÚrelations        rz   Ú_get_catalog_schemasz BaseAdapter._get_catalog_schemas3  sC   € ô  /Ó0ÐØ×/Ñ/Ð0@ÓAˆ	Ø!ò 	/ˆHØ ×$Ñ$ XÕ.ð	/ð $Ð#ry   c                 ó‚   — t        «       }|D ]/  }|j                  «       }||vrg ||<   ||   j                  |«       Œ1 |S r�   )ÚdictÚinformation_schema_onlyÚappend)r¼   rc  Úrelations_by_info_schemard  Úinfo_schemas        rz   Ú%_get_catalog_relations_by_info_schemaz1BaseAdapter._get_catalog_relations_by_info_schemaF  s]   € ô QUÓPVÐ Ø!ò 	CˆHØ"×:Ñ:Ó<ˆKØÐ":Ñ:Ø8:Ð(¨Ñ5Ø$ [Ñ1×8Ñ8¸ÕBð		Cð (Ð'ry   c                 óx   — |D �cg c])  }| j                   j                  | j                  |¬«      ‘Œ+ }}|S c c}w )NrZ  )râ   r]  rê   )r¼   rX  r\  rc  s       rz   ra  z"BaseAdapter._get_catalog_relationsR  sF   € ð
 $4ö
àð �M‰M×%Ñ%¨d¯k©kÈ?Ð%Õ[ð
ˆ	ð 
ð Ðùò	
s   ….7Úcache_schemasc           	      ód  — |s| j                  |«      }t        | j                  «      5 }g }|D ]K  }|j                  | d|j                  › d|j
                  › �| j                  |«      }|j                  |«       ŒM t        |«      D ]2  }|j                  «       D ]  }| j                  j                  |«       Œ Œ4 	 ddd«       t        «       }	|D ]6  }|j
                  sŒ|	j                  |j                  |j
                  f«       Œ8 | j                  j                  |	«       y# 1 sw Y   ŒjxY w)z~Populate the relations cache for the given schemas. Returns an
        iterable of the schemas populated, as strings.
        Úlist_rF  N)r_  r6   rê   Úsubmit_connectedrT  rU  Úlist_relations_without_cachingri  r   Úresultrë   ró   r*  Úupdate_schemas)
r¼   rX  rn  ÚtpeÚfuturesÚcache_schemaÚfutÚfuturerd  Úcache_updates
             rz   Ú_relations_cache_for_schemasz(BaseAdapter._relations_cache_for_schemas[  s)  € ñ Ø ×3Ñ3Ð4DÓEˆMÜ�d—k‘kÓ"ð 	- cØ8:ˆGØ -ò $�Ø×*Ñ*ØØ˜L×1Ñ1Ð2°!°L×4GÑ4GÐ3HÐIØ×7Ñ7Ø ó	�ð —‘˜sÕ#ð$ô ' wÓ/ò -�ð !'§¡£ò -�HØ—J‘J—N‘N 8Õ,ñ-ñ-÷	-ô( 8;³uˆØ%ò 	GˆHØ�‹Ø× Ñ  (×"3Ñ"3°X·_±_Ð!EÕFð	Gð 	�
‰
×!Ñ! ,Õ/÷1	-ð 	-ús   ©BD&Ä&D/ÚclearÚrequired_schemasc                 ó¶   — | j                   j                  5  |r| j                   j                  «        | j                  ||«       ddd«       y# 1 sw Y   yxY w)z|Run a query that gets a populated cache of the relations in the
        database and set the cache on this adapter.
        N)rë   Úlockr|  r{  )r¼   rX  r|  r}  s       rz   Úset_relations_cachezBaseAdapter.set_relations_cache  sM   € ð �Z‰Z�_‰_ñ 	RÙØ—
‘
× Ñ Ô"Ø×-Ñ-Ð.>Ð@PÔQ÷	R÷ 	Rñ 	Rús   —/AÁAÚAdapterCacheAddedrd  c                 ót   — |€| j                  «       }t        |«      ‚| j                  j                  |«       y)zACache a new relation in dbt. It will show up in `list relations`.rl   )r&  rX   rë   ró   ©r¼   rd  rh   s      rz   Úcache_addedzBaseAdapter.cache_added�  s6   € ð ÐØ×,Ñ,Ó.ˆDÜ1°$Ó7Ð7Ø�
‰
�‰�xÔ àry   ÚAdapterCacheDroppedc                 ót   — |€| j                  «       }t        |«      ‚| j                  j                  |«       y)zŠDrop a relation in dbt. It will no longer show up in
        `list relations`, and any bound views will be dropped from the cache
        rl   )r&  rY   rë   Údroprƒ  s      rz   Úcache_droppedzBaseAdapter.cache_dropped˜  s6   € ð ÐØ×,Ñ,Ó.ˆDÜ0°Ó6Ð6Ø�
‰
�‰˜Ô!Øry   ÚAdapterCacheRenamedÚfrom_relationÚto_relationc                 óª   — |�|€3| j                  «       }t        |«      }t        |«      }t        |||«      ‚| j                  j	                  ||«       y)z‚Rename a relation in dbt. It will show up with a new name in
        `list_relations`, but bound views will remain bound.
        rl   )r&  r®   r\   rë   Úrename)r¼   rŠ  r‹  rh   Úsrc_nameÚdst_names         rz   Úcache_renamedzBaseAdapter.cache_renamed¤  sW   € ð Ð  KÐ$7Ø×,Ñ,Ó.ˆDÜ% mÓ4ˆHÜ% kÓ2ˆHÜ,¨X°xÀÓFÐFà�
‰
×Ñ˜-¨Ô5Øry   c                 ó   — t        d«      ‚)z6Get the date function used by this adapter's database.z4`date_function` is not implemented for this adapter!rÉ   rQ  s    rz   Údate_functionzBaseAdapter.date_functionº  s   € ô "Ð"XÓYÐYry   c                 ó   — t        d«      ‚)Nz4`is_cancelable` is not implemented for this adapter!rÉ   rQ  s    rz   Úis_cancelablezBaseAdapter.is_cancelableÀ  s   € ô "Ð"XÓYÐYry   c                 ó   — t        d«      ‚)z*Get a list of existing schemas in databasez3`list_schemas` is not implemented for this adapter!rÉ   )r¼   rT  s     rz   Úlist_schemaszBaseAdapter.list_schemasÈ  s   € ô "Ð"WÓXÐXry   ÚAdapterCheckSchemaExistsc                   ó   — y©NFrx   r=  s     rz   r@  zBaseAdapter.<lambda>Î  ó   � ry   c                 óX   — d„ | j                  |¬«      D «       }|j                  «       |v S )zØCheck if a schema exists.

        The default implementation of this is potentially unnecessarily slow,
        and adapters should implement it if there is an optimized path (and
        there probably is)
        c              3   ó<   K  — | ]  }|j                  «       –— Œ y ­wr�   rŽ   )r�   r’   s     rz   r“   z2BaseAdapter.check_schema_exists.<locals>.<genexpr>Ö  s   è ø€ ÒJ �!—'‘'—)ÑJùs   ‚)rT  )r–  r�   )r¼   rT  rU  Úsearchs       rz   Úcheck_schema_existszBaseAdapter.check_schema_existsÍ  s.   € ñ K T×%6Ñ%6ÀÐ%6Ó%IÔJˆØ�|‰|‹~ Ð'Ð'ry   ÚAdapterDropRelationc                 ó   — t        d«      ‚)znDrop the given relation.

        *Implementors must call self.cache.drop() to preserve cache state!*
        z4`drop_relation` is not implemented for this adapter!rÉ   ©r¼   rd  s     rz   Údrop_relationzBaseAdapter.drop_relationÜ  s   € ô "Ð"XÓYÐYry   ÚAdapterTruncateRelationc                 ó   — t        d«      ‚)zTruncate the given relation.z8`truncate_relation` is not implemented for this adapter!rÉ   r¡  s     rz   Útruncate_relationzBaseAdapter.truncate_relationæ  s   € ô
 "Ð"\Ó]Ð]ry   ÚAdapterRenameRelationc                 ó   — t        d«      ‚)zŒRename the relation from from_relation to to_relation.

        Implementors must call self.cache.rename() to preserve cache state.
        z6`rename_relation` is not implemented for this adapter!rÉ   ©r¼   rŠ  r‹  s      rz   Úrename_relationzBaseAdapter.rename_relationí  s   € ô "Ð"ZÓ[Ð[ry   c                 ó   — t        d«      ‚)z0Get a list of the columns in the given Relation.z>`get_columns_in_relation` is not implemented for this adapter!rÉ   r¡  s     rz   Úget_columns_in_relationz#BaseAdapter.get_columns_in_relation÷  s   € ô "Ð"bÓcÐcry   c                 ó   — t        d«      ‚)z^Get catalog information including table-level and column-level metadata for a single relation.zF`get_catalog_for_single_relation` is not implemented for this adapter!rÉ   r¡  s     rz   Úget_catalog_for_single_relationz+BaseAdapter.get_catalog_for_single_relation  s   € ä!ØTó
ð 	
ry   ÚAdapterGetColumnsInTabler«  c                  ó   — g S r�   rx   r=  s     rz   r@  zBaseAdapter.<lambda>
  s   € ÀR€ ry   Ú
identifierc                 óÆ   — | j                   j                  | j                  j                  j                  ||| j                  j
                  ¬«      }| j                  |«      S )z9DEPRECATED: Get a list of the columns in the given table.©rT  rU  r°  Úquote_policy)râ   rD  rê   ÚcredentialsrT  r[  r«  )r¼   rU  r°  rd  s       rz   Úget_columns_in_tablez BaseAdapter.get_columns_in_table	  sV   € ð —=‘=×'Ñ'Ø—[‘[×,Ñ,×5Ñ5ØØ!ØŸ™×,Ñ,ð	 (ó 
ˆð ×+Ñ+¨HÓ5Ð5ry   ÚgoalÚcurrentc                 ó   — t        d«      ‚)aW  Expand the current table's types to match the goal table. (passable)

        :param self.Relation goal: A relation that currently exists in the
            database with columns of the desired types.
        :param self.Relation current: A relation that currently exists in the
            database with columns of unspecified types.
        zA`expand_target_column_types` is not implemented for this adapter!rÉ   )r¼   r¶  r·  s      rz   Úexpand_column_typeszBaseAdapter.expand_column_types  s   € ô "ØOó
ð 	
ry   Úschema_relationc                 ó   — t        d«      ‚)a^  List relations in the given schema, bypassing the cache.

        This is used as the underlying behavior to fill the cache.

        :param schema_relation: A relation containing the database and schema
            as appropraite for the underlying data warehouse
        :return: The relations in schema
        :rtype: List[self.Relation]
        zE`list_relations_without_caching` is not implemented for this adapter!rÉ   )r¼   rº  s     rz   rr  z*BaseAdapter.list_relations_without_caching"  s   € ô" "ØSó
ð 	
ry   Úgrants_tablec                 ó¢   — i }|D ]G  }|d   }|d   }||j                  «       v r||   j                  |«       Œ4|j                  ||gi«       ŒI |S )a?  Translate the result of `show grants` (or equivalent) to match the
        grants which a user would configure in their project.

        Ideally, the SQL to show grants should also be filtering:
        filter OUT any grants TO the current user/role (e.g. OWNERSHIP).
        If that's not possible in SQL, it can be done in this method instead.

        :param grants_table: An agate table containing the query result of
            the SQL returned by get_show_grant_sql
        :return: A standardized dictionary matching the `grants` config
        :rtype: dict
        ÚgranteeÚprivilege_type)r‡   ri  Úupdate)r¼   r¼  Úgrants_dictr„   r¾  Ú	privileges         rz   Ústandardize_grants_dictz#BaseAdapter.standardize_grants_dict:  sm   € ð* -/ˆØò 	;ˆCØ˜)‘nˆGØÐ,Ñ-ˆIØ˜K×,Ñ,Ó.Ñ.Ø˜IÑ&×-Ñ-¨gÕ6à×"Ñ" I°¨yÐ#9Õ:ð	;ð Ðry   ÚAdapterGetMissingColumnsc                 ó8  — t        || j                  «      st        dd|| j                  ¬«      ‚t        || j                  «      st        dd|| j                  ¬«      ‚| j                  |«      D �ci c]  }|j                  |“Œ }}| j                  |«      D �ci c]  }|j                  |“Œ }}t        |j                  «       «      t        |j                  «       «      z
  }|j                  «       D ��cg c]  \  }}||v sŒ|‘Œ c}}S c c}w c c}w c c}}w )z^Returns a list of Columns in from_relation that are missing from
        to_relation.
        Úget_missing_columnsrŠ  ©Úmethod_nameÚarg_nameÚ	got_valueÚexpected_typer‹  )Ú
isinstancerâ   r-   r«  rh   r*  r‡   Úitems)r¼   rŠ  r‹  ÚcolÚfrom_columnsÚ
to_columnsÚmissing_columnsÚcol_names           rz   rÆ  zBaseAdapter.get_missing_columns\  s  € ô ˜-¨¯©Ô7Ü#Ø1Ø(Ø'Ø"Ÿm™mô	ð ô ˜+ t§}¡}Ô5Ü#Ø1Ø&Ø%Ø"Ÿm™mô	ð ð 26×1MÑ1MÈmÓ1\Ö]¨#˜Ÿ™ #™Ð]ˆÐ]à/3×/KÑ/KÈKÓ/XÖY¨�c—h‘h ‘mÐYˆ
ÐYä˜l×/Ñ/Ó1Ó2´S¸¿¹Ó9JÓ5KÑKˆà+7×+=Ñ+=Ó+?×_™˜ 3À8ÈÒC^’Ó_Ð_ùò ^ùâYùó `s   Á2DÂDÃ7DÄDÚAdapterValidSnapshotTargetÚcolumn_namesc                 ó4  — t        || j                  «      st        dd|| j                  ¬«      ‚| j                  |«      }t	        d„ |D «       «      }g }dD ]2  }|r||   n|}|sŒ|j                  «       |vsŒ"|j                  |«       Œ4 |rt        |«      ‚y)zîEnsure that the target relation is valid, by making sure it has the
        expected columns.

        :param Relation relation: The relation to check
        :raises InvalidMacroArgType: If the columns are
            incorrect.
        Úvalid_snapshot_targetrd  rÇ  c              3   óP   K  — | ]  }|j                   j                  «       –— Œ  y ­wr�   ©rh   r�   ©r�   Úcs     rz   r“   z4BaseAdapter.valid_snapshot_target.<locals>.<genexpr>‘  s   è ø€ Ò4 q�A—F‘F—L‘L—NÑ4ùó   ‚$&)Ú
dbt_scd_idÚdbt_valid_fromÚdbt_valid_toN)rÌ  râ   r-   r«  r*  r�   ri  r]   )r¼   rd  rÔ  rJ  ÚnamesÚmissingÚcolumnÚdesireds           rz   rÖ  z!BaseAdapter.valid_snapshot_target|  s§   € ô ˜( D§M¡MÔ2Ü#Ø3Ø#Ø"Ø"Ÿm™mô	ð ð ×.Ñ.¨xÓ8ˆÜÑ4¨GÔ4Ó4ˆØˆð Gò 	(ˆFÙ.:�l 6Ò*ÀˆGÚ˜7Ÿ=™=›?°%Ò7Ø—‘˜wÕ'ð	(ñ
 Ü5°gÓ>Ð>ð ry   Ú-AdapterAssertValidSnapshotTargetGivenStrategyÚstrategyc                 ó  — | j                  ||«       |j                  dd «      dk(  rY| j                  |«      }t        d„ |D «       «      }g }dD ]!  }|r||   n|}||vsŒ|j	                  |«       Œ# |rt        |«      ‚y y )Nrß   Ú
new_recordc              3   óP   K  — | ]  }|j                   j                  «       –— Œ  y ­wr�   rØ  rÙ  s     rz   r“   zJBaseAdapter.assert_valid_snapshot_target_given_strategy.<locals>.<genexpr>ª  s   è ø€ Ò8¨1˜Ÿ™Ÿ™ŸÑ8ùrÛ  )Údbt_is_deleted)rÖ  rö   r«  r*  ri  r]   )	r¼   rd  rÔ  rä  rJ  rß  rà  rá  râ  s	            rz   Ú+assert_valid_snapshot_target_given_strategyz7BaseAdapter.assert_valid_snapshot_target_given_strategy�  s™   € ð 	×"Ñ" 8¨\Ô:ð �<‰<˜¨Ó-°Ò=Ø×2Ñ2°8Ó<ˆGÜÑ8°Ô8Ó8ˆEØˆGà-ò ,�Ù2>˜, vÒ.ÀF�Ø %Ò'Ø—N‘N 7Õ+ð,ñ
 Ü9¸'ÓBÐBð ð >ry   ÚAdapterExpandTargetColumnTypesc                 óä   — t        || j                  «      st        dd|| j                  ¬«      ‚t        || j                  «      st        dd|| j                  ¬«      ‚| j                  ||«       y )NÚexpand_target_column_typesrŠ  rÇ  r‹  )rÌ  râ   r-   r¹  r¨  s      rz   rì  z&BaseAdapter.expand_target_column_typesµ  sn   € ô ˜-¨¯©Ô7Ü#Ø8Ø(Ø'Ø"Ÿm™mô	ð ô ˜+ t§}¡}Ô5Ü#Ø8Ø&Ø%Ø"Ÿm™mô	ð ð 	× Ñ  °Õ<ry   c                 ó  — | j                  ||«      r| j                  j                  ||«      S | j                  j	                  ||d| j
                  j                  ¬«      j                  «       }| j                  |«      }| j                  rB|D ]  }| j                  j                  |«       Œ |s| j                  j                  ||fg«       t        t        t        |«      ||D �cg c]  }t        |«      ‘Œ c}¬«      «       |S c c}w )Nrl   r²  )rT  rU  rc  )rW  rë   Úget_relationsrâ   rD  rê   r[  r^  rr  ró   rt  r(   rW   r5   rE   )r¼   rT  rU  rº  rc  rd  Úxs          rz   Úlist_relationszBaseAdapter.list_relationsÍ  sü   € Ø×!Ñ! (¨FÔ3Ø—:‘:×+Ñ+¨H°fÓ=Ð=àŸ-™-×.Ñ.ØØØØŸ™×,Ñ,ð	 /ó 
÷
 Ñ
Ó
ð 	ð ×7Ñ7¸ÓHˆ	ð �:Š:Ø%ò )�Ø—
‘
—‘˜xÕ(ð)áð —
‘
×)Ñ)¨H°fÐ+=Ð*>Ô?äÜÜ$ XÓ.ØØ:CÖD°QÔ-¨aÕ0ÒDôô	
ð Ðùò	 Es   Ã(Dc                 óâ   — | j                   j                  }|�|d   du r|j                  «       }|�|d   du r|j                  «       }|�|d   du r|j                  «       }t        |||dœ«      S )Nr°  FrU  rT  )rT  r°  rU  )rê   r[  r�   r7   )r¼   rT  rU  r°  r[  s        rz   Ú_make_match_kwargszBaseAdapter._make_match_kwargsñ  s‡   € Ø—+‘+×%Ñ%ˆØÐ! g¨lÑ&;¸uÑ&DØ#×)Ñ)Ó+ˆJàÐ '¨(Ñ"3°uÑ"<Ø—\‘\“^ˆFàÐ G¨JÑ$7¸5Ñ$@Ø—~‘~Ó'ˆHä!à$Ø(Ø ñó
ð 	
ry   Úrelations_listc                 ó†   — g }| j                  |||«      }|D ]&  } |j                  di |¤ŽsŒ|j                  |«       Œ( |S )Nrx   )rò  Úmatchesri  )r¼   ró  rT  rU  r°  rõ  r�  rd  s           rz   Ú_make_matchzBaseAdapter._make_match  sR   € ð ˆà×(Ñ(¨°6¸:ÓFˆà&ò 	)ˆHØˆx×ÑÑ) &Ó)Ø—‘˜xÕ(ð	)ð ˆry   ÚAdapterGetRelationc                 óž   — | j                  ||«      }| j                  ||||«      }t        |«      dkD  r|||dœ}t        ||«      ‚|r|d   S y )Né   )r°  rU  rT  r   )rð  rö  Úlenr[   )r¼   rT  rU  r°  ró  rõ  r�   s          rz   Úget_relationzBaseAdapter.get_relation  sg   € ð ×,Ñ,¨X°vÓ>ˆà×"Ñ" >°8¸VÀZÓPˆäˆw‹<˜!Òà(Ø Ø$ñˆFô
 7°v¸wÓGÐGáØ˜1‘:Ðàry   ÚAdapterAlreadyExistsrû  c                   ó   — yr™  rx   r=  s     rz   r@  zBaseAdapter.<lambda>+  rš  ry   c                 óp   — | j                   j                  j                  }| j                  |||«      }|duS )z<DEPRECATED: Return if a model already exists in the databaseN)rê   r´  rT  rû  )r¼   rU  rh   rT  rd  s        rz   Úalready_existszBaseAdapter.already_exists*  s8   € ð
 —;‘;×*Ñ*×3Ñ3ˆØ×$Ñ$ X¨v°tÓ<ˆØ˜tÐ#Ð#ry   ÚAdapterCreateSchemac                 ó   — t        d«      ‚)z-Create the given schema if it does not exist.z4`create_schema` is not implemented for this adapter!rÉ   r¡  s     rz   Úcreate_schemazBaseAdapter.create_schema7  s   € ô
 "Ð"XÓYÐYry   ÚAdapterDropSchemac                 ó   — t        d«      ‚)z:Drop the given schema (and everything in it) if it exists.z2`drop_schema` is not implemented for this adapter!rÉ   r¡  s     rz   Údrop_schemazBaseAdapter.drop_schema>  s   € ô
 "Ð"VÓWÐWry   ÚAdapterQuotec                 ó   — t        d«      ‚)z<Quote the given identifier, as appropriate for the database.z,`quote` is not implemented for this adapter!rÉ   )rR  r°  s     rz   ÚquotezBaseAdapter.quoteE  s   € ô "Ð"PÓQÐQry   ÚAdapterQuoteAsConfiguredÚ	quote_keyc                 ó   — 	 t        |«      }| j                  j                  «       j	                  |«      }| j
                  j                  j                  ||«      r| j                  |«      S |S # t        $ r |cY S w xY w)a  Quote or do not quote the given identifer as configured in the
        project config for the quote key.

        The quote key should be one of 'database' (on bigquery, 'profile'),
        'identifier', or 'schema', or it will be treated as if you set `True`.
        )	r@   rÂ   râ   Úget_default_quote_policyÚget_partrê   r[  rö   r  )r¼   r°  r
  rƒ   ri   s        rz   Úquote_as_configuredzBaseAdapter.quote_as_configuredM  sv   € ð	Ü 	Ó*ˆCð —-‘-×8Ñ8Ó:×CÑCÀCÓHˆØ�;‰;×Ñ×"Ñ" 3¨Ô0Ø—:‘:˜jÓ)Ð)àÐøô ò 	ØÒð	ús   ‚A/ Á/A=Á<A=ÚAdapterQuoteSeedColumnrá  Úquote_configc                 ór   — d}t        |t        «      r|}n|€nt        |«      ‚|r| j                  |«      S |S ©NT)rÌ  rœ   rZ   r  )r¼   rá  r  Úquote_columnss       rz   Úquote_seed_columnzBaseAdapter.quote_seed_columnb  sC   € ð #ˆÜ�l¤DÔ)Ø(‰MØÐ!Øä& |Ó4Ð4áØ—:‘:˜fÓ%Ð%àˆMry   Úagate_tableÚcol_idxc                 ó   — t        d«      ‚)a&  Return the type in the database that best maps to the agate.Text
        type for the given agate table and column index.

        :param agate_table: The table
        :param col_idx: The index into the agate table for the column.
        :return: The name of the type in the database
        z8`convert_text_type` is not implemented for this adapter!rÉ   ©rR  r  r  s      rz   Úconvert_text_typezBaseAdapter.convert_text_typew  ó   € ô "Ð"\Ó]Ð]ry   c                 ó   — t        d«      ‚)á(  Return the type in the database that best maps to the agate.Number
        type for the given agate table and column index.

        :param agate_table: The table
        :param col_idx: The index into the agate table for the column.
        :return: The name of the type in the database
        z:`convert_number_type` is not implemented for this adapter!rÉ   r  s      rz   Úconvert_number_typezBaseAdapter.convert_number_typeƒ  s   € ô "Ð"^Ó_Ð_ry   c                  ó   — y)r  Úintegerrx   r  s      rz   Úconvert_integer_typez BaseAdapter.convert_integer_type�  s   € ð ry   c                 ó   — t        d«      ‚)a)  Return the type in the database that best maps to the agate.Boolean
        type for the given agate table and column index.

        :param agate_table: The table
        :param col_idx: The index into the agate table for the column.
        :return: The name of the type in the database
        z;`convert_boolean_type` is not implemented for this adapter!rÉ   r  s      rz   Úconvert_boolean_typez BaseAdapter.convert_boolean_typeš  s   € ô "Ð"_Ó`Ð`ry   c                 ó   — t        d«      ‚)a*  Return the type in the database that best maps to the agate.DateTime
        type for the given agate table and column index.

        :param agate_table: The table
        :param col_idx: The index into the agate table for the column.
        :return: The name of the type in the database
        z<`convert_datetime_type` is not implemented for this adapter!rÉ   r  s      rz   Úconvert_datetime_typez!BaseAdapter.convert_datetime_type¦  s   € ô "Ð"`ÓaÐary   c                 ó   — t        d«      ‚)a&  Return the type in the database that best maps to the agate.Date
        type for the given agate table and column index.

        :param agate_table: The table
        :param col_idx: The index into the agate table for the column.
        :return: The name of the type in the database
        z8`convert_date_type` is not implemented for this adapter!rÉ   r  s      rz   Úconvert_date_typezBaseAdapter.convert_date_type²  r  ry   c                 ó   — t        d«      ‚)a+  Return the type in the database that best maps to the
        agate.TimeDelta type for the given agate table and column index.

        :param agate_table: The table
        :param col_idx: The index into the agate table for the column.
        :return: The name of the type in the database
        z8`convert_time_type` is not implemented for this adapter!rÉ   r  s      rz   Úconvert_time_typezBaseAdapter.convert_time_type¾  r  ry   c                 ó&   — | j                  ||«      S r�   )Úconvert_agate_typer  s      rz   Úconvert_typezBaseAdapter.convert_typeÊ  s   € ð ×%Ñ% k°7Ó;Ð;ry   c                 óª  — dd l }ddlm} |j                  |   }|| j                  f|j
                  | j                  f|j                  | j                  f|j                  | j                  f|j                  | j                  f|j                  | j                  f|j                  | j                   fg}|D ]  \  }}t#        ||«      sŒ |||«      c S  y )Nr   )ÚInteger)Úagater   r-  Úcolumn_typesr   ÚTextr  ÚNumberr  ÚBooleanr"  ÚDateTimer$  ÚDater&  Ú	TimeDeltar(  rÌ  )	rR  r  r  r.  r-  Ú
agate_typeÚconversionsÚ	agate_clsÚfuncs	            rz   r*  zBaseAdapter.convert_agate_typeÓ  sÊ   € ãÝ;à&×3Ñ3°GÑ<ˆ
à�c×.Ñ.Ð/Ø�Z‰Z˜×.Ñ.Ð/Ø�\‰\˜3×2Ñ2Ð3Ø�]‰]˜C×4Ñ4Ð5Ø�^‰^˜S×6Ñ6Ð7Ø�Z‰Z˜×.Ñ.Ð/Ø�_‰_˜c×3Ñ3Ð4ð>
ˆð  +ò 	2‰OˆI�tÜ˜* iÕ0Ù˜K¨Ó1Ò1ð	2ð ry   Ú
macro_nameÚprojectÚcontext_overrider�   Ú
needs_connc                 óŽ  — |€i }|€i }|xs | j                   }|€t        d«      ‚| j                  €t        d«      ‚|j                  || j                  j
                  |«      }|€1|€d}	ndj                  |«      }	t        dj                  ||	«      «      ‚| j                  || j                  ||«      }
|
j                  |«       t        ||
«      }|r5| j                  j                  «       }| j                  j                  |«       | j                  j                  d|› �«      5   |di |¤Ž}ddd«       |S # 1 sw Y   S xY w)	aƒ  Look macro_name up in the manifest and execute its results.

        :param macro_name: The name of the macro to execute.
        :param manifest: The manifest to use for generating the base macro
            execution context. If none is provided, use the internal manifest.
        :param project: The name of the project to search in, or None for the
            first match.
        :param context_override: An optional dict to update() the macro
            execution context.
        :param kwargs: An optional dict of keyword args used to pass to the
            macro.
        : param needs_conn: A boolean that indicates whether the specified macro
            requires an open connection to execute. If needs_conn is True, a
            connection is expected and opened if necessary. Otherwise (and by default),
            no connection is expected prior to executing the macro.
        Nz3Macro resolver was None when calling execute_macro!z<Macro context generator was None when calling execute_macro!zany packagezthe "{}" packagez3dbt could not find a macro with the name "{}" in {}zmacro rx   )rì   r*   rí   Úfind_macro_by_namerê   Úproject_namerˆ   r+   rÀ  r#   r·   r¸   ÚopenÚexception_handler)r¼   r:  rþ   r;  r<  r�   r=  ÚresolverÚmacroÚpackage_nameÚmacro_contextÚmacro_functionÚ
connectionrs  s                 rz   Úexecute_macrozBaseAdapter.execute_macroë  sW  € ð4 ˆ>ØˆFØÐ#Ø!Ðà!Ò9 T×%9Ñ%9ˆØÐÜ"Ð#XÓYÐYà×(Ñ(Ð0Ü"Ð#aÓbÐbà×+Ñ+¨J¸¿¹×8PÑ8PÐRYÓZˆØˆ=ØˆØ,‘à1×8Ñ8¸ÓA�ä!ØE×LÑLØ óóð ð ×5Ñ5°e¸T¿[¹[È(ÐT[Ó\ˆØ×ÑÐ-Ô.ä/°°}ÓEˆáØ×)Ñ)×?Ñ?ÓAˆJØ×Ñ×!Ñ! *Ô-à×Ñ×/Ñ/°&¸¸Ð0EÓFñ 	.Ù#Ñ- fÑ-ˆF÷	.àˆ÷	.àˆús   Ä'	D:Ä:ErŠ   c                 ó„   — ddl m}  ||j                  |j                  g d¢¬«      }|j	                  t        |«      «      S )z”Filter the table as appropriate for catalog entries. Subclasses can
        override this to change filtering rules on a per-adapter basis.
        r   )Útable_from_rows)	r•   r–   Ú
table_nameÚ
table_typeÚtable_commentÚtable_ownerrH  Úcolumn_typeÚcolumn_comment)Útext_only_columns)r   rK  ÚrowsrÔ  Úwhererž   )rR  rL  rŠ   rK  s       rz   Ú_catalog_filter_tablez!BaseAdapter._catalog_filter_table+  s@   € õ 	Dñ  Ø�J‰JØ×Ñò
ô
ˆð �{‰{Ô2°<Ó@ÓAÐAry   Úinformation_schemar™   c                 ób   — ||dœ}| j                  t        |¬«      }| j                  ||«      }|S )N)rV  r™   ©r�   )rI  ÚGET_CATALOG_MACRO_NAMErU  )r¼   rV  r™   rŠ   r�   rL  Úresultss          rz   Ú_get_one_catalogzBaseAdapter._get_one_catalogF  s;   € ð );ÀwÑOˆØ×"Ñ"Ô#9À&Ð"ÓIˆà×,Ñ,¨U°LÓAˆØˆry   rc  c                 ób   — ||dœ}| j                  t        |¬«      }| j                  ||«      }|S )N©rV  rc  rX  )rI  Ú GET_CATALOG_RELATIONS_MACRO_NAMErU  )r¼   rV  rc  rŠ   r�   rL  rZ  s          rz   Ú_get_one_catalog_by_relationsz)BaseAdapter._get_one_catalog_by_relationsR  s@   € ð #5Ø"ñ
ˆð ×"Ñ"Ô#CÈFÐ"ÓSˆà×,Ñ,¨U°LÓAˆØˆry   c                 ó  ‡— |�7t        |«      | j                  kD  s| j                  t        j                  «      s| j                  ||«      \  }}n| j                  ||«      \  }}|rž|rœ|D �ch c]y  }|j                  r|j                  j                  «       nd |j                  r|j                  j                  «       nd |j                  r|j                  j                  «       nd f’Œ{ c}Šdˆfd„}|j                  |«      }||fS c c}w )Nc                 óÒ   •— t        d| «      }t        d| «      }t        d| «      }|�|j                  «       nd }|�|j                  «       nd }|�|j                  «       nd }|||f‰v S )Nr•   r–   rL  )r‰   Úcasefold)r„   r‘   r’   ÚiÚrelation_maps       €rz   Úin_mapz0BaseAdapter.get_filtered_catalog.<locals>.in_map~  sl   ø€ Ü%Ð&6¸Ó<�Ü% n°cÓ:�Ü% l°CÓ8�Ø$% M�A—J‘J”L°t�Ø$% M�A—J‘J”L°t�Ø$% M�A—J‘J”L°t�Ø˜1˜a�y LÐ0Ð0ry   )r„   r…   )rú  ÚMAX_SCHEMA_METADATA_RELATIONSÚsupportsrF   ÚSchemaMetadataByRelationsrb   Úget_catalog_by_relationsrT  rb  rU  r°  rT  )	r¼   rX  rŠ   rc  ÚcatalogsÚ
exceptionsÚrre  rd  s	           @rz   Úget_filtered_catalogz BaseAdapter.get_filtered_cataloga  sò   ø€ ð ÐÜ�9‹~ × BÑ BÒBØ—=‘=¤×!EÑ!EÔFð $(×#3Ñ#3Ð4DÀlÓ#SÑ ˆH‘jð $(×#@Ñ#@ÀÈyÓ#YÑ ˆH�já™ð #öð ð	 ./¯ZªZ�A—J‘J×'Ñ'Ô)¸TØ+,¯8ª8�A—H‘H×%Ñ%Ô'¸Ø/0¯|ª|�A—L‘L×)Ñ)Ô+ÀòòˆLõ1ð  —~‘~ fÓ-ˆHà˜Ð#Ð#ùò)s   Á.A>D
r„   r…   c                  ó   — y r�   rx   )r¼   r„   rc  s      rz   Úrow_matches_relationz BaseAdapter.row_matches_relation‹  s   € Øry   c           
      óž  — t        | j                  «      5 }g }| j                  |«      }|j                  «       D ]k  \  }}t	        |«      dk(  rŒdj                  t        |j                  «      dg«      }|j                  | || j                  |||«      }	|j                  |	«       Œm 	 d d d «       t        «      \  }
}|
|fS # 1 sw Y   ŒxY w)Nr   ú.rV  )r6   rê   re  rÍ  rú  Újoinr­   rT  rq  r[  ri  Úcatch_as_completed)r¼   rX  rŠ   ru  rv  Ú
schema_mapÚinfor™   rh   rx  rj  rk  s               rz   rb   zBaseAdapter.get_catalogŽ  sÒ   € ô
 �d—k‘kÓ"ð 
	$ cØ35ˆGØ*.×*CÑ*CÐDTÓ*UˆJØ!+×!1Ñ!1Ó!3ò $‘��gÜ�w“< 1Ò$ØØ—x‘x¤ T§]¡]Ó!3Ð5IÐ JÓK�Ø×*Ñ*Ø˜$ × 5Ñ 5°t¸WÀló�ð —‘˜sÕ#ñ$÷
	$ô  2°'Ó:Ñˆ�*Ø˜Ð#Ð#÷
	$ð 
	$ús   –BCÃCc           
      óz  — t        | j                  «      5 }g }| j                  |«      }|D ]g  }dj                  t	        |j
                  «      dg«      }t        ||   «      }|j                  | || j                  |||«      }|j                  |«       Œi t        |«      \  }	}
|	|
fcd d d «       S # 1 sw Y   y xY w)Nrq  rV  )r6   rê   rl  rr  r­   rT  r*  rq  r_  ri  rs  )r¼   rŠ   rc  ru  rv  Úrelations_by_schemark  rh   rx  rj  rk  s              rz   ri  z$BaseAdapter.get_catalog_by_relations¢  sÊ   € ô �d—k‘kÓ"ð 	( cØ35ˆGØ"&×"LÑ"LÈYÓ"WÐØ2ò $�Ø—x‘x¤ [×%9Ñ%9Ó!:Ð<PÐ QÓR�ÜÐ 3°KÑ @ÓA�	Ø×*Ñ*ØØØ×6Ñ6ØØØ ó�ð —‘˜sÕ#ð$ô $6°gÓ#>Ñ ˆH�jØ˜ZÐ'÷#	(÷ 	(ò 	(ús   –BB1Â1B:c                 ó6   — | j                   j                  «       S )zCancel all open connections.)r·   Úcancel_openr  s    rz   Úcancel_open_connectionsz#BaseAdapter.cancel_open_connections¸  s   € à×Ñ×+Ñ+Ó-Ð-ry   c                 óX  — ddl }| j                  |||¬«      }t        ||j                  «      rt	        t        «       «       |}d}n|j                  |j                  }}t        |«      dk7  st        |d   «      dk7  rt        ||«      ‚| j                  |d   d   |d   d   «      }||fS )zEExecute and process a freshness macro to generate a FreshnessResponser   N)r�   rþ   rù  r²   )r.  rI  rÌ  ÚTabler)   rT   r¿   rL  rú  r.   Ú_create_freshness_response)	r¼   r:  r�   rþ   r.  rs  rL  Úadapter_responseÚfreshness_responses	            rz   Ú_process_freshness_executionz(BaseAdapter._process_freshness_execution¼  s¯   € ó 	à×#Ñ# J°vÈnÐ#Ó]ˆä�f˜eŸk™kÔ*ÜÔ9Ó;Ô<ØˆEØ#Ñà&,§o¡o°v·|±|˜eÐô ˆu‹:˜Š?œc %¨¡(›m¨qÒ0Ü" :¨uÓ5Ð5à!×<Ñ<¸UÀ1¹XÀa¹[È%ÐPQÉ(ÐSTÉ+ÓVÐØÐ!3Ð3Ð3ry   r    Úloaded_at_fieldÚfilterc                 ó<   — |||dœ}| j                  t        ||«      S )z8Calculate the freshness of sources in dbt, and return it)r    r�  r‚  )r€  ÚFRESHNESS_MACRO_NAME)r¼   r    r�  r‚  rþ   r�   s         rz   Úcalculate_freshnesszBaseAdapter.calculate_freshnessÕ  s,   € ð Ø.Øñ
ˆð
 ×0Ñ0Ô1EÀvÈ~Ó^Ð^ry   c                 ó:   — ||dœ}| j                  t        ||«      S )N)r    Úloaded_at_query)r€  ÚCUSTOM_SQL_FRESHNESS_MACRO_NAME)r¼   r    r2  rþ   r�   s        rz   Ú#calculate_freshness_from_custom_sqlz/BaseAdapter.calculate_freshness_from_custom_sqlä  s-   € ð Ø"ñ
ˆð ×0Ñ0Ü+¨V°^ó
ð 	
ry   Úsourcesc                 ó  — |D �ci c]U  }|j                   j                  t        j                  «      |j                   j                  t        j                  «      f|“ŒW }}| j                  |«      }i }g }|j                  «       D ]p  \  }}	| j                  t        ||	dœ|d¬«      }
|
j                  |
j                  }}|j                  |«       |D ]!  }| j                  ||«      \  }}||   }|||<   Œ# Œr ||fS c c}w )aÄ  
        Given a list of sources (BaseRelations), calculate the metadata-based freshness in batch.
        This method should _not_ execute a warehouse query per source, but rather batch up
        the sources into as few requests as possible to minimize the number of roundtrips required
        to compute metadata-based freshness for each input source.

        :param sources: The list of sources to calculate metadata-based freshness for
        :param macro_resolver: An optional macro_resolver to use for get_relation_last_modified
        :return: a tuple where:
            * the first element is a list of optional AdapterResponses indicating the response
              for each request the method made to compute the freshness for the provided sources.
            * the second element is a dictionary mapping an input source BaseRelation to a FreshnessResponse,
              if it was possible to calculate a FreshnessResponse for the source.
        r]  T)r�   rþ   r=  )ÚpathÚget_lowered_partr@   ÚSchemaÚ
Identifierrl  rÍ  rI  Ú%GET_RELATION_LAST_MODIFIED_MACRO_NAMEr¿   rL  ri  Ú_parse_freshness_row)r¼   rŠ  rþ   r    Úschema_identifier_to_sourceÚsources_by_info_schemaÚfreshness_responsesÚadapter_responsesrV  Úsources_for_information_schemars  r~  rL  r„   Úraw_relationr  Úsource_relation_for_results                    rz   Ú'calculate_freshness_from_metadata_batchz3BaseAdapter.calculate_freshness_from_metadata_batchò  sM  € ð2 "ö'
ð
 ð —‘×,Ñ,¬]×-AÑ-AÓBØ—‘×,Ñ,¬]×-EÑ-EÓFðð ñð'
Ð#ð '
ð ×6Ñ6°wÓ?ð 	ð FHÐØ=?Ðð $×)Ñ)Ó+ò	Uñ 
ØØ*à×'Ñ'Ü5à*<Ø!?ñð  .Øð (ó ˆFð '-§o¡o°v·|±|˜eÐØ×$Ñ$Ð%5Ô6àò U�Ø37×3LÑ3LÈSÐRWÓ3XÑ0�Ð0Ø-HÈÑ-VÐ*ØBTÐ#Ð$>Ò?ñUð!	Uð* !Ð"5Ð5Ð5ùòI'
s   …AC=c                 óP   — | j                  |g|¬«      \  }}|r|d   nd }|||   fS )N)rŠ  rþ   r   )r™  )r¼   r    rþ   r•  r”  r~  s         rz   Ú!calculate_freshness_from_metadataz-BaseAdapter.calculate_freshness_from_metadata,  sM   € ð
 26×1]Ñ1]Ø�HØ)ð 2^ó 2
Ñ.ÐÐ.ñ 4EÐ,¨QÒ/È$ÐØÐ!4°VÑ!<Ð<Ð<ry   Úlast_modifiedrÖ   c           	      ó²   — |€!t        ddddddt        j                  ¬«      }nt        |d d«      }t        |d d«      }||z
  j	                  «       }|||dœ}|S )Nrù  r   r¤   rœ  rÖ   )rÕ   rÖ   r×   )r   r§   r¨   rª   Útotal_seconds)r¼   rœ  rÖ   rÕ   r×   Ú	freshnesss         rz   r}  z&BaseAdapter._create_freshness_response8  sl   € ð Ð ä$ Q¨¨1¨a°°A¼d¿h¹hÔG‰Mä  °°oÓFˆMä˜n¨dÐ4DÓEˆØ Ñ-×<Ñ<Ó>ˆà*Ø,Øñ(
ˆ	ð Ðry   c                 ó6  — ddl m} 	  |d|«      } |d|«      } |d|«      } |d|«      }| j                  ||«      }|j                  «       j                  «       |j                  «       j                  «       f}	|	|fS # t        $ r t        t        |«      ‚w xY w)Nr   )Úget_column_value_uncasedrœ  rÖ   r°  rU  )r   r¡  Ú	Exceptionr.   r�  r}  r�   Ústrip)
r¼   r„   rL  r¡  Úlast_modified_valÚsnapshotted_at_valr°  rU  r  r—  s
             rz   r‘  z BaseAdapter._parse_freshness_rowK  s°   € õ 	Mð	QÙ 8¸È#Ó NÐÙ!9Ð:JÈCÓ!PÐÙ1°,ÀÓDˆJÙ-¨h¸Ó<ˆFð "×<Ñ<Ð=NÐPbÓcÐØ—|‘|“~×+Ñ+Ó-¨z×/?Ñ/?Ó/A×/GÑ/GÓ/IÐIˆØÐ/Ð/Ð/øô ò 	QÜ"Ô#HÈ%ÓPÐPð	Qús   ˆ$A> Á>Bc                  ó   — y)a¥  A hook for running some operation before the model materialization
        runs. The hook can assume it has a connection available.

        The only parameter is a configuration dictionary (the same one
        available in the materialization context). It should be considered
        read-only.

        The pre-model hook may return anything as a context, which will be
        passed to the post-model hook.
        Nrx   )r¼   rê   s     rz   Úpre_model_hookzBaseAdapter.pre_model_hook\  s   € ð 	ry   Úcontextc                  ó   — y)ay  A hook for running some operation after the model materialization
        runs. The hook can assume it has a connection available.

        The first parameter is a configuration dictionary (the same one
        available in the materialization context). It should be considered
        read-only.

        The second parameter is the value returned by pre_mdoel_hook.
        Nrx   )r¼   rê   r¨  s      rz   Úpost_model_hookzBaseAdapter.post_model_hooki  s   € ð 	ry   r�  Ú
dst_columnÚclauseÚwhere_clausec                 ó0   — d|› d|› d|› �}|�|d|› �z  }|S )Nzupdate z set z = z where rx   )r¼   r�  r«  r¬  r­  s        rz   Úupdate_column_sqlzBaseAdapter.update_column_sqlv  s8   € ð ˜8˜* E¨*¨°S¸¸ÐAˆØÐ#Ø˜ ˜~Ð.Ñ.ˆFØˆry   Úadd_toÚnumberÚintervalc                 ó   — |› d|› d|› d�S )Nz + interval 'ú ú'rx   )r¼   r°  r±  r²  s       rz   Útimestamp_add_sqlzBaseAdapter.timestamp_add_sql‚  s   € ð
 �˜ v h¨a°¨z¸Ð;Ð;ry   Úvaluec                 óT   — |dk(  r|› d|› d�S |dk(  rd|› d|› �S t        d|› d�«      ‚)Nri  z || 'rµ  Úprependz' || z%Got an unexpected location value of "ú")r+   )r¼   r°  r·  Úlocations       rz   Ústring_add_sqlzBaseAdapter.string_add_sql‰  sP   € ð �xÒØ�X˜U 5 '¨Ð+Ð+Ø˜Ò"Ø�u�g˜U 6 (Ð+Ð+ä!Ð$IÈ(ÈÐSTÐ"UÓVÐVry   Ú
relation_aÚ
relation_bÚexcept_operatorc                 óø   ‡ — |€&‰ j                  |«      }t        ˆ fd„|D «       «      }nt        ˆ fd„|D «       «      }dj                  |«      }t        j	                  |t        |«      t        |«      |¬«      }|S )zÂGenerate SQL for a query that returns a single row with a two
        columns: the number of rows that are different between the two
        relations and the number of mismatched rows.
        c              3   óT   •K  — | ]  }‰j                  |j                  «      –— Œ! y ­wr�   )r  rh   )r�   rÚ  r¼   s     €rz   r“   z5BaseAdapter.get_rows_different_sql.<locals>.<genexpr>¥  s   øè ø€ Ò@°1˜DŸJ™J q§v¡v×.Ñ@ùs   ƒ%(c              3   ó@   •K  — | ]  }‰j                  |«      –— Œ y ­wr�   )r  )r�   Únr¼   s     €rz   r“   z5BaseAdapter.get_rows_different_sql.<locals>.<genexpr>§  s   øè ø€ Ò@¨a˜DŸJ™J qŸMÑ@ùs   ƒú, )rJ  r½  r¾  Ú	except_op)r«  Úsortedrr  ÚCOLUMNS_EQUAL_SQLrˆ   r­   )	r¼   r½  r¾  rÔ  r¿  rJ  rß  Úcolumns_csvr2  s	   `        rz   Úget_rows_different_sqlz"BaseAdapter.get_rows_different_sql–  sy   ø€ ð ÐØ×2Ñ2°:Ó>ˆGÜÓ@¸Ô@ÓA‰EäÓ@°<Ô@ÓAˆEØ—i‘i Ó&ˆä×&Ñ&ØÜ˜:“Ü˜:“Ø%ð	 'ó 
ˆð ˆ
ry   c                 ó   — t        d«      ‚)Nz*python_submission_helpers is not specifiedrÉ   r  s    rz   Úpython_submission_helpersz%BaseAdapter.python_submission_helpers³  s   € ä!Ð"NÓOÐOry   c                 ó   — t        d«      ‚)Nz1default_python_submission_method is not specifiedrÉ   r  s    rz   Ú default_python_submission_methodz,BaseAdapter.default_python_submission_method·  s   € ä!Ð"UÓVÐVry   rÆ   rË   c                 ó<  — |d   j                  d| j                  «      }|| j                  vrt        dj	                  |«      «      ‚ | j                  |   || j
                  j                  j                  «      }|j                  |«      }| j                  |«      S )Nrê   Úsubmission_methodz9Submission method {} is not supported for current adapter)
rö   rÍ  rË  r/   rˆ   r·   Úprofiler´  rÍ   Ú#generate_python_submission_response)r¼   rÆ   rË   rÏ  Ú
job_helperÚsubmission_results         rz   r°   zBaseAdapter.submit_python_job»  sª   € ð
 )¨Ñ2×6Ñ6Ø ×!FÑ!Fó
Ðð  D×$BÑ$BÑBÜ%ØK×RÑRØ%óóð ð
 G�T×3Ñ3Ð4EÑFØ˜$×*Ñ*×2Ñ2×>Ñ>ó
ˆ
ð '×-Ñ-¨mÓ<Ðà×7Ñ7Ð8IÓJÐJry   rÓ  c                 ó   — t        d«      ‚)NzBYour adapter need to implement generate_python_submission_responserÉ   )r¼   rÓ  s     rz   rÑ  z/BaseAdapter.generate_python_submission_responseÐ  s   € Ü!ØPó
ð 	
ry   c                 ó   — dgS )z The set of standard builtin strategies which this adapter supports out-of-the-box.
        Not used to validate custom strategies defined by end users.
        ri  rx   r  s    rz   Úvalid_incremental_strategiesz(BaseAdapter.valid_incremental_strategiesÕ  s   € ð ˆzÐry   c                 óp   — g d¢}| j                   j                  j                  s|j                  d«       |S )zå
        List of possible builtin strategies for adapters

        Microbatch is added by _default_. It is only not added when the behavior flag
        `require_batched_execution_for_custom_microbatch_strategy` is True.
        )ri  zdelete+insertÚmergeÚinsert_overwriteÚ
microbatch)rï   rg   Úno_warnri  )r¼   Úbuiltin_strategiess     rz   Úbuiltin_incremental_strategiesz*BaseAdapter.builtin_incremental_strategiesÛ  s2   € ò VÐØ�}‰}×UÑU×]Ò]Ø×%Ñ% lÔ3à!Ð!ry   c                 ó:  — |€d}| j                  «       }|j                  d«       | j                  «       }||v r||vrt        d|› d�«      ‚|j	                  dd«      }d|› d�}||vr/t        dj                  || j                  j                  «      «      ‚||   S )	aî  Gets the macro for the given incremental strategy.

        Additionally some validations are done:
        1. Assert that if the given strategy is a "builtin" strategy, then it must
           also be defined as a "valid" strategy for the associated adapter
        2. Assert that the incremental strategy exists in the model context

        Notably, something be defined by the adapter as "valid" without it being
        a "builtin", and nothing will break (and that is desirable).
        ri   zThe incremental strategy 'z' is not valid for this adapterú+rF  Úget_incremental_Ú_sqlzIdbt could not find an incremental strategy macro with the name "{}" in {})rÖ  ri  rÝ  r+   r©   rˆ   rê   r@  )r¼   Úmodel_contexträ  Úvalid_strategiesrÜ  r:  s         rz   Úget_incremental_strategy_macroz*BaseAdapter.get_incremental_strategy_macroè  sÉ   € ð ÐØ ˆHð  ×<Ñ<Ó>ÐØ×Ñ 	Ô*Ø!×@Ñ@ÓBÐØÐ)Ñ)¨hÐ>NÑ.NÜ!Ø,¨X¨JÐ6UÐVóð ð ×#Ñ# C¨Ó-ˆØ'¨ z°Ð6ˆ
à˜]Ñ*Ü!Ø[×bÑbØ §¡× 8Ñ 8óóð ð ˜ZÑ(Ð(ry   Úraw_constraintc                 óŽ   — 	 t        j                  |«       t        j                  |«      S # t        $ r t	        d|› �«      ‚w xY w©NzCould not parse constraint: )r$   ÚvalidateÚ	from_dictr¢  r,   )rR  rå  s     rz   Ú_parse_column_constraintz$BaseAdapter._parse_column_constraint  sL   € ð	VÜ!×*Ñ*¨>Ô:Ü(×2Ñ2°>ÓBÐBøÜò 	VÜ$Ð'CÀNÐCSÐ%TÓUÐUð	Vús	   ‚), ¬AÚ
constraintc                 ó‚  — |j                   xs d}d}|j                  t        j                  k(  r	|rd|› d�}nô|j                  t        j                  k(  rd|› �}nÑ|j                  t        j
                  k(  rd|› �}n®|j                  t        j                  k(  rd|› �}n‹|j                  t        j                  k(  rM|j                  r9|j                  r-d|j                  › d	d
j                  |j                  «      › d�}n)|r'd|› �}n!|j                  t        j                  k(  r|r|}|r|j                  «       }|S )úxRender the given constraint as DDL text. Should be overriden by adapters which need custom constraint
        rendering.rl   Núcheck (ú)z	not null zunique zprimary key zreferences ú (rÄ  )Ú
expressionrS  r%   ÚcheckÚnot_nullÚuniqueÚprimary_keyÚforeign_keyÚtorÐ  rr  Úcustomr£  )rR  rë  Úconstraint_expressionÚrendered_column_constraints       rz   Úrender_column_constraintz$BaseAdapter.render_column_constraint  s8  € ð !+× 5Ñ 5Ò ;¸Ðà%)Ð"Ø�?‰?œn×2Ñ2Ò2Ñ7LØ+2Ð3HÐ2IÈÐ)KÑ&Ø�_‰_¤× 7Ñ 7Ò7Ø+4Ð5JÐ4KÐ)LÑ&Ø�_‰_¤× 5Ñ 5Ò5Ø+2Ð3HÐ2IÐ)JÑ&Ø�_‰_¤× :Ñ :Ò:Ø+7Ð8MÐ7NÐ)OÑ&Ø�_‰_¤× :Ñ :Ò:Ø�}Š} ×!6Ò!6à! *§-¡- °°4·9±9¸Z×=RÑ=RÓ3SÐ2TÐTUÐVñ +ñ 'Ø/:Ð;PÐ:QÐ-RÑ*Ø�_‰_¤× 5Ñ 5Ò5Ñ:OØ)>Ð&á%Ø)C×)IÑ)IÓ)KÐ&à)Ð)ry   Ú!AdapterRenderRawColumnConstraintsÚraw_columnsc                 óŽ  — g }|j                  «       D ]¯  }|j                  d«      r| j                  |d   «      n|d   }|› d|d   › �g}|j                  dd «      D ]C  }| j                  |«      }| j	                  || j
                  «      }|€Œ3|j                  |«       ŒE |j                  dj                  |«      «       Œ± |S )Nr  rh   r´  Ú	data_typeÚconstraints)Úvaluesrö   r  rê  Úprocess_parsed_constraintrû  ri  rr  )	rR  rý  Úrendered_column_constraintsÚvrÒ  rú  Úconrë  rÚ  s	            rz   Úrender_raw_columns_constraintsz*BaseAdapter.render_raw_columns_constraints5  sÖ   € ð
 ')Ð#à×#Ñ#Ó%ò 	UˆAØ/0¯u©u°W¬~�s—y‘y  6¡Ô+À1ÀVÁ9ˆHØ-5¨J°a¸¸+¹Ð7GÐ*HÐ)IÐ&Ø—u‘u˜]¨DÓ1ò 9�Ø ×9Ñ9¸#Ó>�
Ø×1Ñ1°*¸c×>ZÑ>ZÓ[�Ø‘=Ø.×5Ñ5°aÕ8ð	9ð
 (×.Ñ.¨s¯x©xÐ8RÓ/SÕTð	Uð +Ð*ry   Úparsed_constraintc                 ój  — |j                   t        j                  k(  r ||«      S |j                  rb| j                  |j                      t
        j                  k(  r8t        t        |j                   j                  | j                  «       ¬«      «       |j                  rb| j                  |j                      t
        j                  k(  r8t        t        |j                   j                  | j                  «       ¬«      «       | j                  |j                      t
        j                  k7  r ||«      S y )N)rë  Úadapter)rS  r%   rø  Úwarn_unsupportedÚCONSTRAINT_SUPPORTrn   rw   r)   rV   r·  Úwarn_unenforcedrv   rU   )rR  r  Úrender_funcs      rz   r  z%BaseAdapter.process_parsed_constraintH  sþ   € ð ×!Ñ!¤^×%:Ñ%:Ò:ÙÐ0Ó1Ð1à×.Ò.Ø×&Ñ&Ð'8×'=Ñ'=Ñ>ÔBS×BaÑBaÒaäÜ&Ð2C×2HÑ2H×2NÑ2NÐX[×X`ÑX`ÓXbÔcôð ×-Ò-Ø×&Ñ&Ð'8×'=Ñ'=Ñ>ÔBS×B`ÑB`Ò`äÜ%Ð1B×1GÑ1G×1MÑ1MÐWZ×W_ÑW_ÓWaÔbôð ×!Ñ!Ð"3×"8Ñ"8Ñ9Ô=N×=\Ñ=\Ò\ÙÐ0Ó1Ð1àry   c                 ó’   — 	 t        j                  |«       t        j                  |«      }|S # t        $ r t	        d|› �«      ‚w xY wrç  )r&   rè  ré  r¢  r,   )rR  rå  rÚ  s      rz   Ú_parse_model_constraintz#BaseAdapter._parse_model_constraintd  sP   € ð	VÜ ×)Ñ)¨.Ô9Ü$×.Ñ.¨~Ó>ˆAØˆHøÜò 	VÜ$Ð'CÀNÐCSÐ%TÓUÐUð	Vús	   ‚+. ®AÚ AdapterRenderRawModelConstraintsÚraw_constraintsc                 óZ   — t        | j                  |«      D �cg c]  }|€Œ|‘Œ	 c}S c c}w r�   )ÚmapÚrender_raw_model_constraint)rR  r  rÚ  s      rz   Úrender_raw_model_constraintsz(BaseAdapter.render_raw_model_constraintsm  s+   € ô
 ˜s×>Ñ>ÀÓPÖb�aÐTUÑTa’ÒbÐbùÒbs   ™(¡(c                 ó\   — | j                  |«      }| j                  || j                  «      S r�   )r  r  Úrender_model_constraint)rR  rå  rë  s      rz   r  z'BaseAdapter.render_raw_model_constraintt  s+   € à×0Ñ0°Ó@ˆ
Ø×,Ñ,¨Z¸×9TÑ9TÓUÐUry   c           	      ó˜  — |j                   rd|j                   › d�nd}dj                  |j                  «      }d}|j                  t        j
                  k(  r |j                  r|› d|j                  › d�}|S |j                  t        j                  k(  r*|j                  rd|j                  › �nd}|› d|› d	|› d�}|S |j                  t        j                  k(  r*|j                  rd|j                  › �nd}|› d
|› d	|› d�}|S |j                  t        j                  k(  rm|j                  r?|j                  r3|› d|› d|j                  › d	dj                  |j                  «      › d�}|S |j                  r|› d|› d|j                  › �}|S |j                  t        j                  k(  r|j                  r|› |j                  › �}|S )rí  zconstraint r´  rl   rÄ  Nrî  rï  rô  rð  zprimary keyzforeign key (z) references )rh   rr  rJ  rS  r%   rò  rñ  rô  rõ  rö  r÷  rÐ  rø  )rR  rë  Úconstraint_prefixÚcolumn_listÚrendered_model_constraintrù  s         rz   r  z#BaseAdapter.render_model_constrainty  s,  € ð AKÇÂ˜k¨*¯/©/Ð):¸!Ñ<ÐUWÐØ—i‘i 
× 2Ñ 2Ó3ˆØ$(Ð!à�?‰?œn×2Ñ2Ò2°z×7LÒ7LØ+<Ð*=¸WÀZ×EZÑEZÐD[Ð[\Ð(]Ð%ð& )Ð(ð% �_‰_¤× 5Ñ 5Ò5ØCM×CXÒCX a¨
×(=Ñ(=Ð'>Ñ$?Ð^`Ð!à$Ð% VÐ,AÐ+BÀ"À[ÀMÐQRÐSð &ð  )Ð(ð �_‰_¤× :Ñ :Ò:ØCM×CXÒCX a¨
×(=Ñ(=Ð'>Ñ$?Ð^`Ð!à$Ð% [Ð1FÐ0GÀrÈ+ÈÐVWÐXð &ð )Ð(ð �_‰_¤× :Ñ :Ò:Ø�}Š} ×!6Ò!6Ø/@Ð.AÀÈ{ÈmÐ[hÐis×ivÑivÐhwÐwyÐz~÷  {Dñ  {Dð  EO÷  EZñ  EZó  {[ð  z\ð  \]ð  -^Ð)ð )Ð(ð ×&Ò&Ø/@Ð.AÀÈ{ÈmÐ[hÐis×i~Ñi~Ðhð  -AÐ)ð )Ð(ð �_‰_¤× 5Ñ 5Ò5¸*×:OÒ:OØ+<Ð*=¸j×>SÑ>SÐ=TÐ(UÐ%à(Ð(ry   c                 ó   — | j                   S r�   )Ú_capabilitiesrQ  s    rz   ÚcapabilitieszBaseAdapter.capabilities—  s   € à× Ñ Ð ry   Ú
capabilityc                 ó:   — t        | j                  «       |   «      S r�   )rœ   r  )rR  r  s     rz   rg  zBaseAdapter.supports›  s   € ä�C×$Ñ$Ó& zÑ2Ó3Ð3ry   c                 ó   — | j                   j                  d«      ^}}|j                  «       }|dk(  rd}nt        d|› d�«      j                  }t        |t        d«      j                  || j                  |«      ¬«      S )NÚAdapterÚbaserl   zdbt.adapters.z.__version__zdbt.adapters.__about__)Úadapter_nameÚbase_adapter_versionÚadapter_versionÚmodel_adapter_details)rr   Úsplitr�   r	   ÚversionrC   Ú_get_adapter_specific_run_info)rR  rê   Úadapter_class_namerF  r$  r&  s         rz   Úget_adapter_run_infoz BaseAdapter.get_adapter_run_infoŸ  s€   € à!$§¡×!3Ñ!3°IÓ!>ÐÐ˜QØ)×/Ñ/Ó1ˆà˜6Ò!Ø ‰Oä+¨m¸L¸>ÈÐ,VÓW×_Ñ_ˆOä*Ø%Ü!.Ð/GÓ!H×!PÑ!PØ+Ø"%×"DÑ"DÀVÓ"Lô	
ð 	
ry   c                 ó   — i S )zƒ
        Adapter maintainers should overwrite this method to return any run metadata that should be captured during a run.
        rx   )rR  rê   s     rz   r*  z*BaseAdapter._get_adapter_specific_run_info°  s	   € ð
 ˆ	ry   c                 óª   — |j                  dd«      }|j                  dd«      }|�|�t        d«      ‚|s|dk(  ry|dk(  ry|�|dk(  ryt        d«      ‚)	zÜCheck the hard_deletes config enum, and the legacy invalidate_hard_deletes
        config flag in order to determine which behavior should be used for deleted
        records in a snapshot. The default is to ignore them.Úinvalidate_hard_deletesNrß   zhYou cannot set both the invalidate_hard_deletes and hard_deletes config properties on the same snapshot.Ú
invalidateræ  Úignorez*Invalid setting for property hard_deletes.)rö   r,   )rR  rê   r/  rß   s       rz   Úget_hard_deletes_behaviorz%BaseAdapter.get_hard_deletes_behavior·  sw   € ð #)§*¡*Ð-FÈÓ"MÐØ—z‘z .°$Ó7ˆà"Ð.°<Ð3KÜ$Øzóð ñ # l°lÒ&BØØ˜\Ò)ØØÐ! \°XÒ%=Øä Ð!MÓNÐNry   )r{   Nr�   r  )FFN)FN)NNNNF)rù  Úhour)ri  )NÚEXCEPT)Érr   rs   rt   rÑ   r?   râ   r   rÒ   Ú
BaseColumnr8   r:   rä   r   rH   r_   rå   r%   rò  rn   rw   ró  ru   rô  rv   rõ  rö  r  rf  rG   r  r
   rÊ   rJ   rô   r=   r­   rø   rO   r   rK   rý   rN   r  r  r  r`   r	  r>   r!   rï   Úsetterr   r"   Úpropertyr  r;   r  r  r  r  r  r"  r&  r   r   r   r-  Úparser‚   r2   r   rœ   Úintr   r9   r!  r8  r1   rK  r   rN  ÚclassmethodrS  rW  r   r_  rB   re  r   rA   rl  ra  r{  r€  r„  rˆ  r�  ÚabcÚabstractmethodr’  r”  r–  rž  Ú
parse_noner¢  r¥  r©  r   Ú
parse_listr«  r'   r­  Ú
deprecatedrµ  r¹  r   rr  r   rg  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*  r4   rI  r   rU  r[  r_  rm  ro  r¢  rb   ri  rz  rÔ   r€  r…  r‰  r™  r›  r   r}  r‘  r   r§  rª  r¯  r¶  r¼  rÉ  rÅ   rË  rÍ  rÃ   r    r°   rÑ  rÖ  rÝ  rä  r$   rê  rû  r  r   r&   r  r  r  r  r  r  rF   rg  rC   r,  r*  r2  rx   ry   rz   rá   rá     s”  … ñ+ðZ $0€Hˆd�<Ñ Ó/Ø)€FˆD�ÑÓ)ØÐ1Ñ2Ó2Ø?AÐ˜( 4Ð(:Ñ#;Ñ<ÓAð 3@Ð˜D Ñ/Ó?ð 	×ÑÐ/×=Ñ=Ø×ÑÐ!2×!;Ñ!;Ø×ÑÐ0×=Ñ=Ø×"Ñ"Ð$5×$BÑ$BØ×"Ñ"Ð$5×$>Ñ$>ðÐð %(Ð!ñ # 2Ó&€MðS¨<ð S¸Dó Sð=Ø#;ð=à	ó=ð
 ð.¨Cð .Ð4Fò .ó ð.ð ð¨^ð ÀÈÑ@Yò ó ðð .Ð1Fð .È4ó .ð$ HÐ-BÑ$Có $ó(ð@à!>ð@ð 
ó@ð ð˜(ò ó ðð ‡_�_ð9˜d <Ñ0ð 9°Tò 9ó ð9ð ð  lÑ!3ò ó ðñ:¨zó :ó#ó'ó-ó4ó'ð có ð àUYñ6Øð6Ø/2ð6à	�$‰ò6ó ð6ð €Y‡_�_Ð0Ó1ÙØ T¸dÐR]ôð !ØØ#ñbàðbð ðbð ð	bð
 ˜‰}ðbð 
ˆ Ð-Ñ	.òbóó 2ðbð(	Y ð 	Y¨ó 	Yñ Ð;À;ÔOØ€Y‡_�_Ñ'Ó(ð
°ð 
¸¸ZÑ8Hò 
ó )ó Pð
ñ Ø*ØØØ!ô	ð €Y‡_�_Ð0Ó1ð¨Sð °U¸=Ñ5Iò ó 2óðð( ð*�Sò *ó ð*ð¨(°3©-ð Àð Èó ð	
°8¸NÑ3Kð 	
ÐPSÐT`ÑPaó 	
ð$°X¸nÑ5Mð $ÐRaó $ð&
(à	Ð  lÑ!3Ð3Ñ	4ó
(ðØ (¨Ñ 8ðà	ˆlÑ	óð 6:ñ"0à" >Ñ2ð"0ð    LÑ 1Ñ2ð"0ð 
ó	"0ðN Ø8<ñ	Rà" >Ñ2ðRð ðRð # 3 |Ñ#4Ñ5ð	Rð
 
óRñ Ð-°[ÔAØð H¨\Ñ$:ð ¸sò ó ó Bðñ Ð/°{ÔCØð h¨|Ñ&<ð Àò ó ó Dðñ Ð/°{ÔCØðà Ñ-ðð ˜lÑ+ðð 
ò	ó ó Dðð( Ø×ÑðZ˜cò Zó ó ðZð Ø×ÑðZ˜dò Zó ó ðZð 	×ÑðY Sð Y¨T°#©Yò Yó ðYñ Ð4¸KÔHØ€Y‡_�_Ñ*Ó+ð(¨Cð (¸ð (Àò (ó ,ó Ið(ñ Ð/°{ÔCØ×ÑØ×ÑðZ lð Z°tò Zó ó ó DðZñ Ð3¸;ÔGØ×ÑØ×Ñð^¨,ð ^¸4ò ^ó ó ó Hð^ñ Ð1¸ÔEØ×ÑØ×Ñð\¨\ð \Èð \ÐY]ò \ó ó ó Fð\ñ Ø)ØØØ!ô	ð 	×ÑØ×Ñðd°ð dÀÀjÑAQò dó ó óðdð
¸ð 
ÈÐR^ÑI_ó 
ñ Ð4¸KÔHØ€Y×ÑÐ3Ñ5GÓHð6¨3ð 6¸Cð 6ÀDÈÑDTò 6ó Ió Ið6ð 	×Ñð

¨ð 

¸|ð 

ÐPTò 

ó ð

ñ Ø0ØØØ!ô	ð 	×Ñð
¸lð 
ÈtÐT`ÑOaò 
ó óð
ñ" Ø*ØØØ!ô	ð ð°Mð Àdò ó óðñ6 Ð4¸KÔHØ×Ñð`Ø)ð`Ø8Dð`à	ˆjÑ	ò`ó ó Ið`ñ< Ð6¸kÔJØ×ÑàOSñ?Ø$ð?Ø4<¸TÀ#ÀsÀ(¹^Ñ4Lð?à	ò?ó ó Kð?ñ> ÐIÐQ\Ô]Ø×ÑðCØ$ðCØ48¸¸c¸±NðCØN^ðCà	òCó ó ^ðCñ, Ð:À+ÔNØ×Ñð=Ø)ð=Ø8Dð=à	ò=ó ó Oð=ð," x°¡}ð "¸cð "ÀdÈ<ÑFXó "ðH
¨3ð 
¸ð 
Èð 
ÐQUÐVYÐ[^ÐV^ÑQ_ó 
ð&à˜\Ñ*ðð ðð ð	ð
 ðð 
ˆlÑ	óñ" Ð.°kÔBØ×Ñð Sð °#ð À3ð È8ÐT`ÑKaò ó ó Cðñ& Ð0¸ÔDØ€Y×Ñ˜.Ñ*?Ó@ð$ Sð $°ð $¸ò $ó Aó Eð$ñ Ð/°{ÔCØ×ÑØ×ÑðZ lò Zó ó ó DðZñ Ð-°[ÔAØ×ÑØ×ÑðX Lò Xó ó ó BðXð ØÙ˜.°Ô<Ø×ÑðR˜sð R sò Ró ó =ó ó ðRñ Ð4¸KÔHØð¨cð ¸cð Àcò ó ó Iðñ& Ð2¸+ÔFØð¨ð ¸8ÀD¹>ð Ècò ó ó Gðð& Ø×Ñð^¨Mð ^ÀCð ^ÈCò ^ó ó ð^ð Ø×Ñð`¨mð `Àcð `Ècò `ó ó ð`ð ð¨}ð Àsð Èsò ó ðð Ø×Ñða¨}ð aÀsð aÈsò aó ó ðað Ø×Ñðb°ð bÈð bÐPSò bó ó ðbð Ø×Ñð^¨Mð ^ÀCð ^ÈCò ^ó ó ð^ð Ø×Ñð^¨Mð ^ÀCð ^ÈCò ^ó ó ð^ð ØÙØ ¨À$ÐVaôð< }ð <¸sð <ÀxÐPSÁ}ò <óó ó ð
<ð ð¨]ð ÀSð ÈXÐVYÉ]ò ó ðð4 ;?Ø!%Ø59Ø+/Ø ñ>àð>ð !Ð!6Ñ7ð>ð ˜#‘ð	>ð
 # 4¨¨S¨¡>Ñ2ð>ð ˜˜c 3˜h™Ñ(ð>ð ð>ð 
ó>ð@ ðBØ!ðBØ1:¸5ÀÀcÀ¹?Ñ1KðBà	òBó ðBð4
à-ð
ð �S‘ð
ð    c¨3 h¡Ñ0ð	
ð
 
ó
ðà-ðð ˜Ñ%ðð    c¨3 h¡Ñ0ð	ð
 
óð& 26ñ	($à" >Ñ2ð($ð    c¨3 h¡Ñ0ð($ð ˜C Ñ-Ñ.ó	($ðT¨ð ÀÀLÑ@Qó ð$à" >Ñ2ð$ð    c¨3 h¡Ñ0ð$ð 
ˆ}˜d 9™oÐ-Ñ	.ó	$ð((Ø% e¨C°¨H¡oÑ6ð(ØCFÀ|ÑCTð(à	ˆ}˜d 9™oÐ-Ñ	.ó(ò,.ð ;?ñ	4àð4ð �S˜#�X‘ð4ð !Ð!6Ñ7ð	4ð
 
ˆx˜Ñ(Ð*;Ð;Ñ	<ó4ð< ;?ñ_àð_ð ð_ð ˜‘ð	_ð
 !Ð!6Ñ7ð_ð 
ˆx˜Ñ(Ð*;Ð;Ñ	<ó_ð& ;?ñ	
àð
ð ð
ð !Ð!6Ñ7ð	
ð
 
ˆx˜Ñ(Ð*;Ð;Ñ	<ó
ð" ;?ñ86à�lÑ#ð86ð !Ð!6Ñ7ð86ð 
ˆt�H˜_Ñ-Ñ.°°\ÐCTÐ5TÑ0UÐUÑ	Vó	86ðz ;?ñ
=àð
=ð !Ð!6Ñ7ð
=ð 
ˆx˜Ñ(Ð*;Ð;Ñ	<ó	
=ðØ% hÑ/ðØAIÈ(ÑASðà	óð&0Øð0Ø'4ð0à	ˆsÐ%Ð%Ñ	&ó0ð" W¨S°#¨XÑ%6ð ¸3ó ð
 g¨c°3¨hÑ&7ð 
À#ð 
È$ó 
ð$ '+ñ
àð
ð ð
ð ð	
ð
 ˜s‘mð
ð 
ó
ñ<¨ð <°Sð <Èð <ÐY\ó <ð ñ	WàðWð ðWð
 
óWð" -1Ø'ñà ðð !ðð ˜t C™yÑ)ð	ð
 ðð 
óð: ðP¨4°°T¸/Ñ5JÐ0JÑ+Kò Pó ðPð ðW°#ò Wó ðWð ÙØ d¸tÐS^ôðK¨dð KÀ3ð KÈ?ò Kóó ðKð"
ÀSð 
È_ó 
ò
ò"ð ×Ñð$)Àcò $)ó ð$)ðL ðV°d¸3À¸8±nð VÐI^ò Vó ðVð ð*Ð2Gð *ÈHÐUXÉMò *ó ð*ð: ØÙÐ=À[ÔQð+¸¸cÀ4ÈÈSÈÁ>Ð>QÑ9Rð +ÐW[Ð\_ÑW`ò +ó Ró ó ð+ð  ðà Ð!6Ð8LÐ!LÑMðð 
�#‰ò	ó ðð6 ðV°T¸#¸s¸(±^ð VÐH\ò Vó ðVð ØÙÐ<ÀKÔPðc¸4ÀÀSÈ#ÀXÁÑ;Oð cÐTXÐY\ÑT]ò có Qó ó ðcð ðV¸¸cÀ3¸h¹ð VÈHÐUXÉMò Vó ðVð ð)Ð1Eð )È(ÐSVÉ-ò )ó ð)ð: ð!˜^ò !ó ð!ð ð4 *ð 4°ò 4ó ð4ð ð
¨.ð 
Ð=Xò 
ó ð
ð  ð°t¸CÀ¸H±~ò ó ðð ×ÑØðO¨t°C¸°H©~ð OÀ#ò Oó ó ñOry   rá   )Ú	metaclassa   
with diff_count as (
    SELECT
        1 as id,
        COUNT(*) as num_missing FROM (
            (SELECT {columns} FROM {relation_a} {except_op}
             SELECT {columns} FROM {relation_b})
             UNION ALL
            (SELECT {columns} FROM {relation_b} {except_op}
             SELECT {columns} FROM {relation_a})
        ) as a
), table_a as (
    SELECT COUNT(*) as num_rows FROM {relation_a}
), table_b as (
    SELECT COUNT(*) as num_rows FROM {relation_b}
), row_count_diff as (
    select
        1 as id,
        table_a.num_rows - table_b.num_rows as difference
    from table_a, table_b
)
select
    row_count_diff.difference as row_count_difference,
    diff_count.num_missing as num_mismatched
from row_count_diff
join diff_count using (id)
c                 óT  — ddl m} g }g }t        | «      D ]‡  }|j                  «       }|€"|j	                  «       }|j                  |«       Œ7t        |t        «      st        |t        «      s|‚t        t        t        |«      ¬«      «       |j                  |«       Œ‰  ||«      |fS )Nr   )Úmerge_tables)Úexc)r   rB  r   Ú	exceptionrs  ri  rÌ  ÚKeyboardInterruptr¢  r)   rQ   r­   )rv  rB  Útablesrk  ry  rC  rú   s          rz   rs  rs  ì  sœ   € õ =ð #%€FØ"$€Jä˜wÓ'ò #ˆØ×ÑÓ ˆàˆ;Ø—m‘m“oˆGØ�M‰M˜'Õ"Ü˜Ô.Ô/´zÀ#ÄyÔ7QØˆIäÔ0´S¸³XÔ>Ô?à×Ñ˜cÕ"ð#ñ ˜Ó Ð+Ð+ry   )œr;  r¹   Úconcurrent.futuresr   r   Ú
contextlibr   Údataclassesr   r   Úenumr   Ú	importlibr	   Úmultiprocessing.contextr
   Útypingr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r§   Údbt.adapters.record.baser   r   r   r   r   r   r    Údbt_common.behavior_flagsr!   r"   Údbt_common.clients.jinjar#   Ú dbt_common.contracts.constraintsr$   r%   r&   Údbt_common.contracts.metadatar'   Údbt_common.events.functionsr(   r)   Údbt_common.exceptionsr*   r+   r,   r-   r.   r/   r0   Údbt_common.recordr1   r2   r3   Údbt_common.utilsr4   r5   r6   r7   Údbt.adapters.base.columnr8   r5  Údbt.adapters.base.connectionsr9   r:   r;   Údbt.adapters.base.metar<   r=   r>   Údbt.adapters.base.relationr?   r@   rA   rB   rC   Údbt.adapters.cacherD   rE   Údbt.adapters.capabilityrF   rG   Údbt.adapters.catalogsrH   rI   rJ   rK   rL   Ú!dbt.adapters.contracts.connectionrM   Údbt.adapters.contracts.macrosrN   Údbt.adapters.contracts.relationrO   Údbt.adapters.events.typesrP   rQ   rR   rS   rT   rU   rV   rW   Údbt.adapters.exceptionsrX   rY   rZ   r[   r\   r]   r^   Údbt.adapters.protocolr_   r`   Údbt.adapters.events.loggingra   rr   r—   r.  rY  r^  r„  rˆ  r�  rî   r­   rn   r‚   r‰   rœ   rž   rª   r®   rÃ   rÅ   rÏ   rÔ   rÚ   rá   r£  rÇ  r¢  rs  rx   ry   rz   ú<module>re     s‚  ðÛ 
Û ß 3Ý %Ý !Ý Ý Ý #Ý 0÷÷ ÷ ÷ ñ ó" ÷÷ ñ ÷ =Ý ;÷ñ õ
 7ß A÷÷ ñ ÷ UÑ T÷ó õ :÷ñ ÷
 NÑ M÷õ ÷ Bß >÷õ õ :Ý ?Ý :÷	÷ 	ó 	÷÷ ñ ÷ OÝ 5á	�xÓ	 €ÙÛà&Ð Ø#:Ð  Ø*Ð Ø"@Ð Ø(DÐ %ð KØØOñð 3ØØñðÐ ô$˜˜Tô $ð°E¸#¸}Ð:LÑ4Mó ð˜3ð  [ó ðØ˜E # s (™OÑ,ðàˆ{ˆm˜TÐ!Ñ"óð<+ˆX�hÑð +¨°,Ñ)?ð +ÈSð +ÐU]ó +ð ˜ Ñ.ð °3ó ò÷*\ñ \ð ÷ð ó ðô˜	ô ô �yô  ð ôFO˜Kô FOó ðFOðR6÷4 
‚EƒGð5 ð:,à
ˆ=˜$˜y™/Ð)Ñ*ô,ry   