Skip to content

Commit a3654f8

Browse files
committed
feat(models): escapeReservedWords function
1 parent 86101ad commit a3654f8

File tree

10 files changed

+393
-75
lines changed

10 files changed

+393
-75
lines changed

core/src/wheels/databaseAdapters/H2/H2Model.cfc

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -180,5 +180,12 @@ component extends="wheels.databaseAdapters.Base" output=false {
180180
return local.columns;
181181
}
182182

183+
/**
184+
* Define H2 reserved words.
185+
*/
186+
public string function $escapeReservedWords(required string word) {
187+
// TODO
188+
return arguments.word;
189+
}
183190

184191
}

core/src/wheels/databaseAdapters/MicrosoftSQLServer/MicrosoftSQLServerModel.cfc

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -235,16 +235,16 @@ component extends="wheels.databaseAdapters.Base" output=false {
235235
);
236236
if (!ListFindNoCase(local.columnList, ListFirst(arguments.primaryKey))) {
237237
local.rv = {};
238-
238+
239239
// Use @@IDENTITY instead of SCOPE_IDENTITY() for BoxLang compatibility
240240
// SCOPE_IDENTITY() returns empty values in BoxLang with SQL Server
241241
query = $query(sql = "SELECT @@IDENTITY AS lastId", argumentCollection = arguments.queryAttributes);
242-
242+
243243
// Fallback to SCOPE_IDENTITY() if @@IDENTITY fails (for other CFML engines)
244244
if (!len(query.lastId)) {
245245
query = $query(sql = "SELECT SCOPE_IDENTITY() AS lastId", argumentCollection = arguments.queryAttributes);
246246
}
247-
247+
248248
local.rv[$generatedKey()] = query.lastId;
249249
return local.rv;
250250
}
@@ -258,5 +258,12 @@ component extends="wheels.databaseAdapters.Base" output=false {
258258
return "NEWID()";
259259
}
260260

261+
/**
262+
* Define MSSQL reserved words.
263+
*/
264+
public string function $escapeReservedWords(required string word) {
265+
// TODO
266+
return arguments.word;
267+
}
261268

262269
}

core/src/wheels/databaseAdapters/MySQL/MySQLModel.cfc

Lines changed: 274 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -115,5 +115,279 @@ component extends="wheels.databaseAdapters.Base" output=false {
115115
return "() VALUES()";
116116
}
117117

