1 | from .._compat import basestring |
---|
2 | from ..adapters.db2 import DB2 |
---|
3 | from .base import SQLDialect |
---|
4 | from . import dialects, sqltype_for |
---|
5 | |
---|
6 | |
---|
7 | @dialects.register_for(DB2) |
---|
8 | class DB2Dialect(SQLDialect): |
---|
9 | @sqltype_for("text") |
---|
10 | def type_text(self): |
---|
11 | return "CLOB" |
---|
12 | |
---|
13 | @sqltype_for("integer") |
---|
14 | def type_integer(self): |
---|
15 | return "INT" |
---|
16 | |
---|
17 | @sqltype_for("bigint") |
---|
18 | def type_bigint(self): |
---|
19 | return "BIGINT" |
---|
20 | |
---|
21 | @sqltype_for("float") |
---|
22 | def type_float(self): |
---|
23 | return "REAL" |
---|
24 | |
---|
25 | @sqltype_for("id") |
---|
26 | def type_id(self): |
---|
27 | return "INT GENERATED ALWAYS AS IDENTITY PRIMARY KEY NOT NULL" |
---|
28 | |
---|
29 | @sqltype_for("big-id") |
---|
30 | def type_big_id(self): |
---|
31 | return "BIGINT GENERATED ALWAYS AS IDENTITY PRIMARY KEY NOT NULL" |
---|
32 | |
---|
33 | @sqltype_for("reference") |
---|
34 | def type_reference(self): |
---|
35 | return ( |
---|
36 | "INT, FOREIGN KEY (%(field_name)s) REFERENCES " |
---|
37 | + "%(foreign_key)s ON DELETE %(on_delete_action)s" |
---|
38 | ) |
---|
39 | |
---|
40 | @sqltype_for("big-reference") |
---|
41 | def type_big_reference(self): |
---|
42 | return ( |
---|
43 | "BIGINT, FOREIGN KEY (%(field_name)s) REFERENCES " |
---|
44 | + "%(foreign_key)s ON DELETE %(on_delete_action)s" |
---|
45 | ) |
---|
46 | |
---|
47 | @sqltype_for("reference FK") |
---|
48 | def type_reference_fk(self): |
---|
49 | return ( |
---|
50 | ", CONSTRAINT FK_%(constraint_name)s FOREIGN KEY " |
---|
51 | + "(%(field_name)s) REFERENCES %(foreign_key)s " |
---|
52 | + "ON DELETE %(on_delete_action)s" |
---|
53 | ) |
---|
54 | |
---|
55 | @sqltype_for("reference TFK") |
---|
56 | def type_reference_tfk(self): |
---|
57 | return ( |
---|
58 | " CONSTRAINT FK_%(constraint_name)s_PK FOREIGN KEY " |
---|
59 | + "(%(field_name)s) REFERENCES %(foreign_table)s" |
---|
60 | + "(%(foreign_key)s) ON DELETE %(on_delete_action)s" |
---|
61 | ) |
---|
62 | |
---|
63 | def left_join(self, val, query_env={}): |
---|
64 | # Left join must always have an ON clause |
---|
65 | if not isinstance(val, basestring): |
---|
66 | val = self.expand(val, query_env=query_env) |
---|
67 | return "LEFT OUTER JOIN %s" % val |
---|
68 | |
---|
69 | @property |
---|
70 | def random(self): |
---|
71 | return "RAND()" |
---|
72 | |
---|
73 | def select( |
---|
74 | self, |
---|
75 | fields, |
---|
76 | tables, |
---|
77 | where=None, |
---|
78 | groupby=None, |
---|
79 | having=None, |
---|
80 | orderby=None, |
---|
81 | limitby=None, |
---|
82 | distinct=False, |
---|
83 | for_update=False, |
---|
84 | ): |
---|
85 | dst, whr, grp, order, limit, offset, upd = "", "", "", "", "", "", "" |
---|
86 | if distinct is True: |
---|
87 | dst = " DISTINCT" |
---|
88 | elif distinct: |
---|
89 | dst = " DISTINCT ON (%s)" % distinct |
---|
90 | if where: |
---|
91 | whr = " %s" % self.where(where) |
---|
92 | if groupby: |
---|
93 | grp = " GROUP BY %s" % groupby |
---|
94 | if having: |
---|
95 | grp += " HAVING %s" % having |
---|
96 | if orderby: |
---|
97 | order = " ORDER BY %s" % orderby |
---|
98 | if limitby: |
---|
99 | (lmin, lmax) = limitby |
---|
100 | limit = " FETCH FIRST %i ROWS ONLY" % lmax |
---|
101 | if for_update: |
---|
102 | upd = " FOR UPDATE" |
---|
103 | return "SELECT%s %s FROM %s%s%s%s%s%s%s;" % ( |
---|
104 | dst, |
---|
105 | fields, |
---|
106 | tables, |
---|
107 | whr, |
---|
108 | grp, |
---|
109 | order, |
---|
110 | limit, |
---|
111 | offset, |
---|
112 | upd, |
---|
113 | ) |
---|