from .._compat import basestring from ..adapters.ingres import Ingres, IngresUnicode from .base import SQLDialect from . import dialects, sqltype_for @dialects.register_for(Ingres) class IngresDialect(SQLDialect): SEQNAME = "ii***lineitemsequence" @sqltype_for("text") def type_text(self): return "CLOB" @sqltype_for("integer") def type_integer(self): return "INTEGER4" @sqltype_for("bigint") def type_bigint(self): return "BIGINT" @sqltype_for("double") def type_float(self): return "FLOAT8" @sqltype_for("date") def type_date(self): return "ANSIDATE" @sqltype_for("time") def type_time(self): return "TIME WITHOUT TIME ZONE" @sqltype_for("datetime") def type_datetime(self): return "TIMESTAMP WITHOUT TIME ZONE" @sqltype_for("id") def type_id(self): return ( "int not null unique with default next value for %s" % self.INGRES_SEQNAME ) @sqltype_for("big-id") def type_big_id(self): return ( "bigint not null unique with default next value for %s" % self.INGRES_SEQNAME ) @sqltype_for("reference") def type_reference(self): return ( "INT, FOREIGN KEY (%(field_name)s) REFERENCES " + "%(foreign_key)s ON DELETE %(on_delete_action)s" ) @sqltype_for("big-reference") def type_big_reference(self): return ( "BIGINT, FOREIGN KEY (%(field_name)s) REFERENCES " + "%(foreign_key)s ON DELETE %(on_delete_action)s" ) @sqltype_for("reference FK") def type_reference_fk(self): return ( ", CONSTRAINT FK_%(constraint_name)s FOREIGN KEY " + "(%(field_name)s) REFERENCES %(foreign_key)s " + "ON DELETE %(on_delete_action)s" ) @sqltype_for("reference TFK") def type_reference_tfk(self): return ( " CONSTRAINT FK_%(constraint_name)s_PK FOREIGN KEY " + "(%(field_name)s) REFERENCES %(foreign_table)s" + "(%(foreign_key)s) ON DELETE %(on_delete_action)s" ) def left_join(self, val, query_env={}): # Left join must always have an ON clause if not isinstance(val, basestring): val = self.expand(val, query_env=query_env) return "LEFT OUTER JOIN %s" % val @property def random(self): return "RANDOM()" def select( self, fields, tables, where=None, groupby=None, having=None, orderby=None, limitby=None, distinct=False, for_update=False, ): dst, whr, grp, order, limit, offset, upd = "", "", "", "", "", "", "" if distinct is True: dst = " DISTINCT" elif distinct: dst = " DISTINCT ON (%s)" % distinct if where: whr = " %s" % self.where(where) if groupby: grp = " GROUP BY %s" % groupby if having: grp += " HAVING %s" % having if orderby: order = " ORDER BY %s" % orderby if limitby: (lmin, lmax) = limitby fetch_amt = lmax - lmin if fetch_amt: limit = " FIRST %i" % fetch_amt if lmin: offset = " OFFSET %i" % lmin if for_update: upd = " FOR UPDATE" return "SELECT%s%S %s FROM %s%s%s%s%s%s;" % ( dst, limit, fields, tables, whr, grp, order, offset, upd, ) @dialects.register_for(IngresUnicode) class IngresUnicodeDialect(IngresDialect): @sqltype_for("string") def type_string(self): return "NVARCHAR(%(length)s)" @sqltype_for("text") def type_text(self): return "NCLOB"