118+
/**
119+
* Define MySQL reserved words.
120+
*/
121+
public string function $escapeReservedWords(required string word) {
122+
local.reservedWords = [
123+
"ACCESSIBLE",
124+
"ADD",
125+
"ALL",
126+
"ALTER",
127+
"ANALYZE",
128+
"AND",
129+
"AS",
130+
"ASC",
131+
"ASENSITIVE",
132+
"BEFORE",
133+
"BETWEEN",
134+
"BIGINT",
135+
"BINARY",
136+
"BLOB",
137+
"BOTH",
138+
"BY",
139+
"CALL",
140+
"CASCADE",
141+
"CASE",
142+
"CHANGE",
143+
"CHAR",
144+
"CHARACTER",
145+
"CHECK",
146+
"COLLATE",
147+
"COLUMN",
148+
"CONDITION",
149+
"CONSTRAINT",
150+
"CONTINUE",
151+
"CONVERT",
152+
"CREATE",
153+
"CROSS",
154+
"CUBE",
155+
"CUME_DIST",
156+
"CURRENT_DATE",
157+
"CURRENT_TIME",
158+
"CURRENT_TIMESTAMP",
159+
"CURRENT_USER",
160+
"CURSOR",
161+
"DATABASE",
162+
"DATABASES",
163+
"DAY_HOUR",
164+
"DAY_MICROSECOND",
165+
"DAY_MINUTE",
166+
"DAY_SECOND",
167+
"DEC",
168+
"DECIMAL",
169+
"DECLARE",
170+
"DEFAULT",
171+
"DELAYED",
172+
"DELETE",
173+
"DENSE_RANK",
174+
"DESC",
175+
"DESCRIBE",
176+
"DETERMINISTIC",
177+
"DISTINCT",
178+
"DISTINCTROW",
179+
"DIV",
180+
"DOUBLE",
181+
"DROP",
182+
"DUAL",
183+
"EACH",
184+
"ELSE",
185+
"ELSEIF",
186+
"EMPTY",
187+
"ENCLOSED",
188+
"ESCAPED",
189+
"EXCEPT",
190+
"EXISTS",
191+
"EXIT",
192+
"EXPLAIN",
193+
"FALSE",
194+
"FETCH",
195+
"FIRST_VALUE",
196+
"FLOAT",
197+
"FLOAT4",
198+
"FLOAT8",
199+
"FOR",
200+
"FORCE",
201+
"FOREIGN",
202+
"FROM",
203+
"FULLTEXT",
204+
"FUNCTION",
205+
"GENERATED",
206+
"GET",
207+
"GRANT",
208+
"GROUP",
209+
"GROUPING",
210+
"GROUPS",
211+
"HAVING",
212+
"HIGH_PRIORITY",
213+
"HOUR_MICROSECOND",
214+
"HOUR_MINUTE",
215+
"HOUR_SECOND",
216+
"IF",
217+
"IGNORE",
218+
"IN",
219+
"INDEX",
220+
"INFILE",
221+
"INNER",
222+
"INOUT",
223+
"INSENSITIVE",
224+
"INSERT",
225+
"INT",
226+
"INT1",
227+
"INT2",
228+
"INT3",
229+
"INT4",
230+
"INT8",
231+
"INTEGER",
232+
"INTERVAL",
233+
"INTO",
234+
"IO_AFTER_GTIDS",
235+
"IO_BEFORE_GTIDS",
236+
"IS",
237+
"ITERATE",
238+
"JOIN",
239+
"JSON_TABLE",
240+
"KEY",
241+
"KEYS",
242+
"KILL",
243+
"LAG",
244+
"LAST_VALUE",
245+
"LEAD",
246+
"LEADING",
247+
"LEAVE",
248+
"LEFT",
249+
"LIKE",
250+
"LIMIT",
251+
"LINEAR",
252+
"LINES",
253+
"LOAD",
254+
"LOCALTIME",
255+
"LOCALTIMESTAMP",
256+
"LOCK",
257+
"LONG",
258+
"LONGBLOB",
259+
"LONGTEXT",
260+
"LOOP",
261+
"LOW_PRIORITY",
262+
"MASTER_BIND",
263+
"MASTER_SSL_VERIFY_SERVER_CERT",
264+
"MATCH",
265+
"MAXVALUE",
266+
"MEDIUMBLOB",
267+
"MEDIUMINT",
268+
"MEDIUMTEXT",
269+
"MIDDLEINT",
270+
"MINUTE_MICROSECOND",
271+
"MINUTE_SECOND",
272+
"MOD",
273+
"MODIFIES",
274+
"NATURAL",
275+
"NOT",
276+
"NO_WRITE_TO_BINLOG",
277+
"NTH_VALUE",
278+
"NTILE",
279+
"NULL",
280+
"NUMERIC",
281+
"OF",
282+
"ON",
283+
"OPTIMIZE",
284+
"OPTIMIZER_COSTS",
285+
"OPTION",
286+
"OPTIONALLY",
287+
"OR",
288+
"ORDER",
289+
"OUT",
290+
"OUTER",
291+
"OUTFILE",
292+
"OVER",
293+
"PARTITION",
294+
"PERCENT_RANK",
295+
"PERSIST",
296+
"PERSIST_ONLY",
297+
"PRECISION",
298+
"PRIMARY",
299+
"PROCEDURE",
300+
"PURGE",
301+
"RANGE",
302+
"RANK",
303+
"READ",
304+
"READS",
305+
"READ_WRITE",
306+
"REAL",
307+
"RECURSIVE",
308+
"REFERENCES",
309+
"REGEXP",
310+
"RELEASE",
311+
"RENAME",
312+
"REPEAT",
313+
"REPLACE",
314+
"REQUIRE",
315+
"RESIGNAL",
316+
"RESTRICT",
317+
"RETURN",
318+
"REVOKE",
319+
"RIGHT",
320+
"RLIKE",
321+
"ROW",
322+
"ROWS",
323+
"ROW_NUMBER",
324+
"SCHEMA",
325+
"SCHEMAS",
326+
"SECOND_MICROSECOND",
327+
"SELECT",
328+
"SENSITIVE",
329+
"SEPARATOR",
330+
"SET",
331+
"SHOW",
332+
"SIGNAL",
333+
"SMALLINT",
334+
"SPATIAL",
335+
"SPECIFIC",
336+
"SQL",
337+
"SQLEXCEPTION",
338+
"SQLSTATE",
339+
"SQLWARNING",
340+
"SQL_BIG_RESULT",
341+
"SQL_CALC_FOUND_ROWS",
342+
"SQL_SMALL_RESULT",
343+
"SSL",
344+
"STARTING",
345+
"STORED",
346+
"STRAIGHT_JOIN",
347+
"SYSTEM",
348+
"TABLE",
349+
"TERMINATED",
350+
"THEN",
351+
"TINYBLOB",
352+
"TINYINT",
353+
"TINYTEXT",
354+
"TO",
355+
"TRAILING",
356+
"TRIGGER",
357+
"TRUE",
358+
"UNDO",
359+
"UNION",
360+
"UNIQUE",
361+
"UNLOCK",
362+
"UNSIGNED",
363+
"UPDATE",
364+
"USAGE",
365+
"USE",
366+
"USING",
367+
"UTC_DATE",
368+
"UTC_TIME",
369+
"UTC_TIMESTAMP",
370+
"VALUES",
371+
"VARBINARY",
372+
"VARCHAR",
373+
"VARCHARACTER",
374+
"VARYING",
375+
"VIRTUAL",
376+
"WHEN",
377+
"WHERE",
378+
"WHILE",
379+
"WINDOW",
380+
"WITH",
381+
"WRITE",
382+
"XOR",
383+
"YEAR_MONTH",
384+
"ZEROFILL",
385+
];
386+
local.rv = arguments.word;
387+
if (local.reservedWords.findNoCase(arguments.word)) {
388+
local.rv = "`#local.rv#`";
389+
}
390+
return local.rv;
391+
}
118392

