o znh| @sdZddlZddlmZddlmZddlmZddlmZddl m Z ddl m Z dd l m Z dd l mZdd lmZdd lmZdd lmZddlmZddlmZddlmZddlmZddlmZddlmZddlmZddlmZddlmZddlmZddlmZddlmZddlmZddlm Z ddlm!Z!ddlm"Z"ddlm#Z#e$gdZ%Gd d!d!e&Z'Gd"d#d#e'ej!Z(Gd$d%d%e'ej!Z)Gd&d'd'e'ej*Z+Gd(d)d)ej,Z-Gd*d+d+ej.Z/Gd,d-d-ej.Z0Gd.d/d/ej.Z1Gd0d1d1ej.Z2Gd2d3d3ej3Z4Gd4d5d5e j5Z6id6ed7ed8ed9ed:e-d;eded?ed@edAedBedCedDedEe1dFe0idGedHedIedJedKedLedMe#dNe#dOe#dPe(dQe)dRedSedTedUedVedWeeee+ee"e4e/ee e2dX Z7GdYdZdZe j8Z9Gd[d\d\e j:Z;Gd]d^d^e j<Z=Gd_d`d`e j>Z?Gdadbdbe j@ZAGdcdddde jBZCdS)ea .. dialect:: sybase :name: Sybase .. note:: The Sybase dialect within SQLAlchemy **is not currently supported**. The dialect is not tested within continuous integration and is likely to have many issues and caveats not currently handled. N)exc)schema)types)util)default) reflection)compiler)text)BIGINT)BINARY)CHAR)DATE)DATETIME)DECIMAL)FLOAT)INT)INTEGER)NCHAR)NUMERIC)NVARCHAR)REAL)SMALLINT)TEXT)TIME) TIMESTAMP)Unicode) VARBINARY)VARCHAR)addallalterandanyasascbackupbeginbetweenbigintbinarybitbottombreakbycall capabilitycascadecasecastchar char_convert charactercheck checkpointclosecommentcommitconnect constraintcontainscontinueconvertcreatecrosscubecurrentcurrent_timestamp current_usercursordatedbspace deallocatedecdecimaldeclarerdeletedeletingdescdistinctdodoubledropdynamicelseelseif encryptedendendifescapeexcept exceptionexecexecuteexistingexists externloginfetchfirstfloatforforceforeignforwardfromfullgotograntgrouphavingholdlock identifiedifinindex index_lpareninnerinout insensitiveinsert insertinginstallinsteadintinteger integrated intersectintoiqis isolationjoinkeylateralleftlikelockloginlongmatch membershipmessagemodemodifynaturalnewno noholdlocknotnotifynullnumericofoffonopenoptionoptionsororderothersoutouterover passthrough precisionprepareprimaryprint privilegesproc procedure publication raiserrorreadtextreal reference referencesreleaseremoteremoverename reorganizeresourcerestorerestrictreturnrevokerightrollbackrollupsave savepointscrollselect sensitivesessionsetsetusersharesmallintsomesqlcodesqlstatestartstopsubtranssubtransaction synchronize syntax_errortable temporarythentime timestamptinyinttotoptrantriggertruncatetsequal unboundedunionuniqueunknownunsignedupdateupdatinguserusingvalidatevalues varbinaryvarcharvariablevaryingviewwaitwaitforwhenwherewhilewindowwith with_cube with_lparen with_rollupwithinwork writetextc@seZdZdZddZdS)_SybaseUnitypeMixinz-these types appear to return a buffer object.cCs dd}|S)NcSs|durt|SdSN)str)valuerJ/usr/local/lib/python3.10/dist-packages/sqlalchemy/dialects/sybase/base.pyprocess"sz5_SybaseUnitypeMixin.result_processor..processr)selfdialectcoltyperrrrresult_processor!sz$_SybaseUnitypeMixin.result_processorN)__name__ __module__ __qualname____doc__rrrrrrs rc@eZdZdZdS)UNICHARNrrr __visit_name__rrrrr +r c@r ) UNIVARCHARNr rrrrr/rrc@r )UNITEXTNr rrrrr3rrc@r )TINYINTNr rrrrr7rrc@r )BITNr rrrrr;rrc@r )MONEYNr rrrrr?rrc@r ) SMALLMONEYNr rrrrrCrrc@r )UNIQUEIDENTIFIERNr rrrrrGrrc@r )IMAGENr rrrrrKrrc@sleZdZddZddZddZddZd d Zd d Zd dZ ddZ ddZ ddZ ddZ ddZdS)SybaseTypeCompilercK ||Sr) visit_IMAGErtype_kwrrrvisit_large_binaryP z%SybaseTypeCompiler.visit_large_binarycKrr) visit_BITrrrr visit_booleanSrz SybaseTypeCompiler.visit_booleancKrr)visit_NVARCHARrrrr visit_unicodeVrz SybaseTypeCompiler.visit_unicodecK d|jS)Nz UNICHAR(%d)lengthrrrr visit_UNICHARYrz SybaseTypeCompiler.visit_UNICHARcKr$)NzUNIVARCHAR(%d)r%rrrrvisit_UNIVARCHAR\rz#SybaseTypeCompiler.visit_UNIVARCHARcKdS)Nrrrrrr visit_UNITEXT_z SybaseTypeCompiler.visit_UNITEXTcKr))Nrrrrrr visit_TINYINTbr+z SybaseTypeCompiler.visit_TINYINTcKr))Nrrrrrrrer+zSybaseTypeCompiler.visit_IMAGEcKr))Nrrrrrrr hr+zSybaseTypeCompiler.visit_BITcKr))Nrrrrrr visit_MONEYkr+zSybaseTypeCompiler.visit_MONEYcKr))Nrrrrrrvisit_SMALLMONEYnr+z#SybaseTypeCompiler.visit_SMALLMONEYcKr))Nrrrrrrvisit_UNIQUEIDENTIFIERqr+z)SybaseTypeCompiler.visit_UNIQUEIDENTIFIERN)rrr rr!r#r'r(r*r,rr r-r.r/rrrrrOs rr(r|r}rrzunsigned bigintz unsigned intzunsigned smallintrrKrJrdrRzdouble precisionr smallmoneymoney smalldatetimedatetimerGrr3r5rzcharacter varyingz char varyingunicharzunicode characterncharz national charznational characternvarcharz nchar varyingznational char varying) znational character varyingr unitextr)rimager*z long varcharruniqueidentifierc@seZdZddZdddZdS)SybaseInspectorcCstj||dSr)r Inspector__init__)rconnrrrr<szSybaseInspector.__init__NcCs|jj|j|||jdS)z3Return the table id from `table_name` and `schema`. info_cache)r get_table_idbindr?)r table_namerrrrr@s zSybaseInspector.get_table_idr)rrr r<r@rrrrr:sr:c@s0eZdZdZddZddZddZdd Zd S) SybaseExecutionContextFcCst)aMust be implemented by subclasses to accommodate DDL executions. "connection" is the raw unwrapped DBAPI connection. "value" is True or False. when True, the connection should be configured such that a DDL can take place subsequently. when False, a DDL has taken place and the connection should be resumed into non-autocommit mode. )NotImplementedError)r connectionrrrrset_ddl_autocommits z)SybaseExecutionContext.set_ddl_autocommitcCs|jr.|jjj}|j}|du}|r|j|jdv|_nd|_|jr.|j d|j j ||j rL|js9td|jjjd||jjjddSdS)NrFzSET IDENTITY_INSERT %s ONzGThe Sybase dialect only supports DDL in 'autocommit' mode at this time.z-AUTOCOMMIT (Assuming no Sybase 'ddl in tran')T)isinsertcompiled statementr_autoincrement_columnrcompiled_parameters_enable_identity_insertrFr^ridentifier_preparer format_tableisddlshould_autocommitrInvalidRequestErrorroot_connectionengineloggerinforFrE)rtbl seq_columninsert_has_sequencerrrpre_execs4    zSybaseExecutionContext.pre_execcCsB|jr ||jd|jr|jd|jj|j j j dSdS)NFzSET IDENTITY_INSERT %s OFF) rOrFrRrLrFr^rrMrNrHrIr)rrrr post_execsz SybaseExecutionContext.post_execcCs*|}|d|d}||S)NzSELECT @@identity AS lastrowidr) create_cursorr^fetchoner8)rrF lastrowidrrr get_lastrowids   z$SybaseExecutionContext.get_lastrowidN)rrr rLrFrYrZr^rrrrrCs  % rCc@speZdZdZeejjddddZddZ dd Z d d Z d d Z ddZ ddZddZddZddZdS)SybaseSQLCompilerT dayofyearweekday millisecond)doydow millisecondscKs<|jrdpd}|j}|r|d|f7}|j}|rtd|S)Nz DISTINCT zTOP %s z"Sybase ASE does not support OFFSET) _distinct_limit_offsetrD)rrrslimitoffsetrrrget_select_precolumnssz'SybaseSQLCompiler.get_select_precolumnscCs|Srr)rrr rrrget_from_hint_textr+z$SybaseSQLCompiler.get_from_hint_textcKr)Nrfr)rrrrrr limit_clauseszSybaseSQLCompiler.limit_clausecKs.|j|j|j}d||j|jfi|fS)NzDATEPART("%s", %s)) extract_mapgetfieldrexpr)rextractrrsrrr visit_extractszSybaseSQLCompiler.visit_extractcKr))Nz GETDATE()r)rfnrrrrvisit_now_funcr+z SybaseSQLCompiler.visit_now_funccCr)ror)rrrrrfor_update_clause sz#SybaseSQLCompiler.for_update_clausecKs:d|d<|j|jfi|}|r|r|jrd|SdS)NT literal_bindsz ORDER BY rf)r_order_by_clause is_subqueryrh)rrrorder_byrrrorder_by_clause%s z!SybaseSQLCompiler.order_by_clausecCsd}|rd}|j|dd|dS)z=If we have extra froms make sure we render any alias as hint.FT)asfromiscrudashint_compiler_dispatch)r delete_stmt from_table extra_fromsrrrrdelete_table_clause/s z%SybaseSQLCompiler.delete_table_clausec s&ddfdd|g|DS)z4Render the DELETE .. FROM clause specific to Sybase.zFROM z, c3s(|]}|jfddVqdS)T)r fromhintsNr.0t from_hintsrrrr <s  z=SybaseSQLCompiler.delete_extra_from_clause..)r)rrrrrrrrrdelete_extra_from_clause8s z*SybaseSQLCompiler.delete_extra_from_clauseN)rrr ansi_bind_rulesr update_copyr SQLCompilerrqrmrnrprvrxryr~rrrrrrr_s  r_c@seZdZddZddZdS)SybaseDDLCompilerc Ks|j|d|jjj|j|d}|jdurtd|jj }||urVt |j t j o-|j }|r<|jp4d|jp8d}}nd\}}||fdkrL|d7}|S|d||f7}|S||}|dure|d|7}|jdurz|jrp|jrv|d 7}|S|d 7}|S) N )type_expressionzHThe Sybase dialect requires Table-bound columns in order to generate DDL)rrz IDENTITYz IDENTITY(%s,%s)z DEFAULT z NOT NULLz NULL)preparer format_columnr type_compilerrtyperr CompileErrorrJ isinstancer sa_schemaSequencer incrementget_column_default_stringnullable primary_key) rcolumnkwargscolspecseq_colsequencerrrrrrget_column_specificationCsD       z*SybaseDDLCompiler.get_column_specificationcCs*|j}d|j|jj|j|jddfS)Nz DROP INDEX %s.%sF)include_schema)elementrquote_identifierrname_prepared_index_name)rrSrsrrrvisit_drop_indexos z"SybaseDDLCompiler.visit_drop_indexN)rrr rrrrrrrBs ,rc@seZdZeZdS)SybaseIdentifierPreparerN)rrr RESERVED_WORDSreserved_wordsrrrrrwrrcseZdZdZdZdZdZdZdZdZ iZ e Z e Z eZeZeZeZgZddZfddZdd d Zejdd d Zd dZejdddZejdddZejdddZ ejddZ!ejdddZ"ejdddZ#ejdddZ$dddZ%Z&S) SybaseDialectsybaseFTcCs|tdjtdS)NzSELECT user_name() as user_name)username)scalarr columnsrrrErrr_get_default_schema_namesz&SybaseDialect._get_default_schema_namecs8tt|||jdur|jdkrd|_dSd|_dS)N))superr initializeserver_version_infomax_identifier_lengthr __class__rrrs     zSybaseDialect.initializeNcKsvd}|dur |j}td}tjr$t|tr|d}t|tr$|d}|j|||d}|}|dur9t ||S)zFetch the id for schema.table_name. Several reflection methods require the table id. The idea for using this method is that it can be fetched one time and cached for subsequent calls. Nz SELECT o.id AS id FROM sysobjects o JOIN sysusers u ON o.uid=u.uid WHERE u.name = :schema_name AND o.name = :table_name AND o.type in ('U', 'V') ascii) schema_namerB) default_schema_namer rpy2krunicodeencoder^rrNoSuchTableError)rrErBrrtable_id TABLEID_SQLresultrrrr@s$      zSybaseDialect.get_table_idc Ksz|j||||dd}td}|j||d}g}|D]\} } } } } }}}|| | t| t| | |||}||q|S)Nr?r>a* SELECT col.name AS name, t.name AS type, (col.status & 8) AS nullable, (col.status & 128) AS autoincrement, com.text AS 'default', col.prec AS precision, col.scale AS scale, col.length AS length FROM systypes t, syscolumns col LEFT OUTER JOIN syscomments com ON col.cdefault = com.id WHERE col.usertype = t.usertype AND col.id = :table_id ORDER BY col.colid r)r@rrr r^_get_column_infoboolappend)rrErBrrr COLUMN_SQLresultsrrrr autoincrementdefault_rscaler&col_inforrr get_columnss<  zSybaseDialect.get_columnsc Cs|j|d} i} | ttfvr||f} n| tkr|f} n| ttttt t fvr*|f} nd} | r6| | i| } n t d||ft j} |rV|dd}tddd|}nd}t|| |||d} | S) Nrz*Did not recognize type '%s' of column '%s'DEFAULTrfz^'(.*)'$cSs |dS)Nr)rm)mrrrs z0SybaseDialect._get_column_info..)rrrrr) ischema_namesrrrrrr rr rrrrwarnsqltypesNULLTYPEreplacestripresubdict) rrrrrrrrr&rrargs column_inforrrrs6    zSybaseDialect._get_column_infocKs|j||||dd}i}i}g}||d||<td} |j| |d} i} | D] } | d| | d<q(| ||<td} |j| |d}td }|D]}|d }||vr|j||d}|}||ddd}|dusu|d |jkr{|d |d <|||<|j| |d} i}| D] } | d|| d<q|||<||}||}g}g}td |d d D]}| | |d|| ||d|q||d |d||dd}| |qJ|S)Nr?r>)rrzu SELECT c.colid AS id, c.name AS name FROM syscolumns c WHERE c.id = :table_id rrida( SELECT o.name AS name, r.reftabid AS reftable_id, r.keycnt AS 'count', r.fokey1 AS fokey1, r.fokey2 AS fokey2, r.fokey3 AS fokey3, r.fokey4 AS fokey4, r.fokey5 AS fokey5, r.fokey6 AS fokey6, r.fokey7 AS fokey7, r.fokey1 AS fokey8, r.fokey9 AS fokey9, r.fokey10 AS fokey10, r.fokey11 AS fokey11, r.fokey12 AS fokey12, r.fokey13 AS fokey13, r.fokey14 AS fokey14, r.fokey15 AS fokey15, r.fokey16 AS fokey16, r.refkey1 AS refkey1, r.refkey2 AS refkey2, r.refkey3 AS refkey3, r.refkey4 AS refkey4, r.refkey5 AS refkey5, r.refkey6 AS refkey6, r.refkey7 AS refkey7, r.refkey1 AS refkey8, r.refkey9 AS refkey9, r.refkey10 AS refkey10, r.refkey11 AS refkey11, r.refkey12 AS refkey12, r.refkey13 AS refkey13, r.refkey14 AS refkey14, r.refkey15 AS refkey15, r.refkey16 AS refkey16 FROM sysreferences r JOIN sysobjects o on r.tableid = o.id WHERE r.tableid = :table_id z SELECT o.name AS name, u.name AS 'schema' FROM sysobjects o JOIN sysusers u ON o.uid = u.uid WHERE o.id = :table_id reftable_idrrcountzfokey%izrefkey%i)constrained_columnsreferred_schemareferred_tablereferred_columnsr) r@rrr r^fetchallr\r8rranger)rrErBrrr table_cache column_cache foreign_keysrrrcolREFCONSTRAINT_SQLreferential_constraints REFTABLE_SQLrrcreftable table_inforeftable_columnsrrifk_inforrrget_foreign_keys)sr  zSybaseDialect.get_foreign_keysc Ks|j||||dd}td}|j||d}g}|D])} g} td| dD] } | | d| fq&| dt| d | d } || q|S) Nr?r>a SELECT object_name(i.id) AS table_name, i.keycnt AS 'count', i.name AS name, (i.status & 0x2) AS 'unique', index_col(object_name(i.id), i.indid, 1) AS col_1, index_col(object_name(i.id), i.indid, 2) AS col_2, index_col(object_name(i.id), i.indid, 3) AS col_3, index_col(object_name(i.id), i.indid, 4) AS col_4, index_col(object_name(i.id), i.indid, 5) AS col_5, index_col(object_name(i.id), i.indid, 6) AS col_6, index_col(object_name(i.id), i.indid, 7) AS col_7, index_col(object_name(i.id), i.indid, 8) AS col_8, index_col(object_name(i.id), i.indid, 9) AS col_9, index_col(object_name(i.id), i.indid, 10) AS col_10, index_col(object_name(i.id), i.indid, 11) AS col_11, index_col(object_name(i.id), i.indid, 12) AS col_12, index_col(object_name(i.id), i.indid, 13) AS col_13, index_col(object_name(i.id), i.indid, 14) AS col_14, index_col(object_name(i.id), i.indid, 15) AS col_15, index_col(object_name(i.id), i.indid, 16) AS col_16 FROM sysindexes i, sysobjects o WHERE o.id = i.id AND o.id = :table_id AND (i.status & 2048) = 0 AND i.indid BETWEEN 1 AND 254 rrrzcol_%irr)rr column_names)r@rrr r^rrr) rrErBrrr INDEX_SQLrindexesrrr index_inforrr get_indexess$  zSybaseDialect.get_indexesc Ks|j||||dd}td}|j||d}|}|g} |r@td|ddD] } | |d| fq,| |dd Sgdd S) Nr?r>ay SELECT object_name(i.id) AS table_name, i.keycnt AS 'count', i.name AS name, index_col(object_name(i.id), i.indid, 1) AS pk_1, index_col(object_name(i.id), i.indid, 2) AS pk_2, index_col(object_name(i.id), i.indid, 3) AS pk_3, index_col(object_name(i.id), i.indid, 4) AS pk_4, index_col(object_name(i.id), i.indid, 5) AS pk_5, index_col(object_name(i.id), i.indid, 6) AS pk_6, index_col(object_name(i.id), i.indid, 7) AS pk_7, index_col(object_name(i.id), i.indid, 8) AS pk_8, index_col(object_name(i.id), i.indid, 9) AS pk_9, index_col(object_name(i.id), i.indid, 10) AS pk_10, index_col(object_name(i.id), i.indid, 11) AS pk_11, index_col(object_name(i.id), i.indid, 12) AS pk_12, index_col(object_name(i.id), i.indid, 13) AS pk_13, index_col(object_name(i.id), i.indid, 14) AS pk_14, index_col(object_name(i.id), i.indid, 15) AS pk_15, index_col(object_name(i.id), i.indid, 16) AS pk_16 FROM sysindexes i, sysobjects o WHERE o.id = i.id AND o.id = :table_id AND (i.status & 2048) = 2048 AND i.indid BETWEEN 1 AND 254 rrrzpk_%ir)rr)r@rrr r^r\r8rr) rrErBrrrPK_SQLrpksrrrrrget_pk_constraints" zSybaseDialect.get_pk_constraintcKs td}||}dd|DS)Nz%SELECT u.name AS name FROM sysusers ucSg|]}|dqSrr)rrjrrr z2SybaseDialect.get_schema_names..)r r^)rrEr SCHEMA_SQLschemasrrrget_schema_namess zSybaseDialect.get_schema_namescKL|dur|j}td}tjrt|tr|d}|j||d}dd|DS)Nz SELECT o.name AS name FROM sysobjects o JOIN sysusers u ON o.uid = u.uid WHERE u.name = :schema_name AND o.type = 'U' rrcSrrrrrrrrrz1SybaseDialect.get_table_names..rr rrrrrr^)rrErr TABLE_SQLtablesrrrget_table_namess  zSybaseDialect.get_table_namescKsF|dur|j}td}tjrt|tr|d}|j||d}|S)Nz SELECT c.text FROM syscomments c JOIN sysobjects o ON c.id = o.id WHERE o.name = :view_name AND o.type = 'V' r) view_name) rr rrrrrr^r)rrErrr VIEW_DEF_SQLrrrrget_view_definitions  z!SybaseDialect.get_view_definitioncKr )Nz SELECT o.name AS name FROM sysobjects o JOIN sysusers u ON o.uid = u.uid WHERE u.name = :schema_name AND o.type = 'V' rr cSrrr)rvrrrr<rz0SybaseDialect.get_view_names..r)rrErrVIEW_SQLviewsrrrget_view_names)s  zSybaseDialect.get_view_namescCs,z ||||WdStjyYdSw)NFT)r@rr)rrErBrrrr has_table>s zSybaseDialect.has_tabler)'rrr rsupports_unicode_statementssupports_sane_rowcountsupports_sane_multi_rowcountsupports_native_booleansupports_unicode_bindspostfetch_lastrowidcolspecsrrrr_statement_compilerr ddl_compilerrrr: inspectorconstruct_argumentsrrr@rcacherrrrrr rrrr __classcell__rrrrr{sJ  $ 23 e 2 1    r)Dr r sqlalchemyrrrrrrsqlalchemy.enginerrsqlalchemy.sqlrr sqlalchemy.typesr r r r rrrrrrrrrrrrrrrrrrobjectrr r UnicodeTextrIntegerr TypeEnginerrrr LargeBinaryrGenericTypeCompilerrrr;r:DefaultExecutionContextrCrr_ DDLCompilerrIdentifierPreparerrDefaultDialectrrrrrs                             f &      !"#1 HH5