[Jc@sVdZddkZddkZddkZddklZlZlZlZddk l Z l Z ddk lZlZddklZlZddklZdd d d d d dddddddg ZdeifdYZdefdYZd efdYZd efdYZd efdYZd eifdYZd efdYZdei fdYZ!dei"fdYZ#dei$fdYZ%dei&fd YZ'dei(fd!YZ)dei*fd"YZ+dei,fd#YZ-heei6eei.6e!ei 6e#ei"6e%ei$6e'ei&6e)ei(6eei6e-ei,6e+ei*6eei/6eei06e%ei16e-ei26eei36Z4he+d$6ed%6ed&6e'd'6e!d(6e#d)6ed*6ed+6e-d,6ed-6ed.6ed.6ed/6e)d06e%d16ed26Z5d3ei6fd4YZ7d5ei8fd6YZ9d7ei:fd8YZ;d9ei<fd:YZ=d;ei>fd<YZ?d=ei@fd>YZAd?eiBfd@YZCdAeiDfdBYZEdCeiFfdDYZGdEZHe=ZIeCeI_Je?eI_KeEeI_LeGeI_MeAeI_Ne7eI_OdS(FsSupport for the MaxDB database. TODO: More module docs! MaxDB support is currently experimental. Overview -------- The ``maxdb`` dialect is **experimental** and has only been tested on 7.6.03.007 and 7.6.00.037. Of these, **only 7.6.03.007 will work** with SQLAlchemy's ORM. The earlier version has severe ``LEFT JOIN`` limitations and will return incorrect results from even very simple ORM queries. Only the native Python DB-API is currently supported. ODBC driver support is a future enhancement. Connecting ---------- The username is case-sensitive. If you usually connect to the database with sqlcli and other tools in lower case, you likely need to use upper case for DB-API. Implementation Notes -------------------- Also check the DatabaseNotes page on the wiki for detailed information. With the 7.6.00.37 driver and Python 2.5, it seems that all DB-API generated exceptions are broken and can cause Python to crash. For 'somecol.in_([])' to work, the IN operator's generation must be changed to cast 'NULL' to a numeric, i.e. NUM(NULL). The DB-API doesn't accept a bind parameter there, so that particular generation must inline the NULL value, which depends on [ticket:807]. The DB-API is very picky about where bind params may be used in queries. Bind params for some functions (e.g. MOD) need type information supplied. The dialect does not yet do this automatically. Max will occasionally throw up 'bad sql, compile again' exceptions for perfectly valid SQL. The dialect does not currently handle these, more research is needed. MaxDB 7.5 and Sap DB <= 7.4 reportedly do not support schemas. A very slightly different version of this dialect would be required to support those versions, and can easily be added if there is demand. Some other required components such as an Max-aware 'old oracle style' join compiler (thetas with (+) outer indicators) are already done and available for integration- email the devel list if you're interested in working on this. iN(texctschematsqltutil(t operatorst expression(tcompilertvisitors(tbasetdefault(ttypest MaxStringt MaxUnicodetMaxChartMaxTextt MaxIntegertMaxSmallIntegert MaxNumerictMaxFloatt MaxTimestamptMaxDatetMaxTimet MaxBooleantMaxBlobt _StringTypecBs8eZdZdddZdZdZdZRS(cKs)tt|id||||_dS(Ntlength(tsuperRt__init__tencoding(tselfRRtkw((s>/usr/lib/python2.6/site-packages/sqlalchemy/databases/maxdb.pyRNscCsf|idjo d}nd|i|if}|idj o"di||iig}n|S(NtLONGs%s(%s)t (RtNonet_typeRtjointupper(Rtspec((s>/usr/lib/python2.6/site-packages/sqlalchemy/databases/maxdb.pyt get_col_specRs  "cs,|idjodSfd}|SdS(Ntunicodecs)t|to|iiS|SdS(N(t isinstanceR'tencodeR(tvalue(tdialect(s>/usr/lib/python2.6/site-packages/sqlalchemy/databases/maxdb.pytprocess`s(RR!(RR+R,((R+s>/usr/lib/python2.6/site-packages/sqlalchemy/databases/maxdb.pytbind_processor\scsfd}|S(Ncsxto|djodSt|to|St|to-ip io|iiS|Sqt|do|i |i }qq|SqWdS(Ntread( tTrueR!R(R'tstrtconvert_unicodetdecodeRthasattrR.tremainingLength(R*(R+R(s>/usr/lib/python2.6/site-packages/sqlalchemy/databases/maxdb.pyR,hs ((RR+R,((R+Rs>/usr/lib/python2.6/site-packages/sqlalchemy/databases/maxdb.pytresult_processorgsN(t__name__t __module__R!R"RR&R-R5(((s>/usr/lib/python2.6/site-packages/sqlalchemy/databases/maxdb.pyRKs  cBseZdZdZRS(tVARCHARcOstt|i||dS(N(RR R(RtaR((s>/usr/lib/python2.6/site-packages/sqlalchemy/databases/maxdb.pyRs(R6R7R"R(((s>/usr/lib/python2.6/site-packages/sqlalchemy/databases/maxdb.pyR }scBseZdZddZRS(R8cKs#tt|id|dddS(NRRR'(RR R(RRR((s>/usr/lib/python2.6/site-packages/sqlalchemy/databases/maxdb.pyRsN(R6R7R"R!R(((s>/usr/lib/python2.6/site-packages/sqlalchemy/databases/maxdb.pyR scBseZdZRS(tCHAR(R6R7R"(((s>/usr/lib/python2.6/site-packages/sqlalchemy/databases/maxdb.pyR scBs eZdZdZdZRS(RcOstt|i||dS(N(RRR(RR9R((s>/usr/lib/python2.6/site-packages/sqlalchemy/databases/maxdb.pyRscCsYd}|idj odi||if}n$|iodi|df}n|S(NRR tUNICODE(RR!R#R1(RR%((s>/usr/lib/python2.6/site-packages/sqlalchemy/databases/maxdb.pyR&s  (R6R7R"RR&(((s>/usr/lib/python2.6/site-packages/sqlalchemy/databases/maxdb.pyRs cBseZdZRS(cCsdS(NtINTEGER((R((s>/usr/lib/python2.6/site-packages/sqlalchemy/databases/maxdb.pyR&s(R6R7R&(((s>/usr/lib/python2.6/site-packages/sqlalchemy/databases/maxdb.pyRscBseZdZRS(cCsdS(NtSMALLINT((R((s>/usr/lib/python2.6/site-packages/sqlalchemy/databases/maxdb.pyR&s(R6R7R&(((s>/usr/lib/python2.6/site-packages/sqlalchemy/databases/maxdb.pyRscBs/eZdZdddZdZdZRS(s,The FIXED (also NUMERIC, DECIMAL) data type.cKs6|idttt|id|d||dS(Nt asdecimaltscalet precision(t setdefaultR/RRR(RR@R?R((s>/usr/lib/python2.6/site-packages/sqlalchemy/databases/maxdb.pyRscCsdS(N(R!(RR+((s>/usr/lib/python2.6/site-packages/sqlalchemy/databases/maxdb.pyR-scCsG|io|iod|i|ifS|io d|iSdSdS(Ns FIXED(%s, %s)s FIXED(%s)R<(R?R@(R((s>/usr/lib/python2.6/site-packages/sqlalchemy/databases/maxdb.pyR&s   N(R6R7t__doc__R!RR-R&(((s>/usr/lib/python2.6/site-packages/sqlalchemy/databases/maxdb.pyRs cBseZdZdZRS(sThe FLOAT data type.cCs'|idjodSd|ifSdS(NtFLOATs FLOAT(%s)(R@R!(R((s>/usr/lib/python2.6/site-packages/sqlalchemy/databases/maxdb.pyR&s(R6R7RBR&(((s>/usr/lib/python2.6/site-packages/sqlalchemy/databases/maxdb.pyRscBs#eZdZdZdZRS(cCsdS(Nt TIMESTAMP((R((s>/usr/lib/python2.6/site-packages/sqlalchemy/databases/maxdb.pyR&scsfd}|S(Ncs|djodSt|to|Sidjo(t|dd}|idd|Sidjo(t|dd}|idd|StidifdS( Ntinternalt microsecondis %Y%m%d%H%M%Ss%06utisos%Y-%m-%d %H:%M:%S.s%datetimeformat '%s' is not supported.(R!R(t basestringtdatetimeformattgetattrtstrftimeRtInvalidRequestError(R*tms(R+(s>/usr/lib/python2.6/site-packages/sqlalchemy/databases/maxdb.pyR,s ((RR+R,((R+s>/usr/lib/python2.6/site-packages/sqlalchemy/databases/maxdb.pyR-scsfd}|S(Ncs3|djodSidjortig}|dd!|dd!|dd!|dd!|dd!|dd!|dfD]}|t|qv~Sid jortig}|dd!|d d !|dd!|d d !|dd!|dd!|dfD]}|t|q~StidifdS(NREiiiii i iRGiii i iiiis%datetimeformat '%s' is not supported.(R!RItdatetimetintRRL(R*t_[1]tvt_[2](R+(s>/usr/lib/python2.6/site-packages/sqlalchemy/databases/maxdb.pyR,s" ))((RR+R,((R+s>/usr/lib/python2.6/site-packages/sqlalchemy/databases/maxdb.pyR5s(R6R7R&R-R5(((s>/usr/lib/python2.6/site-packages/sqlalchemy/databases/maxdb.pyRs  cBs#eZdZdZdZRS(cCsdS(NtDATE((R((s>/usr/lib/python2.6/site-packages/sqlalchemy/databases/maxdb.pyR&scsfd}|S(Ncs|djodSt|to|Sidjo|idSidjo|idStidifdS(NREs%Y%m%dRGs%Y-%m-%ds%datetimeformat '%s' is not supported.(R!R(RHRIRKRRL(R*(R+(s>/usr/lib/python2.6/site-packages/sqlalchemy/databases/maxdb.pyR,s ((RR+R,((R+s>/usr/lib/python2.6/site-packages/sqlalchemy/databases/maxdb.pyR-s csfd}|S(Nc s|djodSidjoMtig}|dd!|dd!|dd!fD]}|t|qQ~SidjoMtig}|dd!|dd!|dd !fD]}|t|q~Stid ifdS( NREiiiiRGiii s%datetimeformat '%s' is not supported.(R!RIRNtdateRORRL(R*RPRQRR(R+(s>/usr/lib/python2.6/site-packages/sqlalchemy/databases/maxdb.pyR, s GG((RR+R,((R+s>/usr/lib/python2.6/site-packages/sqlalchemy/databases/maxdb.pyR5s (R6R7R&R-R5(((s>/usr/lib/python2.6/site-packages/sqlalchemy/databases/maxdb.pyRs  cBs#eZdZdZdZRS(cCsdS(NtTIME((R((s>/usr/lib/python2.6/site-packages/sqlalchemy/databases/maxdb.pyR&scsfd}|S(Ncs|djodSt|to|Sidjo|idSidjo|idStidifdS(NREs%H%M%SRGs%H-%M-%Ss%datetimeformat '%s' is not supported.(R!R(RHRIRKRRL(R*(R+(s>/usr/lib/python2.6/site-packages/sqlalchemy/databases/maxdb.pyR,s ((RR+R,((R+s>/usr/lib/python2.6/site-packages/sqlalchemy/databases/maxdb.pyR-s csfd}|S(Nc s|djodSidjoStig}|dd!|dd!|dd!fD]}|t|qQ~}|SidjoMtig}|dd!|dd!|dd !fD]}|t|q~Stid ifdS( NREiiiiRGiii s%datetimeformat '%s' is not supported.(R!RIRNttimeRORRL(R*RPRQttRR(R+(s>/usr/lib/python2.6/site-packages/sqlalchemy/databases/maxdb.pyR,.s HG((RR+R,((R+s>/usr/lib/python2.6/site-packages/sqlalchemy/databases/maxdb.pyR5-s(R6R7R&R-R5(((s>/usr/lib/python2.6/site-packages/sqlalchemy/databases/maxdb.pyRs  cBseZdZRS(cCsdS(NtBOOLEAN((R((s>/usr/lib/python2.6/site-packages/sqlalchemy/databases/maxdb.pyR&@s(R6R7R&(((s>/usr/lib/python2.6/site-packages/sqlalchemy/databases/maxdb.pyR?scBs#eZdZdZdZRS(cCsdS(Ns LONG BYTE((R((s>/usr/lib/python2.6/site-packages/sqlalchemy/databases/maxdb.pyR&EscCs d}|S(NcSs |djodSt|SdS(N(R!R0(R*((s>/usr/lib/python2.6/site-packages/sqlalchemy/databases/maxdb.pyR,Is ((RR+R,((s>/usr/lib/python2.6/site-packages/sqlalchemy/databases/maxdb.pyR-Hs cCs d}|S(NcSs)|djodS|i|iSdS(N(R!R.R4(R*((s>/usr/lib/python2.6/site-packages/sqlalchemy/databases/maxdb.pyR,Qs ((RR+R,((s>/usr/lib/python2.6/site-packages/sqlalchemy/databases/maxdb.pyR5Ps (R6R7R&R-R5(((s>/usr/lib/python2.6/site-packages/sqlalchemy/databases/maxdb.pyRDs  tbooleantchart characterRTtfixedtfloatROtintegers long binarys long unicodetlongtsmallintRVt timestamptvarchartMaxDBExecutionContextcBseZdZdZRS(cCs||iioX|i oM|iii}t|\}}|o!|ii p|i p|i|djo|i od|ii i |}nd|ii i |}|i i io|i i ii|n|ii|}|id}|i i io|i i ii|gn|ip dgt|ii|_n||i|/usr/lib/python2.6/site-packages/sqlalchemy/databases/maxdb.pyR{s*    cCsW|iidj o7x4|iiD]"}|ddjo t|Sq Wnti|S(Nis Long BinarytLongs Long Unicode(s Long BinaryRs Long Unicode(Rst descriptionR!tMaxDBResultProxyt engine_baset ResultProxy(Rtcolumn((s>/usr/lib/python2.6/site-packages/sqlalchemy/databases/maxdb.pytget_result_proxys  (R6R7R{R(((s>/usr/lib/python2.6/site-packages/sqlalchemy/databases/maxdb.pyRcs !tMaxDBCachedColumnRowcBsMeZdZdZdZdZdZdZdZdZ RS(s<A RowProxy that only runs result_processors once per column.cCs8tt|i||h|_||_||_dS(N(RRRRzt_rowt_parent(Rtparenttrow((s>/usr/lib/python2.6/site-packages/sqlalchemy/databases/maxdb.pyRs  cCs>||ijo#|ii|i||i|/usr/lib/python2.6/site-packages/sqlalchemy/databases/maxdb.pyRs#ccs2x+tt|iD]}|i|VqWdS(N(txrangeRxRR(Rti((s>/usr/lib/python2.6/site-packages/sqlalchemy/databases/maxdb.pyt__iter__scCstt|S(N(treprtlist(R((s>/usr/lib/python2.6/site-packages/sqlalchemy/databases/maxdb.pyt__repr__scCsP||jpC|tg}tt|iD]}||i|q-~jS(N(ttupleRRxRR(RtotherRPR((s>/usr/lib/python2.6/site-packages/sqlalchemy/databases/maxdb.pyt__eq__s  cCsnt|toM|it|i}tg}t|D]}||i|q<~S|i|SdS(N(R(tslicetindicesRxRRRR(RRRRPR((s>/usr/lib/python2.6/site-packages/sqlalchemy/databases/maxdb.pyt __getitem__s5cCs7y|i|SWntj ot|nXdS(N(RtKeyErrortAttributeError(Rtname((s>/usr/lib/python2.6/site-packages/sqlalchemy/databases/maxdb.pyt __getattr__s( R6R7RBRRRRRRR(((s>/usr/lib/python2.6/site-packages/sqlalchemy/databases/maxdb.pyRs      RcBseZeZRS((R6R7Rt _process_row(((s>/usr/lib/python2.6/site-packages/sqlalchemy/databases/maxdb.pyRst MaxDBDialectcBseZdZeZeZdZeZeZ eZ dZ edZ dZ ee Z dZdZddZdZd Zdd Zd Zd Zd ZRS(tmaxdbi REcKstt|i|||_|idjo h|_nmh td6td6td6t d6t d6t d6t t i 6t t i 6t t i6|_dS(Ns Long Binarys Long byte_ts Long Unicodet TimestamptDatetTime(RRRt _raise_knowntdbapiR!tdbapi_type_mapRRRRRRNRTRV(Rt_raise_known_sql_errorsR((s>/usr/lib/python2.6/site-packages/sqlalchemy/databases/maxdb.pyRs          cCsddkl}|S(Ni(R(tsapdbR(tclst_dbapi((s>/usr/lib/python2.6/site-packages/sqlalchemy/databases/maxdb.pyRscCs,|idd}|i|ig|fS(Ntusernametuser(ttranslate_connect_argstupdatetquery(Rturltopts((s>/usr/lib/python2.6/site-packages/sqlalchemy/databases/maxdb.pytcreate_connect_argsscCsRt|to |}nt|tio|itSti|tSdS(N(R(ttypetsqltypestUnicodetadaptR t adapt_typetcolspecs(Rttypeobj((s>/usr/lib/python2.6/site-packages/sqlalchemy/databases/maxdb.pyttype_descriptors  cCs@|i||}t|to|dj o ||_ndS(N(RtR(ROR!t _rowcount(RRsRgt parameterstcontexttres((s>/usr/lib/python2.6/site-packages/sqlalchemy/databases/maxdb.pyt do_executescCsdS(N((RRnR((s>/usr/lib/python2.6/site-packages/sqlalchemy/databases/maxdb.pytdo_release_savepoint scCsPy |iSWn>tj o2|ii|idi}||_|SXdS(NsSELECT CURRENT_SCHEMA FROM DUAL(t_default_schema_nameRtidentifier_preparert_normalize_nameRttscalar(RRnR((s>/usr/lib/python2.6/site-packages/sqlalchemy/databases/maxdb.pytget_default_schema_names   c Cs}|ii}||g}|djo d}nd}|i|||i||}t|i}|i|S(Ns\SELECT tablename FROM TABLES WHERE TABLES.TABLENAME=? AND TABLES.SCHEMANAME=CURRENT_SCHEMA sQSELECT tablename FROM TABLES WHERE TABLES.TABLENAME = ? AND TABLES.SCHEMANAME=? (Rt_denormalize_nameR!tappendRttboolRutclose( RRnt table_nameRt denormalizetbindRtrptfound((s>/usr/lib/python2.6/site-packages/sqlalchemy/databases/maxdb.pyt has_tables    c Cs|djod}|i|}n+d}|ii|}|i||}|ii}g}|D]}|||dqg~S(Ns? SELECT TABLENAME FROM TABLES WHERE SCHEMANAME=CURRENT_SCHEMA s2 SELECT TABLENAME FROM TABLES WHERE SCHEMANAME=? i(R!RtRRR( RRnRRR~t matchnamet normalizeRPR((s>/usr/lib/python2.6/site-packages/sqlalchemy/databases/maxdb.pyt table_names.s  c*Cs|ii}|ii}d}d}||ig}|ip|d}|d}n+|d}|d}|i||i|i||i} | pti |i nt |pg}xu| D]m} | \ } } } }}}}}}|| } |o| |joqngh}}| djoM||f}|djo0|dj o#|i dod} |f}qnZ| d jo |f}n@| d%jo|f}||d |dj o0titid|idd|d/usr/lib/python2.6/site-packages/sqlalchemy/databases/maxdb.pytst.t REFSCHEMANAMEt REFTABLENAMEt REFCOLUMNNAMERsDELETE itondeleteRtautoloadt autoload_witht link_to_name(sCHARsVARCHAR(s REFSCHEMANAMEs REFTABLENAMER(s REFTABLENAMER(.RRRRRRRttfetchallRtNoSuchTableErrortfullnametsetR!t startswitht ischema_namestlowerRRtwarnRtNullTypetFalseR/t DefaultClauseRttexttreplacet append_columntColumnt itertoolstgroupbyRt COLUMNNAMEt_maybe_quote_identifiert in_schemaR#tRULERt_get_table_keyRtgettmetadatattablestTabletForeignKeyConstrainttappend_constraint(*RRnRhtinclude_columnsRRtsttfktparamstrowsRRtmodetcol_typeRRR?Rt constant_deftfunc_deft type_argsttype_kwttype_clst type_instancetcol_kwtfk_setstfkeynametfkeyRPtrtkey_colsRzt referantstquoteRRtct_[3]t constraint_kwtrulettable_kwtref_keyt constraint((s>/usr/lib/python2.6/site-packages/sqlalchemy/databases/maxdb.pyt reflecttable;s      !                $    *     2 2     cCsJ|ii}d}|i|||}t|i}|i|S(Ns:SELECT sequence_name FROM SEQUENCES WHERE SEQUENCE_NAME=? (RRRtRRuR(RRnRRRRR((s>/usr/lib/python2.6/site-packages/sqlalchemy/databases/maxdb.pyt has_sequences   N(R6R7RR/tsupports_altertsupports_unicode_statementstmax_identifier_lengthtsupports_sane_rowcountRtsupports_sane_multi_rowcounttpreexecute_pk_sequencesRIRRt classmethodRRR!RRRRRRR (((s>/usr/lib/python2.6/site-packages/sqlalchemy/databases/maxdb.pyRs(        t MaxDBCompilercBseZeiiiZdeei/usr/lib/python2.6/site-packages/sqlalchemy/databases/maxdb.pyRsRSt CURRENT_DATERUt CURRENT_TIMERDtCURRENT_TIMESTAMPRtFALSEtSYSDBAtTIMEZONEt TRANSACTIONtTRUEtUSERtUIDt USERGROUPtUTCDATEtUTCDIFFcCsdS(Ns FROM DUAL((R((s>/usr/lib/python2.6/site-packages/sqlalchemy/databases/maxdb.pyt default_fromscCs|i}|tjodS|djodS|djodS|djodS|djodSt|tod |iS|pdSdSdS( Ns WITH LOCK EXCLUSIVEtR.s WITH LOCKtignores WITH LOCK (IGNORE) EXCLUSIVEtnowaits WITH LOCK (NOWAIT) EXCLUSIVEs WITH LOCK %s(t for_updateR/R!R(RHR$(Rtselecttclause((s>/usr/lib/python2.6/site-packages/sqlalchemy/databases/maxdb.pytfor_update_clauses       cCs5|ii|ijot|idjStSdS(Ni(RR$tbare_functionsRxtclausesR/(Rtfunc((s>/usr/lib/python2.6/site-packages/sqlalchemy/databases/maxdb.pytapply_function_parensscKsW|ii|iid}|o|i}||_ntt|i||S(N( tfunction_conversionRRR$R!t_cloneRR(tvisit_function(RtfnRt transform((s>/usr/lib/python2.6/site-packages/sqlalchemy/databases/maxdb.pyRFs   cKsst|ititifod|i|iSt|itiod|i|iS|i|iSdS(NsNUM(%s)sCHR(%s)(R(RRtIntegertNumericR,R>tString(Rtcasttkwargs((s>/usr/lib/python2.6/site-packages/sqlalchemy/databases/maxdb.pyt visit_casts cCs*|iodS|iii|dSdS(Ns.NEXTVAL(toptionalR!R+Rtformat_sequence(Rtsequence((s>/usr/lib/python2.6/site-packages/sqlalchemy/databases/maxdb.pytvisit_sequences t ColumnSnaggercBseZdZdZRS(cCsd|_d|_dS(Ni(tcountR!R(R((s>/usr/lib/python2.6/site-packages/sqlalchemy/databases/maxdb.pyRs cCs||_|id7_dS(Ni(RRT(RR((s>/usr/lib/python2.6/site-packages/sqlalchemy/databases/maxdb.pyt visit_columns (R6R7RRU(((s>/usr/lib/python2.6/site-packages/sqlalchemy/databases/maxdb.pyRSs cCsh}x|D]}t|toq n|i}|i||idjoRt|tio|i|t|i /usr/lib/python2.6/site-packages/sqlalchemy/databases/maxdb.pyt_find_labeled_columnss  "cCs|i|i}|ot|dtot|i|i|i}|oQxN|iD]<}ti dti |}|i d|||}qXWqn|o;|i o%|i otidqdSnd|SdSdS(Nt _distincts(^| )(%s)(,| |$)s\1%s\3s-MaxDB does not support ORDER BY in subqueriesR9s ORDER BY (R,t_order_by_clauseRJRR]t inner_columnsRZtkeystretcompiletescapetsubt is_subqueryt_limitRRL(RR=torder_byR[t needs_aliasR((s>/usr/lib/python2.6/site-packages/sqlalchemy/databases/maxdb.pytorder_by_clause,s&        cCsd|iodpd}|io<|io2|iotidn|d|i7}n|S(Ns DISTINCT R9s,MaxDB does not support LIMIT with an offset.sTOP %s (R^RfRgt_offsetRRL(RR=R((s>/usr/lib/python2.6/site-packages/sqlalchemy/databases/maxdb.pytget_select_precolumnsJs  cCsA|iodS|iotidnd|ifSdS(NR9s,MaxDB does not support LIMIT with an offset.s LIMIT %s(RfRkRRLRg(RR=((s>/usr/lib/python2.6/site-packages/sqlalchemy/databases/maxdb.pyt limit_clauseTs    cCst|_t|_|i|}x?|iphiD]'}t|tiot |_Pq8q8Wdi d|i i |i ddi g}|D]}||i i|dq~ddi g}|D]}||dq~dfS( NR9s INSERT INTO s (s, is ) VALUES (it)(R/ReRjt_get_colparamsRt itervaluesR(RWtFunctionRR#RlRmRht format_column(Rtinsertt colparamsR*RPRRR((s>/usr/lib/python2.6/site-packages/sqlalchemy/databases/maxdb.pyt visit_insert`s       *+(R6R7RtDefaultCompilerRtcopyt sql_operatorstmodRDRR@R8R?RCRFRNRRRt ClauseVisitorRSRR]RjRlRmRu(((s>/usr/lib/python2.6/site-packages/sqlalchemy/databases/maxdb.pyR(s,         tMaxDBDefaultRunnercBseZdZRS(cCs/|iodS|id|iii|S(NsSELECT %s.NEXTVAL FROM DUAL(ROR!texecute_stringR+RRP(Rtseq((s>/usr/lib/python2.6/site-packages/sqlalchemy/databases/maxdb.pyRRus  (R6R7RR(((s>/usr/lib/python2.6/site-packages/sqlalchemy/databases/maxdb.pyR{tstMaxDBIdentifierPreparercBseZedddddddddd d d d d ddddddddddddddddddd d!d"d#d$d%d&d'd(d)d*d+d,d-d.d/d0d1d2d3d4d5d6d7d8d9d:d;d<d=d>d?d@dAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd[d\d]d^d_d`dadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzd{d|d}d~dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddgZdZdZdZRS(tabstabsolutetacostadddatetaddtimetalltalphataltertanytasciitasintatantatan2tavgtbinarytbitRYtbytetcasetceiltceilingRZR[tchecktchrRtconcatRtcostcoshtcotRTtcrosstcurdatetcurrenttcurtimetdatabaseRTtdatedifftdaytdaynamet dayofmontht dayofweekt dayofyeartdectdecimalR2R tdegreestdeletetdigitstdistincttdoubletexcepttexiststexptexpandtfirstR\R]tfloortfortfromtfulltget_objectnamet get_schematgraphictgreatesttgroupthavingthexthextorawthourtifnullR:R|tinitcaptinnerRsROR^REt intersecttintoR#RtlasttlcasetleasttleftRtlfillRtlntlocatetlogtlog10R_tlongfileRtlpadtltrimtmakedatetmaketimetmapchartmaxtmbcsRFtmintminuteRytmontht monthnametnaturaltnchartnexttnotnoroundtnottnowtnulltnumtnumerictobjecttoftontordertpackedtpitpowertprevtprimarytradianstrealtrejecttrelativeRtrfilltrighttroundtrowidtrownotrpadtrtrimtsecondR=tselupdtserialRtshowtsigntsintsinhR`tsometsoundextspacetsqrttstampt statisticststddevtsubdatetsubstrt substringtsubtimetsumtsysdbaRhttanttanhRVttimediffRattimezonettot toidentifiert transactiont translatettrimttruncttruncatetucasetuidR'tunionRR$Rt usergrouptusingtutcdatetutcdiffR*tvaluesRbt vargraphictvariancetweekt weekofyeartwhentwheretwithtyeartzonedcCsH|djodS|io%|i}|i|p|Sn|S(N(R!tisupperRt_requires_quotes(RRtlc_name((s>/usr/lib/python2.6/site-packages/sqlalchemy/databases/maxdb.pyRs    cCsC|djodS|io|i| o |iS|SdS(N(R!tislowerR&R$(RR((s>/usr/lib/python2.6/site-packages/sqlalchemy/databases/maxdb.pyRs    cCs&|i|o|i|S|SdS(N(R&tquote_identifier(RR((s>/usr/lib/python2.6/site-packages/sqlalchemy/databases/maxdb.pyRs(R6R7Rtreserved_wordsRRR(((s>/usr/lib/python2.6/site-packages/sqlalchemy/databases/maxdb.pyR~|sD tMaxDBSchemaGeneratorcBs#eZdZdZdZRS(c Ks|ii||ii|iig}|ip|idn|i}|i |}|o"t |t i o|i on|dj o|id|n|io|ioyg}|iiiD]\}|ioLt |itip t |ito|iio|i o ||qq~id}||jo|idnWq}tj oq}Xndi|S(NsNOT NULLs DEFAULT %sisDEFAULT SERIALR (RlRrRt dialect_implR+R&RRR tget_column_default_stringR(RtSequenceROR!RyRRhRzRRIRR@t foreign_keystpopt IndexErrorR#( RRRtcolspecR t default_strRPRR((s>/usr/lib/python2.6/site-packages/sqlalchemy/databases/maxdb.pytget_column_specifications0      (  cCst|itioot|iito9t|iti ot |iiSd|iiSqt |i |iidSndSdS(Ns'%s'(R(RRRR targRHRRRIR0R't_compileR!(RR((s>/usr/lib/python2.6/site-packages/sqlalchemy/databases/maxdb.pyR-s cCsV|i oG|i p|ii|i|i od|ii|g}d|_|idj o |i dt |ifn|i dj o |i dt |i fnt g}|iiD]=}|dido#||ddi|dfqq~}d|jo!|i d t |dfn%|id to|id nd |jo!|i d t |d fn%|idto|idn|idto|idnd|jo!|i dt |dfn%|idto|idn|idi||indS(sCreates a SEQUENCE. TODO: move to module doc? start With an integer value, set the START WITH option. increment An integer value to increment by. Default is the database default. maxdb_minvalue maxdb_maxvalue With an integer value, sets the corresponding sequence option. maxdb_no_minvalue maxdb_no_maxvalue Defaults to False. If true, sets the corresponding sequence option. maxdb_cycle Defaults to False. If true, sets the CYCLE option. maxdb_cache With an integer value, sets the CACHE option. maxdb_no_cache Defaults to False. If true, sets NOCACHE. sCREATE SEQUENCEis INCREMENT BYs START WITHitmaxdb_itmaxvaluetMAXVALUEt no_maxvaluet NOMAXVALUEtminvaluetMINVALUEt no_minvaluet NOMINVALUEtcycletCYCLEtcachetCACHEtno_cachetNOCACHER N(ROt checkfirstR+R RnRRlRPt incrementR!textendR0tstarttdictRMtitemsRRRRRR#Rt(RRQtddlRPtpairR((s>/usr/lib/python2.6/site-packages/sqlalchemy/databases/maxdb.pyRRs:      C ! ! !(R6R7R4R-RR(((s>/usr/lib/python2.6/site-packages/sqlalchemy/databases/maxdb.pyR+s $ tMaxDBSchemaDroppercBseZdZRS(cCsa|i oR|i p|ii|i|io+|id|ii||i ndS(NsDROP SEQUENCE %s( RORFR+R RnRRRlRPRt(RRQ((s>/usr/lib/python2.6/site-packages/sqlalchemy/databases/maxdb.pyRR-s    (R6R7RR(((s>/usr/lib/python2.6/site-packages/sqlalchemy/databases/maxdb.pyRN,scCsxt|iiD]\}}t|ititifor|ioht|i t i o|i i o ||fSq|i djpt|it i o ||fSqqWdS(s=Finds the effective DEFAULT SERIAL column of a Table, if any.N(NN(t enumerateRyRzR(RRRIRJRR RR.ROR!RR(RhR|tcol((s>/usr/lib/python2.6/site-packages/sqlalchemy/databases/maxdb.pyRi6s   (PRBRNRRbt sqlalchemyRRRRtsqlalchemy.sqlRRxRRWRRtsqlalchemy.engineRRR R Rt__all__RKRR R R RRIRRRJRtFloatRtDateTimeRRRRRtBooleanRtBinaryRt SmallintegertTextR:RDtBLOBRRRtDefaultExecutionContextRctRowProxyRRRtDefaultDialectRRvR(t DefaultRunnerR{tIdentifierPreparerR~tSchemaGeneratorR+t SchemaDropperRNRiR+Rltstatement_compilertschemageneratort schemadroppert defaultrunnertexecution_ctx_cls(((s>/usr/lib/python2.6/site-packages/sqlalchemy/databases/maxdb.pyt:s$" 2 -%&                *':v