119393
}

core/src/wheels/databaseAdapters/Oracle/OracleModel.cfc

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -141,5 +141,12 @@ component extends="wheels.databaseAdapters.Base" output=false {
141141
return arguments.table & " " & arguments.alias;
142142
}
143143

144+
/**
145+
* Define Oracle reserved words.
146+
*/
147+
public string function $escapeReservedWords(required string word) {
148+
// TODO
149+
return arguments.word;
150+
}
144151

145152
}

core/src/wheels/databaseAdapters/PostgreSQL/PostgreSQLModel.cfc

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -172,5 +172,12 @@ component extends="wheels.databaseAdapters.Base" output=false {
172172
return "random()";
173173
}
174174

175+
/**
176+
* Define Postgres reserved words.
177+
*/
178+
public string function $escapeReservedWords(required string word) {
179+
// TODO
180+
return arguments.word;
181+
}
175182

176183
}

core/src/wheels/databaseAdapters/SQLite/SQLiteModel.cfc

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -104,7 +104,7 @@ component extends="wheels.databaseAdapters.Base" output=false {
104104
",,"
105105
);
106106
}
107-
107+
108108
// If the primary key column wasn't part of the INSERT, we fetch last inserted ID
109109
if (!ListFindNoCase(local.columnList, ListFirst(arguments.primaryKey))) {
110110
local.rv = {};
@@ -126,4 +126,12 @@ component extends="wheels.databaseAdapters.Base" output=false {
126126
return " DEFAULT VALUES";
127127
}
128128

129+
/**
130+
* Define SQLite reserved words.
131+
*/
132+
public string function $escapeReservedWords(required string word) {
133+
// TODO
134+
return arguments.word;
135+
}
136+
129137
}

0 commit comments

Comments
 (0)