velocity-python 0.0.30__py3-none-any.whl → 0.0.32__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of velocity-python might be problematic. Click here for more details.
- velocity/__init__.py +1 -1
- velocity/aws/__init__.py +4 -8
- velocity/aws/handlers/response.py +203 -52
- velocity/db/core/column.py +31 -20
- velocity/db/core/database.py +9 -9
- velocity/db/core/engine.py +101 -99
- velocity/db/core/exceptions.py +23 -0
- velocity/db/core/sequence.py +11 -3
- velocity/db/servers/mysql.py +580 -282
- velocity/db/servers/sqlite.py +649 -371
- velocity/db/servers/sqlserver.py +746 -331
- velocity/misc/conv/__init__.py +1 -1
- velocity/misc/conv/iconv.py +106 -143
- velocity/misc/conv/oconv.py +128 -162
- velocity/misc/db.py +25 -19
- velocity/misc/export.py +125 -115
- velocity/misc/format.py +57 -59
- velocity/misc/mail.py +51 -40
- velocity/misc/merge.py +34 -17
- velocity/misc/timer.py +35 -12
- {velocity_python-0.0.30.dist-info → velocity_python-0.0.32.dist-info}/METADATA +1 -1
- velocity_python-0.0.32.dist-info/RECORD +39 -0
- {velocity_python-0.0.30.dist-info → velocity_python-0.0.32.dist-info}/WHEEL +1 -1
- velocity_python-0.0.30.dist-info/RECORD +0 -39
- {velocity_python-0.0.30.dist-info → velocity_python-0.0.32.dist-info}/LICENSE +0 -0
- {velocity_python-0.0.30.dist-info → velocity_python-0.0.32.dist-info}/top_level.txt +0 -0
velocity/db/servers/mysql.py
CHANGED
|
@@ -4,95 +4,102 @@ import decimal
|
|
|
4
4
|
import datetime
|
|
5
5
|
from velocity.db import exceptions
|
|
6
6
|
|
|
7
|
+
|
|
7
8
|
def initialize(config):
|
|
8
9
|
from velocity.db.core.engine import Engine
|
|
9
10
|
import mysql.connector
|
|
11
|
+
|
|
10
12
|
return Engine(mysql.connector, config, SQL)
|
|
11
13
|
|
|
14
|
+
|
|
12
15
|
def make_where(where, sql, vals, is_join=False):
|
|
13
16
|
if not where:
|
|
14
17
|
return
|
|
15
|
-
sql.append(
|
|
18
|
+
sql.append("WHERE")
|
|
16
19
|
if isinstance(where, str):
|
|
17
20
|
sql.append(where)
|
|
18
21
|
return
|
|
19
|
-
if isinstance(where,dict):
|
|
22
|
+
if isinstance(where, dict):
|
|
20
23
|
where = where.items()
|
|
21
|
-
if isinstance(where,list):
|
|
22
|
-
join =
|
|
23
|
-
for key,val in where:
|
|
24
|
-
if join:
|
|
24
|
+
if isinstance(where, list):
|
|
25
|
+
join = ""
|
|
26
|
+
for key, val in where:
|
|
27
|
+
if join:
|
|
28
|
+
sql.append(join)
|
|
25
29
|
if is_join:
|
|
26
|
-
if
|
|
27
|
-
key =
|
|
30
|
+
if "." not in key:
|
|
31
|
+
key = "A." + key
|
|
28
32
|
if val == None:
|
|
29
|
-
if
|
|
30
|
-
key = key.replace(
|
|
31
|
-
sql.append(
|
|
33
|
+
if "!" in key:
|
|
34
|
+
key = key.replace("!", "")
|
|
35
|
+
sql.append("{} is not NULL".format(quote(key.lower())))
|
|
32
36
|
else:
|
|
33
|
-
sql.append(
|
|
34
|
-
elif isinstance(val,(list,tuple)):
|
|
35
|
-
if
|
|
36
|
-
key = key.replace(
|
|
37
|
-
sql.append(
|
|
37
|
+
sql.append("{} is NULL".format(quote(key.lower())))
|
|
38
|
+
elif isinstance(val, (list, tuple)):
|
|
39
|
+
if "!" in key:
|
|
40
|
+
key = key.replace("!", "")
|
|
41
|
+
sql.append("{} not in %s".format(quote(key.lower())))
|
|
38
42
|
vals.append(tuple(val))
|
|
39
43
|
else:
|
|
40
|
-
sql.append(
|
|
44
|
+
sql.append("{} in %s".format(quote(key.lower())))
|
|
41
45
|
vals.append(tuple(val))
|
|
42
46
|
else:
|
|
43
|
-
if
|
|
44
|
-
key = key.replace(
|
|
45
|
-
op =
|
|
46
|
-
elif
|
|
47
|
-
key = key.replace(
|
|
48
|
-
op =
|
|
49
|
-
elif
|
|
50
|
-
key = key.replace(
|
|
51
|
-
op =
|
|
52
|
-
elif
|
|
53
|
-
key = key.replace(
|
|
54
|
-
op =
|
|
55
|
-
elif
|
|
56
|
-
key = key.replace(
|
|
57
|
-
op =
|
|
58
|
-
elif
|
|
59
|
-
key = key.replace(
|
|
60
|
-
op =
|
|
61
|
-
elif
|
|
62
|
-
key = key.replace(
|
|
63
|
-
op =
|
|
64
|
-
elif
|
|
65
|
-
key = key.replace(
|
|
66
|
-
op =
|
|
67
|
-
elif
|
|
68
|
-
key = key.replace(
|
|
69
|
-
op =
|
|
70
|
-
elif
|
|
71
|
-
key = key.replace(
|
|
72
|
-
op =
|
|
73
|
-
elif
|
|
74
|
-
key = key.replace(
|
|
75
|
-
op =
|
|
76
|
-
elif
|
|
77
|
-
key = key.replace(
|
|
78
|
-
op =
|
|
79
|
-
elif
|
|
80
|
-
key = key.replace(
|
|
81
|
-
op =
|
|
82
|
-
elif
|
|
83
|
-
key = key.replace(
|
|
84
|
-
op =
|
|
47
|
+
if "<>" in key:
|
|
48
|
+
key = key.replace("<>", "")
|
|
49
|
+
op = "<>"
|
|
50
|
+
elif "!=" in key:
|
|
51
|
+
key = key.replace("!=", "")
|
|
52
|
+
op = "<>"
|
|
53
|
+
elif "!%" in key:
|
|
54
|
+
key = key.replace("!%", "")
|
|
55
|
+
op = "not like"
|
|
56
|
+
elif "%%" in key:
|
|
57
|
+
key = key.replace("%%", "")
|
|
58
|
+
op = "%"
|
|
59
|
+
elif "%>" in key:
|
|
60
|
+
key = key.replace("%>", "")
|
|
61
|
+
op = "%>"
|
|
62
|
+
elif "<%" in key:
|
|
63
|
+
key = key.replace("<%", "")
|
|
64
|
+
op = "<%"
|
|
65
|
+
elif "==" in key:
|
|
66
|
+
key = key.replace("==", "")
|
|
67
|
+
op = "="
|
|
68
|
+
elif "<=" in key:
|
|
69
|
+
key = key.replace("<=", "")
|
|
70
|
+
op = "<="
|
|
71
|
+
elif ">=" in key:
|
|
72
|
+
key = key.replace(">=", "")
|
|
73
|
+
op = ">="
|
|
74
|
+
elif "<" in key:
|
|
75
|
+
key = key.replace("<", "")
|
|
76
|
+
op = "<"
|
|
77
|
+
elif ">" in key:
|
|
78
|
+
key = key.replace(">", "")
|
|
79
|
+
op = ">"
|
|
80
|
+
elif "%" in key:
|
|
81
|
+
key = key.replace("%", "")
|
|
82
|
+
op = "like"
|
|
83
|
+
elif "!" in key:
|
|
84
|
+
key = key.replace("!", "")
|
|
85
|
+
op = "<>"
|
|
86
|
+
elif "=" in key:
|
|
87
|
+
key = key.replace("=", "")
|
|
88
|
+
op = "="
|
|
85
89
|
else:
|
|
86
|
-
op =
|
|
87
|
-
if isinstance(val,str) and val[:2] ==
|
|
88
|
-
sql.append(
|
|
90
|
+
op = "="
|
|
91
|
+
if isinstance(val, str) and val[:2] == "@@":
|
|
92
|
+
sql.append("{} {} {}".format(quote(key.lower()), op, val[2:]))
|
|
89
93
|
else:
|
|
90
|
-
if
|
|
91
|
-
sql.append(
|
|
94
|
+
if "like" in op:
|
|
95
|
+
sql.append(
|
|
96
|
+
"lower({}) {} lower(%s)".format(quote(key.lower()), op)
|
|
97
|
+
)
|
|
92
98
|
else:
|
|
93
|
-
sql.append(
|
|
99
|
+
sql.append("{} {} %s".format(quote(key.lower()), op))
|
|
94
100
|
vals.append(val)
|
|
95
|
-
join =
|
|
101
|
+
join = "AND"
|
|
102
|
+
|
|
96
103
|
|
|
97
104
|
def quote(data):
|
|
98
105
|
if isinstance(data, list):
|
|
@@ -101,81 +108,94 @@ def quote(data):
|
|
|
101
108
|
new.append(quote(item))
|
|
102
109
|
return new
|
|
103
110
|
else:
|
|
104
|
-
parts = data.split(
|
|
111
|
+
parts = data.split(".")
|
|
105
112
|
new = []
|
|
106
113
|
for part in parts:
|
|
107
|
-
if
|
|
114
|
+
if "`" in part:
|
|
108
115
|
new.append(part)
|
|
109
116
|
elif part.upper() in reserved_words:
|
|
110
|
-
new.append(
|
|
111
|
-
elif re.findall(
|
|
112
|
-
new.append(
|
|
117
|
+
new.append("`" + part + "`")
|
|
118
|
+
elif re.findall("[/]", part):
|
|
119
|
+
new.append("`" + part + "`")
|
|
113
120
|
else:
|
|
114
121
|
new.append(part)
|
|
115
|
-
return
|
|
122
|
+
return ".".join(new)
|
|
123
|
+
|
|
116
124
|
|
|
117
125
|
class SQL:
|
|
118
126
|
server = "MySQL"
|
|
119
|
-
type_column_identifier =
|
|
120
|
-
is_nullable =
|
|
127
|
+
type_column_identifier = "DATA_TYPE"
|
|
128
|
+
is_nullable = "IS_NULLABLE"
|
|
121
129
|
|
|
122
|
-
default_schema =
|
|
130
|
+
default_schema = "mydb"
|
|
123
131
|
|
|
124
132
|
ApplicationErrorCodes = []
|
|
125
133
|
|
|
126
134
|
DatabaseMissingErrorCodes = []
|
|
127
135
|
TableMissingErrorCodes = [1146]
|
|
128
136
|
ColumnMissingErrorCodes = [1054]
|
|
129
|
-
ForeignKeyMissingErrorCodes =[]
|
|
137
|
+
ForeignKeyMissingErrorCodes = []
|
|
130
138
|
|
|
131
139
|
ConnectionErrorCodes = []
|
|
132
|
-
DuplicateKeyErrorCodes = []
|
|
140
|
+
DuplicateKeyErrorCodes = [] # Handled in regex check.
|
|
133
141
|
RetryTransactionCodes = []
|
|
134
142
|
TruncationErrorCodes = []
|
|
135
143
|
LockTimeoutErrorCodes = []
|
|
136
144
|
DatabaseObjectExistsErrorCodes = []
|
|
137
145
|
|
|
138
146
|
@classmethod
|
|
139
|
-
def __has_pointer(cls,columns):
|
|
147
|
+
def __has_pointer(cls, columns):
|
|
140
148
|
if columns:
|
|
141
|
-
if isinstance(columns,list):
|
|
142
|
-
columns =
|
|
143
|
-
if
|
|
149
|
+
if isinstance(columns, list):
|
|
150
|
+
columns = ",".join(columns)
|
|
151
|
+
if ">" in columns:
|
|
144
152
|
return True
|
|
145
153
|
return False
|
|
146
154
|
|
|
147
155
|
@classmethod
|
|
148
156
|
def alter_add(cls, table, columns, null_allowed=True):
|
|
149
157
|
sql = []
|
|
150
|
-
null =
|
|
151
|
-
if isinstance(columns,dict):
|
|
152
|
-
for key,val in columns.items():
|
|
153
|
-
key = re.sub(
|
|
154
|
-
sql.append(
|
|
155
|
-
|
|
158
|
+
null = "NOT NULL" if not null_allowed else ""
|
|
159
|
+
if isinstance(columns, dict):
|
|
160
|
+
for key, val in columns.items():
|
|
161
|
+
key = re.sub("<>!=%", "", key.lower())
|
|
162
|
+
sql.append(
|
|
163
|
+
"ALTER TABLE {} ADD {} {} {};".format(
|
|
164
|
+
quote(table), quote(key), cls.get_type(val), null
|
|
165
|
+
)
|
|
166
|
+
)
|
|
167
|
+
return "\n\t".join(sql), tuple()
|
|
156
168
|
|
|
157
169
|
@classmethod
|
|
158
170
|
def columns(cls, name):
|
|
159
|
-
if
|
|
171
|
+
if "." in name:
|
|
160
172
|
return """
|
|
161
173
|
SELECT COLUMN_NAME
|
|
162
174
|
FROM INFORMATION_SCHEMA.columns
|
|
163
175
|
WHERE TABLE_SCHEMA = %s
|
|
164
176
|
AND TABLE_NAME = %s
|
|
165
|
-
""", tuple(
|
|
177
|
+
""", tuple(
|
|
178
|
+
name.split(".")
|
|
179
|
+
)
|
|
166
180
|
else:
|
|
167
181
|
return """
|
|
168
182
|
SELECT COLUMN_NAME
|
|
169
183
|
FROM INFORMATION_SCHEMA.columns
|
|
170
184
|
WHERE TABLE_SCHEMA = %s
|
|
171
|
-
""", tuple(
|
|
185
|
+
""", tuple(
|
|
186
|
+
[
|
|
187
|
+
name,
|
|
188
|
+
]
|
|
189
|
+
)
|
|
172
190
|
|
|
173
191
|
@classmethod
|
|
174
|
-
def create_foreign_key(
|
|
175
|
-
|
|
192
|
+
def create_foreign_key(
|
|
193
|
+
cls, table, columns, key_to_table, key_to_columns, name=None, schema=None
|
|
194
|
+
):
|
|
195
|
+
if "." not in table and schema:
|
|
176
196
|
if schema == None:
|
|
177
197
|
schema = cls.default_schema
|
|
178
|
-
table = "{}.{}".format(schema,table)
|
|
198
|
+
table = "{}.{}".format(schema, table)
|
|
179
199
|
if isinstance(key_to_columns, str):
|
|
180
200
|
key_to_columns = [key_to_columns]
|
|
181
201
|
if isinstance(columns, str):
|
|
@@ -183,75 +203,97 @@ class SQL:
|
|
|
183
203
|
if not name:
|
|
184
204
|
m = hashlib.md5()
|
|
185
205
|
m.update(table)
|
|
186
|
-
m.update(
|
|
206
|
+
m.update(" ".join(columns))
|
|
187
207
|
m.update(key_to_table)
|
|
188
|
-
m.update(
|
|
189
|
-
name =
|
|
190
|
-
sql = "ALTER TABLE {} ADD CONSTRAINT {} FOREIGN KEY ({}) REFERENCES {} ({}) ON DELETE CASCADE ON UPDATE CASCADE;".format(
|
|
208
|
+
m.update(" ".join(key_to_columns))
|
|
209
|
+
name = "FK_" + m.hexdigest()
|
|
210
|
+
sql = "ALTER TABLE {} ADD CONSTRAINT {} FOREIGN KEY ({}) REFERENCES {} ({}) ON DELETE CASCADE ON UPDATE CASCADE;".format(
|
|
211
|
+
table, name, ",".join(columns), key_to_table, ",".join(key_to_columns)
|
|
212
|
+
)
|
|
191
213
|
|
|
192
214
|
return sql, tuple()
|
|
193
215
|
|
|
194
216
|
@classmethod
|
|
195
|
-
def create_index(
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
217
|
+
def create_index(
|
|
218
|
+
cls,
|
|
219
|
+
table=None,
|
|
220
|
+
columns=None,
|
|
221
|
+
unique=False,
|
|
222
|
+
direction=None,
|
|
223
|
+
where=None,
|
|
224
|
+
name=None,
|
|
225
|
+
schema=None,
|
|
226
|
+
trigram=None,
|
|
227
|
+
tbl=None,
|
|
228
|
+
):
|
|
229
|
+
if "." not in table and schema:
|
|
230
|
+
table = "{}.{}".format(schema, table)
|
|
231
|
+
if isinstance(columns, (list, set)):
|
|
232
|
+
columns = ",".join([quote(c.lower()) for c in sorted(columns)])
|
|
200
233
|
else:
|
|
201
234
|
columns = quote(columns)
|
|
202
|
-
sql = [
|
|
235
|
+
sql = ["CREATE"]
|
|
203
236
|
if unique:
|
|
204
|
-
sql.append(
|
|
205
|
-
sql.append(
|
|
237
|
+
sql.append("UNIQUE")
|
|
238
|
+
sql.append("INDEX")
|
|
206
239
|
tablename = quote(table)
|
|
207
240
|
if not name:
|
|
208
|
-
name = re.sub(r
|
|
209
|
-
sql.append(
|
|
210
|
-
sql.append(
|
|
241
|
+
name = re.sub(r"\([^)]*\)", "", columns.replace(",", "_"))
|
|
242
|
+
sql.append("IDX__{}__{}".format(table.replace(".", "_"), name))
|
|
243
|
+
sql.append("ON")
|
|
211
244
|
sql.append(tablename)
|
|
212
|
-
sql.append(
|
|
245
|
+
sql.append("(")
|
|
213
246
|
sql.append(columns)
|
|
214
|
-
sql.append(
|
|
215
|
-
return
|
|
247
|
+
sql.append(")")
|
|
248
|
+
return " ".join(sql), tuple()
|
|
216
249
|
|
|
217
250
|
@classmethod
|
|
218
251
|
def create_table(cls, name, columns={}, drop=False):
|
|
219
|
-
trigger =
|
|
252
|
+
trigger = "".format(name)
|
|
220
253
|
sql = []
|
|
221
254
|
if drop:
|
|
222
255
|
sql.append(cls.drop_table(name))
|
|
223
|
-
sql.append(
|
|
256
|
+
sql.append(
|
|
257
|
+
"""
|
|
224
258
|
CREATE TABLE {0} (
|
|
225
259
|
sys_id SERIAL PRIMARY KEY AUTO_INCREMENT,
|
|
226
260
|
sys_modified TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
227
261
|
sys_created TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP
|
|
228
262
|
)ENGINE=InnoDB AUTO_INCREMENT=1000;
|
|
229
|
-
""".format(
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
263
|
+
""".format(
|
|
264
|
+
quote(name)
|
|
265
|
+
)
|
|
266
|
+
)
|
|
267
|
+
|
|
268
|
+
for key, val in columns.items():
|
|
269
|
+
key = re.sub("<>!=%", "", key.lower())
|
|
270
|
+
if key in ["sys_id", "sys_created", "sys_modified"]:
|
|
234
271
|
continue
|
|
235
|
-
sql.append(
|
|
236
|
-
|
|
272
|
+
sql.append(
|
|
273
|
+
"ALTER TABLE {} ADD COLUMN {} {};".format(
|
|
274
|
+
quote(name), quote(key), cls.get_type(val)
|
|
275
|
+
)
|
|
276
|
+
)
|
|
277
|
+
return "\n\t".join(sql), tuple()
|
|
237
278
|
|
|
238
279
|
@classmethod
|
|
239
280
|
def delete(cls, table, where):
|
|
240
|
-
sql = [
|
|
281
|
+
sql = ["DELETE FROM {}".format(table)]
|
|
241
282
|
vals = []
|
|
242
283
|
make_where(where, sql, vals)
|
|
243
|
-
return
|
|
284
|
+
return " ".join(sql), tuple(vals)
|
|
244
285
|
|
|
245
286
|
@classmethod
|
|
246
287
|
def drop_table(cls, name):
|
|
247
288
|
return "DROP TABLE IF EXISTS %s CASCADE;" % quote(name), tuple()
|
|
248
289
|
|
|
249
290
|
@classmethod
|
|
250
|
-
def foreign_key_info(cls,table=None,column=None,schema=None):
|
|
251
|
-
if
|
|
252
|
-
schema, table = table.split(
|
|
291
|
+
def foreign_key_info(cls, table=None, column=None, schema=None):
|
|
292
|
+
if "." in table:
|
|
293
|
+
schema, table = table.split(".")
|
|
253
294
|
|
|
254
|
-
sql = [
|
|
295
|
+
sql = [
|
|
296
|
+
"""
|
|
255
297
|
SELECT
|
|
256
298
|
TABLE_NAME AS FK_TABLE_NAME
|
|
257
299
|
,COLUMN_NAME AS FK_COLUMN_NAME
|
|
@@ -260,58 +302,48 @@ class SQL:
|
|
|
260
302
|
,REFERENCED_COLUMN_NAME
|
|
261
303
|
FROM
|
|
262
304
|
INFORMATION_SCHEMA.KEY_COLUMN_USAGE
|
|
263
|
-
"""
|
|
305
|
+
"""
|
|
306
|
+
]
|
|
264
307
|
vals = []
|
|
265
308
|
where = {}
|
|
266
309
|
if schema:
|
|
267
|
-
where[
|
|
310
|
+
where["LOWER(REFERENCED_TABLE_SCHEMA)"] = schema.lower()
|
|
268
311
|
if table:
|
|
269
|
-
where[
|
|
312
|
+
where["LOWER(REFERENCED_TABLE_NAME)"] = table.lower()
|
|
270
313
|
if column:
|
|
271
|
-
where[
|
|
314
|
+
where["LOWER(REFERENCED_COLUMN_NAME)"] = column.lower()
|
|
272
315
|
make_where(where, sql, vals)
|
|
273
|
-
return
|
|
316
|
+
return " ".join(sql), tuple(vals)
|
|
274
317
|
|
|
275
318
|
@classmethod
|
|
276
319
|
def get_type(cls, v):
|
|
277
320
|
if isinstance(v, str):
|
|
278
|
-
if v[:2] ==
|
|
321
|
+
if v[:2] == "@@":
|
|
279
322
|
return v[2:] or cls.TYPES.TEXT
|
|
280
|
-
elif isinstance(v, (str, bytes))
|
|
281
|
-
|
|
282
|
-
or v is
|
|
283
|
-
return cls.TYPES.TEXT
|
|
284
|
-
elif isinstance(v, bool) \
|
|
285
|
-
or v is bool:
|
|
323
|
+
elif isinstance(v, (str, bytes)) or v is str or v is bytes:
|
|
324
|
+
return cls.TYPES.TEXT
|
|
325
|
+
elif isinstance(v, bool) or v is bool:
|
|
286
326
|
return cls.TYPES.BOOLEAN
|
|
287
|
-
elif isinstance(v, int)
|
|
288
|
-
or v is int:
|
|
327
|
+
elif isinstance(v, int) or v is int:
|
|
289
328
|
if v is int:
|
|
290
329
|
return cls.TYPES.INTEGER
|
|
291
330
|
if v > 2147483647 or v < -2147483648:
|
|
292
331
|
return cls.TYPES.BIGINT
|
|
293
332
|
else:
|
|
294
|
-
return
|
|
295
|
-
elif isinstance(v, float)
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
or v is
|
|
300
|
-
return cls.TYPES.NUMERIC + '(19, 6)'
|
|
301
|
-
elif isinstance (v, datetime.datetime) \
|
|
302
|
-
or v is datetime.datetime:
|
|
333
|
+
return cls.TYPES.INTEGER
|
|
334
|
+
elif isinstance(v, float) or v is float:
|
|
335
|
+
return cls.TYPES.NUMERIC + "(19, 6)"
|
|
336
|
+
elif isinstance(v, decimal.Decimal) or v is decimal.Decimal:
|
|
337
|
+
return cls.TYPES.NUMERIC + "(19, 6)"
|
|
338
|
+
elif isinstance(v, datetime.datetime) or v is datetime.datetime:
|
|
303
339
|
return cls.TYPES.DATETIME
|
|
304
|
-
elif isinstance
|
|
305
|
-
or v is datetime.date:
|
|
340
|
+
elif isinstance(v, datetime.date) or v is datetime.date:
|
|
306
341
|
return cls.TYPES.DATE
|
|
307
|
-
elif isinstance(v, datetime.time)
|
|
308
|
-
or v is datetime.time:
|
|
342
|
+
elif isinstance(v, datetime.time) or v is datetime.time:
|
|
309
343
|
return cls.TYPES.TIME
|
|
310
|
-
elif isinstance(v, datetime.timedelta)
|
|
311
|
-
or v is datetime.timedelta:
|
|
344
|
+
elif isinstance(v, datetime.timedelta) or v is datetime.timedelta:
|
|
312
345
|
return cls.TYPES.INTERVAL
|
|
313
|
-
elif isinstance
|
|
314
|
-
or v is bytearray:
|
|
346
|
+
elif isinstance(v, bytearray) or v is bytearray:
|
|
315
347
|
return cls.TYPES.BINARY
|
|
316
348
|
# Everything else defaults to TEXT, incl. None
|
|
317
349
|
return cls.TYPES.TEXT
|
|
@@ -321,31 +353,29 @@ class SQL:
|
|
|
321
353
|
keys = []
|
|
322
354
|
vals = []
|
|
323
355
|
args = []
|
|
324
|
-
for key,val in data.items():
|
|
356
|
+
for key, val in data.items():
|
|
325
357
|
keys.append(quote(key.lower()))
|
|
326
|
-
if isinstance(val,str)
|
|
327
|
-
and len(val) > 2 \
|
|
328
|
-
and val[:2] == '@@':
|
|
358
|
+
if isinstance(val, str) and len(val) > 2 and val[:2] == "@@":
|
|
329
359
|
vals.append(val[2:])
|
|
330
360
|
else:
|
|
331
|
-
vals.append(
|
|
361
|
+
vals.append("%s")
|
|
332
362
|
args.append(val)
|
|
333
363
|
|
|
334
|
-
sql = [
|
|
364
|
+
sql = ["INSERT INTO"]
|
|
335
365
|
sql.append(quote(table))
|
|
336
|
-
sql.append(
|
|
337
|
-
sql.append(
|
|
338
|
-
sql.append(
|
|
339
|
-
sql.append(
|
|
340
|
-
sql.append(
|
|
341
|
-
sql.append(
|
|
342
|
-
sql.append(
|
|
343
|
-
sql =
|
|
366
|
+
sql.append("(")
|
|
367
|
+
sql.append(",".join(keys))
|
|
368
|
+
sql.append(")")
|
|
369
|
+
sql.append("VALUES")
|
|
370
|
+
sql.append("(")
|
|
371
|
+
sql.append(",".join(vals))
|
|
372
|
+
sql.append(")")
|
|
373
|
+
sql = " ".join(sql)
|
|
344
374
|
return sql, tuple(args)
|
|
345
375
|
|
|
346
376
|
@classmethod
|
|
347
377
|
def last_id(cls, table):
|
|
348
|
-
return
|
|
378
|
+
return "SELECT LAST_INSERT_ID();", tuple()
|
|
349
379
|
|
|
350
380
|
@classmethod
|
|
351
381
|
def create_savepoint(cls, sp):
|
|
@@ -361,215 +391,483 @@ class SQL:
|
|
|
361
391
|
|
|
362
392
|
@classmethod
|
|
363
393
|
def create_view(cls, name, query, temp=False, silent=True):
|
|
364
|
-
sql = [
|
|
394
|
+
sql = ["CREATE"]
|
|
365
395
|
if silent:
|
|
366
|
-
sql.append(
|
|
396
|
+
sql.append("OR REPLACE")
|
|
367
397
|
if temp:
|
|
368
|
-
sql.append(
|
|
369
|
-
sql.append(
|
|
398
|
+
sql.append("TEMPORARY")
|
|
399
|
+
sql.append("VIEW")
|
|
370
400
|
sql.append(name)
|
|
371
|
-
sql.append(
|
|
401
|
+
sql.append("AS")
|
|
372
402
|
sql.append(query)
|
|
373
|
-
return
|
|
403
|
+
return " ".join(sql), tuple()
|
|
374
404
|
|
|
375
405
|
@classmethod
|
|
376
406
|
def drop_view(cls, name, silent=True):
|
|
377
|
-
sql = [
|
|
407
|
+
sql = ["DROP VIEW"]
|
|
378
408
|
if silent:
|
|
379
|
-
sql.append(
|
|
409
|
+
sql.append("IF EXISTS")
|
|
380
410
|
sql.append(name)
|
|
381
|
-
return
|
|
411
|
+
return " ".join(sql), tuple()
|
|
382
412
|
|
|
383
413
|
@classmethod
|
|
384
414
|
def rename_column(cls, table, orig, new):
|
|
385
|
-
return
|
|
415
|
+
return (
|
|
416
|
+
"ALTER TABLE {} RENAME COLUMN {} TO {};".format(
|
|
417
|
+
quote(table), quote(orig), quote(new)
|
|
418
|
+
),
|
|
419
|
+
tuple(),
|
|
420
|
+
)
|
|
386
421
|
|
|
387
422
|
@classmethod
|
|
388
|
-
def select(
|
|
423
|
+
def select(
|
|
424
|
+
cls,
|
|
425
|
+
columns=None,
|
|
426
|
+
table=None,
|
|
427
|
+
where=None,
|
|
428
|
+
orderby=None,
|
|
429
|
+
groupby=None,
|
|
430
|
+
having=None,
|
|
431
|
+
start=None,
|
|
432
|
+
qty=None,
|
|
433
|
+
tbl=None,
|
|
434
|
+
):
|
|
389
435
|
is_join = False
|
|
390
436
|
|
|
391
|
-
if isinstance(columns,str)
|
|
392
|
-
and 'distinct' in columns.lower():
|
|
437
|
+
if isinstance(columns, str) and "distinct" in columns.lower():
|
|
393
438
|
sql = [
|
|
394
|
-
|
|
439
|
+
"SELECT",
|
|
395
440
|
columns,
|
|
396
|
-
|
|
441
|
+
"FROM",
|
|
397
442
|
quote(table),
|
|
398
|
-
|
|
443
|
+
]
|
|
399
444
|
elif cls.__has_pointer(columns):
|
|
400
445
|
is_join = True
|
|
401
|
-
if isinstance(columns,str):
|
|
402
|
-
columns = columns.split(
|
|
446
|
+
if isinstance(columns, str):
|
|
447
|
+
columns = columns.split(",")
|
|
403
448
|
letter = 65
|
|
404
449
|
tables = {table: chr(letter)}
|
|
405
450
|
letter += 1
|
|
406
451
|
__select = []
|
|
407
|
-
__from = [
|
|
452
|
+
__from = ["{} AS {}".format(quote(table), tables.get(table))]
|
|
408
453
|
__left_join = []
|
|
409
454
|
|
|
410
455
|
for column in columns:
|
|
411
|
-
if
|
|
456
|
+
if ">" in column:
|
|
412
457
|
is_join = True
|
|
413
|
-
parts = column.split(
|
|
458
|
+
parts = column.split(">")
|
|
414
459
|
foreign = tbl.foreign_key_info(parts[0])
|
|
415
460
|
if not foreign:
|
|
416
461
|
raise exceptions.DbApplicationError("Foreign key not defined")
|
|
417
|
-
ref_table = foreign[
|
|
418
|
-
ref_schema = foreign[
|
|
419
|
-
ref_column = foreign[
|
|
420
|
-
lookup = "{}:{}".format(ref_table,parts[0])
|
|
462
|
+
ref_table = foreign["referenced_table_name"]
|
|
463
|
+
ref_schema = foreign["referenced_table_schema"]
|
|
464
|
+
ref_column = foreign["referenced_column_name"]
|
|
465
|
+
lookup = "{}:{}".format(ref_table, parts[0])
|
|
421
466
|
if tables.has_key(lookup):
|
|
422
|
-
__select.append(
|
|
467
|
+
__select.append(
|
|
468
|
+
'{}."{}" as "{}"'.format(
|
|
469
|
+
tables.get(lookup), parts[1], "_".join(parts)
|
|
470
|
+
)
|
|
471
|
+
)
|
|
423
472
|
else:
|
|
424
473
|
tables[lookup] = chr(letter)
|
|
425
474
|
letter += 1
|
|
426
|
-
__select.append(
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
475
|
+
__select.append(
|
|
476
|
+
'{}."{}" as "{}"'.format(
|
|
477
|
+
tables.get(lookup), parts[1], "_".join(parts)
|
|
478
|
+
)
|
|
479
|
+
)
|
|
480
|
+
__left_join.append(
|
|
481
|
+
'LEFT OUTER JOIN "{}"."{}" AS {}'.format(
|
|
482
|
+
ref_schema, ref_table, tables.get(lookup)
|
|
483
|
+
)
|
|
484
|
+
)
|
|
485
|
+
__left_join.append(
|
|
486
|
+
'ON {}."{}" = {}."{}"'.format(
|
|
487
|
+
tables.get(table),
|
|
488
|
+
parts[0],
|
|
489
|
+
tables.get(lookup),
|
|
490
|
+
ref_column,
|
|
491
|
+
)
|
|
492
|
+
)
|
|
434
493
|
if orderby and column in orderby:
|
|
435
|
-
orderby = orderby.replace(
|
|
494
|
+
orderby = orderby.replace(
|
|
495
|
+
column, "{}.{}".format(tables.get(lookup), parts[1])
|
|
496
|
+
)
|
|
436
497
|
|
|
437
498
|
else:
|
|
438
|
-
if
|
|
499
|
+
if "(" in column:
|
|
439
500
|
__select.append(column)
|
|
440
501
|
else:
|
|
441
|
-
__select.append("{}.{}".format(tables.get(table),column))
|
|
442
|
-
sql = [
|
|
443
|
-
sql.append(
|
|
444
|
-
sql.append(
|
|
502
|
+
__select.append("{}.{}".format(tables.get(table), column))
|
|
503
|
+
sql = ["SELECT"]
|
|
504
|
+
sql.append(",".join(__select))
|
|
505
|
+
sql.append("FROM")
|
|
445
506
|
sql.extend(__from)
|
|
446
507
|
sql.extend(__left_join)
|
|
447
508
|
else:
|
|
448
509
|
if columns:
|
|
449
|
-
if isinstance(columns,str):
|
|
450
|
-
columns = columns.split(
|
|
451
|
-
if isinstance(columns,list):
|
|
510
|
+
if isinstance(columns, str):
|
|
511
|
+
columns = columns.split(",")
|
|
512
|
+
if isinstance(columns, list):
|
|
452
513
|
columns = quote(columns)
|
|
453
|
-
columns =
|
|
514
|
+
columns = ",".join(columns)
|
|
454
515
|
else:
|
|
455
|
-
columns =
|
|
516
|
+
columns = "*"
|
|
456
517
|
sql = [
|
|
457
|
-
|
|
518
|
+
"SELECT",
|
|
458
519
|
columns,
|
|
459
|
-
|
|
520
|
+
"FROM",
|
|
460
521
|
quote(table),
|
|
461
|
-
|
|
522
|
+
]
|
|
462
523
|
vals = []
|
|
463
524
|
make_where(where, sql, vals, is_join)
|
|
464
525
|
if groupby:
|
|
465
|
-
sql.append(
|
|
466
|
-
if isinstance(groupby,(list,tuple)):
|
|
467
|
-
groupby =
|
|
526
|
+
sql.append("GROUP BY")
|
|
527
|
+
if isinstance(groupby, (list, tuple)):
|
|
528
|
+
groupby = ",".join(groupby)
|
|
468
529
|
sql.append(groupby)
|
|
469
530
|
if having:
|
|
470
|
-
sql.append(
|
|
471
|
-
if isinstance(having,(list,tuple)):
|
|
472
|
-
having =
|
|
531
|
+
sql.append("HAVING")
|
|
532
|
+
if isinstance(having, (list, tuple)):
|
|
533
|
+
having = ",".join(having)
|
|
473
534
|
sql.append(having)
|
|
474
535
|
if orderby:
|
|
475
|
-
sql.append(
|
|
476
|
-
if isinstance(orderby,(list,tuple)):
|
|
477
|
-
orderby =
|
|
536
|
+
sql.append("ORDER BY")
|
|
537
|
+
if isinstance(orderby, (list, tuple)):
|
|
538
|
+
orderby = ",".join(orderby)
|
|
478
539
|
sql.append(orderby)
|
|
479
540
|
if start and qty:
|
|
480
|
-
sql.append(
|
|
541
|
+
sql.append("OFFSET {} ROWS FETCH NEXT {} ROWS ONLY".format(start, qty))
|
|
481
542
|
elif start:
|
|
482
|
-
sql.append(
|
|
543
|
+
sql.append("OFFSET {} ROWS".format(start))
|
|
483
544
|
elif qty:
|
|
484
|
-
sql.append(
|
|
485
|
-
sql =
|
|
545
|
+
sql.append("FETCH NEXT {} ROWS ONLY".format(qty))
|
|
546
|
+
sql = " ".join(sql)
|
|
486
547
|
return sql, tuple(vals)
|
|
487
548
|
|
|
488
549
|
@classmethod
|
|
489
550
|
def update(cls, table, data, pk):
|
|
490
|
-
sql = [
|
|
551
|
+
sql = ["UPDATE"]
|
|
491
552
|
sql.append(quote(table))
|
|
492
|
-
sql.append(
|
|
553
|
+
sql.append("SET")
|
|
493
554
|
vals = []
|
|
494
|
-
join =
|
|
555
|
+
join = ""
|
|
495
556
|
for key in data.keys():
|
|
496
557
|
val = data[key]
|
|
497
558
|
if join:
|
|
498
559
|
sql.append(join)
|
|
499
|
-
if isinstance(val,str) and val[:2] ==
|
|
500
|
-
sql.append("{} = {}".format(quote(key.lower()),val[2:]))
|
|
560
|
+
if isinstance(val, str) and val[:2] == "@@":
|
|
561
|
+
sql.append("{} = {}".format(quote(key.lower()), val[2:]))
|
|
501
562
|
else:
|
|
502
|
-
sql.append(
|
|
563
|
+
sql.append("{} = %s".format(quote(key.lower())))
|
|
503
564
|
vals.append(val)
|
|
504
|
-
join =
|
|
565
|
+
join = ","
|
|
505
566
|
make_where(pk, sql, vals)
|
|
506
|
-
return
|
|
567
|
+
return " ".join(sql), tuple(vals)
|
|
507
568
|
|
|
508
569
|
@classmethod
|
|
509
570
|
def upsert(cls, table, data, pk):
|
|
510
571
|
keys = []
|
|
511
572
|
vals = []
|
|
512
573
|
args = []
|
|
513
|
-
for key,val in data.items():
|
|
574
|
+
for key, val in data.items():
|
|
514
575
|
keys.append(quote(key.lower()))
|
|
515
|
-
if isinstance(val,str)
|
|
516
|
-
and len(val) > 2 \
|
|
517
|
-
and val[:2] == '@@':
|
|
576
|
+
if isinstance(val, str) and len(val) > 2 and val[:2] == "@@":
|
|
518
577
|
vals.append(val[2:])
|
|
519
578
|
else:
|
|
520
|
-
vals.append(
|
|
579
|
+
vals.append("%s")
|
|
521
580
|
args.append(val)
|
|
522
|
-
for key,val in pk.items():
|
|
581
|
+
for key, val in pk.items():
|
|
523
582
|
keys.append(quote(key.lower()))
|
|
524
|
-
if isinstance(val,str)
|
|
525
|
-
and len(val) > 2 \
|
|
526
|
-
and val[:2] == '@@':
|
|
583
|
+
if isinstance(val, str) and len(val) > 2 and val[:2] == "@@":
|
|
527
584
|
vals.append(val[2:])
|
|
528
585
|
else:
|
|
529
|
-
vals.append(
|
|
586
|
+
vals.append("%s")
|
|
530
587
|
args.append(val)
|
|
531
|
-
sql = [
|
|
588
|
+
sql = ["INSERT INTO"]
|
|
532
589
|
sql.append(quote(table))
|
|
533
|
-
sql.append(
|
|
534
|
-
sql.append(
|
|
535
|
-
sql.append(
|
|
536
|
-
sql.append(
|
|
537
|
-
sql.append(
|
|
538
|
-
sql.append(
|
|
539
|
-
sql.append(
|
|
540
|
-
sql.append(
|
|
541
|
-
join =
|
|
590
|
+
sql.append("(")
|
|
591
|
+
sql.append(",".join(keys))
|
|
592
|
+
sql.append(")")
|
|
593
|
+
sql.append("VALUES")
|
|
594
|
+
sql.append("(")
|
|
595
|
+
sql.append(",".join(vals))
|
|
596
|
+
sql.append(")")
|
|
597
|
+
sql.append("ON DUPLICATE KEY UPDATE")
|
|
598
|
+
join = ""
|
|
542
599
|
for key in data.keys():
|
|
543
600
|
val = data[key]
|
|
544
601
|
if join:
|
|
545
602
|
sql.append(join)
|
|
546
|
-
if isinstance(val,str) and val[:2] ==
|
|
547
|
-
sql.append("{} = {}".format(quote(key.lower()),val[2:]))
|
|
603
|
+
if isinstance(val, str) and val[:2] == "@@":
|
|
604
|
+
sql.append("{} = {}".format(quote(key.lower()), val[2:]))
|
|
548
605
|
else:
|
|
549
|
-
sql.append(
|
|
606
|
+
sql.append("{} = %s".format(quote(key.lower())))
|
|
550
607
|
args.append(val)
|
|
551
|
-
join =
|
|
552
|
-
return
|
|
608
|
+
join = ","
|
|
609
|
+
return " ".join(sql), tuple(args)
|
|
553
610
|
|
|
554
611
|
@classmethod
|
|
555
612
|
def views(cls, system=False):
|
|
556
613
|
if system:
|
|
557
|
-
return
|
|
614
|
+
return (
|
|
615
|
+
"SELECT TABLE_SCHEMA, TABLE_NAME FROM information_schema.tables WHERE TABLE_TYPE LIKE 'VIEW';",
|
|
616
|
+
tuple(),
|
|
617
|
+
)
|
|
558
618
|
else:
|
|
559
|
-
return
|
|
619
|
+
return (
|
|
620
|
+
"SELECT TABLE_SCHEMA, TABLE_NAME FROM information_schema.tables WHERE TABLE_TYPE LIKE 'VIEW';",
|
|
621
|
+
tuple(),
|
|
622
|
+
)
|
|
560
623
|
|
|
561
624
|
class TYPES(object):
|
|
562
|
-
TEXT =
|
|
563
|
-
INTEGER =
|
|
564
|
-
NUMERIC =
|
|
565
|
-
DATETIME =
|
|
566
|
-
TIMESTAMP =
|
|
567
|
-
DATE =
|
|
568
|
-
TIME =
|
|
569
|
-
BIGINT =
|
|
570
|
-
SMALLINT =
|
|
571
|
-
BOOLEAN =
|
|
572
|
-
BINARY =
|
|
573
|
-
INTERVAL =
|
|
574
|
-
|
|
575
|
-
|
|
625
|
+
TEXT = "TEXT"
|
|
626
|
+
INTEGER = "INTEGER"
|
|
627
|
+
NUMERIC = "NUMERIC"
|
|
628
|
+
DATETIME = "DATETIME"
|
|
629
|
+
TIMESTAMP = "TIMESTAMP"
|
|
630
|
+
DATE = "DATE"
|
|
631
|
+
TIME = "TIME"
|
|
632
|
+
BIGINT = "BIGINT"
|
|
633
|
+
SMALLINT = "SMALLINT"
|
|
634
|
+
BOOLEAN = "BIT"
|
|
635
|
+
BINARY = "BLOB"
|
|
636
|
+
INTERVAL = "INTERVAL"
|
|
637
|
+
|
|
638
|
+
|
|
639
|
+
reserved_words = [
|
|
640
|
+
"ACCESSIBLE",
|
|
641
|
+
"ADD",
|
|
642
|
+
"ALL",
|
|
643
|
+
"ALTER",
|
|
644
|
+
"ANALYZE",
|
|
645
|
+
"AND",
|
|
646
|
+
"AS",
|
|
647
|
+
"ASC",
|
|
648
|
+
"ASENSITIVE",
|
|
649
|
+
"BEFORE",
|
|
650
|
+
"BETWEEN",
|
|
651
|
+
"BIGINT",
|
|
652
|
+
"BINARY",
|
|
653
|
+
"BLOB",
|
|
654
|
+
"BOTH",
|
|
655
|
+
"BY",
|
|
656
|
+
"CALL",
|
|
657
|
+
"CASCADE",
|
|
658
|
+
"CASE",
|
|
659
|
+
"CHANGE",
|
|
660
|
+
"CHAR",
|
|
661
|
+
"CHARACTER",
|
|
662
|
+
"CHECK",
|
|
663
|
+
"COLLATE",
|
|
664
|
+
"COLUMN",
|
|
665
|
+
"CONDITION",
|
|
666
|
+
"CONSTRAINT",
|
|
667
|
+
"CONTINUE",
|
|
668
|
+
"CONVERT",
|
|
669
|
+
"CREATE",
|
|
670
|
+
"CROSS",
|
|
671
|
+
"CURRENT_DATE",
|
|
672
|
+
"CURRENT_TIME",
|
|
673
|
+
"CURRENT_TIMESTAMP",
|
|
674
|
+
"CURRENT_USER",
|
|
675
|
+
"CURSOR",
|
|
676
|
+
"DATABASE",
|
|
677
|
+
"DATABASES",
|
|
678
|
+
"DAY_HOUR",
|
|
679
|
+
"DAY_MICROSECOND",
|
|
680
|
+
"DAY_MINUTE",
|
|
681
|
+
"DAY_SECOND",
|
|
682
|
+
"DEC",
|
|
683
|
+
"DECIMAL",
|
|
684
|
+
"DECLARE",
|
|
685
|
+
"DEFAULT",
|
|
686
|
+
"DELAYED",
|
|
687
|
+
"DELETE",
|
|
688
|
+
"DESC",
|
|
689
|
+
"DESCRIBE",
|
|
690
|
+
"DETERMINISTIC",
|
|
691
|
+
"DISTINCT",
|
|
692
|
+
"DISTINCTROW",
|
|
693
|
+
"DIV",
|
|
694
|
+
"DOUBLE",
|
|
695
|
+
"DROP",
|
|
696
|
+
"DUAL",
|
|
697
|
+
"EACH",
|
|
698
|
+
"ELSE",
|
|
699
|
+
"ELSEIF",
|
|
700
|
+
"ENCLOSED",
|
|
701
|
+
"ESCAPED",
|
|
702
|
+
"EXISTS",
|
|
703
|
+
"EXIT",
|
|
704
|
+
"EXPLAIN",
|
|
705
|
+
"FALSE",
|
|
706
|
+
"FETCH",
|
|
707
|
+
"FLOAT",
|
|
708
|
+
"FLOAT4",
|
|
709
|
+
"FLOAT8",
|
|
710
|
+
"FOR",
|
|
711
|
+
"FORCE",
|
|
712
|
+
"FOREIGN",
|
|
713
|
+
"FROM",
|
|
714
|
+
"FULLTEXT",
|
|
715
|
+
"GENERAL",
|
|
716
|
+
"GRANT",
|
|
717
|
+
"GROUP",
|
|
718
|
+
"HAVING",
|
|
719
|
+
"HIGH_PRIORITY",
|
|
720
|
+
"HOUR_MICROSECOND",
|
|
721
|
+
"HOUR_MINUTE",
|
|
722
|
+
"HOUR_SECOND",
|
|
723
|
+
"IF",
|
|
724
|
+
"IGNORE",
|
|
725
|
+
"IGNORE_SERVER_IDS",
|
|
726
|
+
"IN",
|
|
727
|
+
"INDEX",
|
|
728
|
+
"INFILE",
|
|
729
|
+
"INNER",
|
|
730
|
+
"INOUT",
|
|
731
|
+
"INSENSITIVE",
|
|
732
|
+
"INSERT",
|
|
733
|
+
"INT",
|
|
734
|
+
"INT1",
|
|
735
|
+
"INT2",
|
|
736
|
+
"INT3",
|
|
737
|
+
"INT4",
|
|
738
|
+
"INT8",
|
|
739
|
+
"INTEGER",
|
|
740
|
+
"INTERVAL",
|
|
741
|
+
"INTO",
|
|
742
|
+
"IS",
|
|
743
|
+
"ITERATE",
|
|
744
|
+
"JOIN",
|
|
745
|
+
"KEY",
|
|
746
|
+
"KEYS",
|
|
747
|
+
"KILL",
|
|
748
|
+
"LEADING",
|
|
749
|
+
"LEAVE",
|
|
750
|
+
"LEFT",
|
|
751
|
+
"LIKE",
|
|
752
|
+
"LIMIT",
|
|
753
|
+
"LINEAR",
|
|
754
|
+
"LINES",
|
|
755
|
+
"LOAD",
|
|
756
|
+
"LOCALTIME",
|
|
757
|
+
"LOCALTIMESTAMP",
|
|
758
|
+
"LOCK",
|
|
759
|
+
"LONG",
|
|
760
|
+
"LONGBLOB",
|
|
761
|
+
"LONGTEXT",
|
|
762
|
+
"LOOP",
|
|
763
|
+
"LOW_PRIORITY",
|
|
764
|
+
"MASTER_HEARTBEAT_PERIOD",
|
|
765
|
+
"MASTER_SSL_VERIFY_SERVER_CERT",
|
|
766
|
+
"MATCH",
|
|
767
|
+
"MAXVALUE",
|
|
768
|
+
"MEDIUMBLOB",
|
|
769
|
+
"MEDIUMINT",
|
|
770
|
+
"MEDIUMTEXT",
|
|
771
|
+
"MIDDLEINT",
|
|
772
|
+
"MINUTE_MICROSECOND",
|
|
773
|
+
"MINUTE_SECOND",
|
|
774
|
+
"MOD",
|
|
775
|
+
"MODIFIES",
|
|
776
|
+
"NATURAL",
|
|
777
|
+
"NOT",
|
|
778
|
+
"NO_WRITE_TO_BINLOG",
|
|
779
|
+
"NULL",
|
|
780
|
+
"NUMERIC",
|
|
781
|
+
"ON",
|
|
782
|
+
"OPTIMIZE",
|
|
783
|
+
"OPTION",
|
|
784
|
+
"OPTIONALLY",
|
|
785
|
+
"OR",
|
|
786
|
+
"ORDER",
|
|
787
|
+
"OUT",
|
|
788
|
+
"OUTER",
|
|
789
|
+
"OUTFILE",
|
|
790
|
+
"PRECISION",
|
|
791
|
+
"PRIMARY",
|
|
792
|
+
"PROCEDURE",
|
|
793
|
+
"PROXY",
|
|
794
|
+
"PURGE",
|
|
795
|
+
"RANGE",
|
|
796
|
+
"READ",
|
|
797
|
+
"READS",
|
|
798
|
+
"READ_WRITE",
|
|
799
|
+
"REAL",
|
|
800
|
+
"REFERENCES",
|
|
801
|
+
"REGEXP",
|
|
802
|
+
"RELAY",
|
|
803
|
+
"RELEASE",
|
|
804
|
+
"RENAME",
|
|
805
|
+
"REPEAT",
|
|
806
|
+
"REPLACE",
|
|
807
|
+
"REQUIRE",
|
|
808
|
+
"RESIGNAL",
|
|
809
|
+
"RESTRICT",
|
|
810
|
+
"RETURN",
|
|
811
|
+
"REVOKE",
|
|
812
|
+
"RIGHT",
|
|
813
|
+
"RLIKE",
|
|
814
|
+
"SCHEMA",
|
|
815
|
+
"SCHEMAS",
|
|
816
|
+
"SECOND_MICROSECOND",
|
|
817
|
+
"SELECT",
|
|
818
|
+
"SENSITIVE",
|
|
819
|
+
"SEPARATOR",
|
|
820
|
+
"SET",
|
|
821
|
+
"SHOW",
|
|
822
|
+
"SIGNAL",
|
|
823
|
+
"SLOW",
|
|
824
|
+
"SMALLINT",
|
|
825
|
+
"SPATIAL",
|
|
826
|
+
"SPECIFIC",
|
|
827
|
+
"SQL",
|
|
828
|
+
"SQLEXCEPTION",
|
|
829
|
+
"SQLSTATE",
|
|
830
|
+
"SQLWARNING",
|
|
831
|
+
"SQL_BIG_RESULT",
|
|
832
|
+
"SQL_CALC_FOUND_ROWS",
|
|
833
|
+
"SQL_SMALL_RESULT",
|
|
834
|
+
"SSL",
|
|
835
|
+
"STARTING",
|
|
836
|
+
"STRAIGHT_JOIN",
|
|
837
|
+
"TABLE",
|
|
838
|
+
"TERMINATED",
|
|
839
|
+
"THEN",
|
|
840
|
+
"TIMESTAMP",
|
|
841
|
+
"TINYBLOB",
|
|
842
|
+
"TINYINT",
|
|
843
|
+
"TINYTEXT",
|
|
844
|
+
"TO",
|
|
845
|
+
"TRAILING",
|
|
846
|
+
"TRIGGER",
|
|
847
|
+
"TRUE",
|
|
848
|
+
"UNDO",
|
|
849
|
+
"UNION",
|
|
850
|
+
"UNIQUE",
|
|
851
|
+
"UNLOCK",
|
|
852
|
+
"UNSIGNED",
|
|
853
|
+
"UPDATE",
|
|
854
|
+
"USAGE",
|
|
855
|
+
"USE",
|
|
856
|
+
"USING",
|
|
857
|
+
"UTC_DATE",
|
|
858
|
+
"UTC_TIME",
|
|
859
|
+
"UTC_TIMESTAMP",
|
|
860
|
+
"VALUES",
|
|
861
|
+
"VARBINARY",
|
|
862
|
+
"VARCHAR",
|
|
863
|
+
"VARCHARACTER",
|
|
864
|
+
"VARYING",
|
|
865
|
+
"WHEN",
|
|
866
|
+
"WHERE",
|
|
867
|
+
"WHILE",
|
|
868
|
+
"WITH",
|
|
869
|
+
"WRITE",
|
|
870
|
+
"XOR",
|
|
871
|
+
"YEAR_MONTH",
|
|
872
|
+
"ZEROFILL",
|
|
873
|
+
]
|