Skip to content

Commit a000e54

Browse files
committed
Correctly handle order clause for reserved columns
1 parent e6e2dc3 commit a000e54

File tree

1 file changed

+164
-0
lines changed

1 file changed

+164
-0
lines changed

lib/internal/Magento/Framework/Data/Collection/AbstractDb.php

Lines changed: 164 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,167 @@ abstract class AbstractDb extends \Magento\Framework\Data\Collection
9999
*/
100100
protected $extensionAttributesJoinProcessor;
101101

102+
/** @see https://en.wikipedia.org/wiki/List_of_SQL_reserved_words */
103+
private const SQL_RESERVED_WORDS = [
104+
'ABORT', 'ABORTSESSION', 'ABS', 'ABSENT', 'ABSOLUTE', 'ACCESS',
105+
'ACCESS_LOCK', 'ACCESSIBLE', 'ACCOUNT', 'ACOS', 'ACOSH', 'ACTION',
106+
'ADD', 'ADD_MONTHS', 'ADMIN', 'AFTER', 'AGGREGATE', 'ALIAS', 'ALL',
107+
'ALLOCATE', 'ALLOW', 'ALTER', 'ALTERAND', 'AMP', 'ANALYSE', 'ANALYZE',
108+
'AND', 'ANSIDATE', 'ANY', 'ARE', 'ARRAY', 'ARRAY_AGG', 'ARRAY_EXISTS',
109+
'ARRAY_MAX_CARDINALITY', 'AS', 'ASC', 'ASENSITIVE', 'ASIN', 'ASINH',
110+
'ASSERTION', 'ASSOCIATE', 'ASUTIME', 'ASYMMETRIC', 'AT', 'ATAN',
111+
'ATAN2', 'ATANH', 'ATOMIC', 'AUDIT', 'AUTHORIZATION', 'AUX',
112+
'AUXILIARY', 'AVE', 'AVERAGE', 'AVG', 'BACKUP', 'BEFORE', 'BEGIN',
113+
'BEGIN_FRAME', 'BEGIN_PARTITION', 'BETWEEN', 'BIGINT', 'BINARY', 'BIT',
114+
'BLOB', 'BOOLEAN', 'BOTH', 'BREADTH', 'BREAK', 'BROWSE', 'BT',
115+
'BUFFERPOOL', 'BULK', 'BUT', 'BY', 'BYTE', 'BYTEINT', 'BYTES', 'CALL',
116+
'CALLED', 'CAPTURE', 'CARDINALITY', 'CASCADE', 'CASCADED', 'CASE',
117+
'CASE_N', 'CASESPECIFIC', 'CAST', 'CATALOG', 'CCSID', 'CD', 'CEIL',
118+
'CEILING', 'CHANGE', 'CHAR', 'CHAR_LENGTH', 'CHAR2HEXINT', 'CHARACTER',
119+
'CHARACTER_LENGTH', 'CHARACTERS', 'CHARS', 'CHECK', 'CHECKPOINT',
120+
'CLASS', 'CLASSIFIER', 'CLOB', 'CLONE', 'CLOSE', 'CLUSTER',
121+
'CLUSTERED', 'CM', 'COALESCE', 'COLLATE', 'COLLATION', 'COLLECT',
122+
'COLLECTION', 'COLLID', 'COLUMN', 'COLUMN_VALUE', 'COMMENT', 'COMMIT',
123+
'COMPLETION', 'COMPRESS', 'COMPUTE', 'CONCAT', 'CONCURRENTLY',
124+
'CONDITION', 'CONNECT', 'CONNECTION', 'CONSTRAINT', 'CONSTRAINTS',
125+
'CONSTRUCTOR', 'CONTAINS', 'CONTAINSTABLE', 'CONTENT', 'CONTINUE',
126+
'CONVERT', 'CONVERT_TABLE_HEADER', 'COPY', 'CORR', 'CORRESPONDING',
127+
'COS', 'COSH', 'COUNT', 'COVAR_POP', 'COVAR_SAMP', 'CREATE', 'CROSS',
128+
'CS', 'CSUM', 'CT', 'CUBE', 'CUME_DIST', 'CURRENT', 'CURRENT_CATALOG',
129+
'CURRENT_DATE', 'CURRENT_DEFAULT_TRANSFORM_GROUP', 'CURRENT_LC_CTYPE',
130+
'CURRENT_PATH', 'CURRENT_ROLE', 'CURRENT_ROW', 'CURRENT_SCHEMA',
131+
'CURRENT_SERVER', 'CURRENT_TIME', 'CURRENT_TIMESTAMP',
132+
'CURRENT_TIMEZONE', 'CURRENT_TRANSFORM_GROUP_FOR_TYPE', 'CURRENT_USER',
133+
'CURRVAL', 'CURSOR', 'CV', 'CYCLE', 'DATA', 'DATABASE', 'DATABASES',
134+
'DATABLOCKSIZE', 'DATE', 'DATEFORM', 'DAY', 'DAY_HOUR',
135+
'DAY_MICROSECOND', 'DAY_MINUTE', 'DAY_SECOND', 'DAYS', 'DBCC',
136+
'DBINFO', 'DEALLOCATE', 'DEC', 'DECFLOAT', 'DECIMAL', 'DECLARE',
137+
'DEFAULT', 'DEFERRABLE', 'DEFERRED', 'DEFINE', 'DEGREES', 'DEL',
138+
'DELAYED', 'DELETE', 'DENSE_RANK', 'DENY', 'DEPTH', 'DEREF', 'DESC',
139+
'DESCRIBE', 'DESCRIPTOR', 'DESTROY', 'DESTRUCTOR', 'DETERMINISTIC',
140+
'DIAGNOSTIC', 'DIAGNOSTICS', 'DICTIONARY', 'DISABLE', 'DISABLED',
141+
'DISALLOW', 'DISCONNECT', 'DISK', 'DISTINCT', 'DISTINCTROW',
142+
'DISTRIBUTED', 'DIV', 'DO', 'DOCUMENT', 'DOMAIN', 'DOUBLE', 'DROP',
143+
'DSSIZE', 'DUAL', 'DUMP', 'DYNAMIC', 'EACH', 'ECHO', 'EDITPROC',
144+
'ELEMENT', 'ELSE', 'ELSEIF', 'EMPTY', 'ENABLED', 'ENCLOSED',
145+
'ENCODING', 'ENCRYPTION', 'END', 'END_FRAME', 'END_PARTITION',
146+
'END-EXEC', 'ENDING', 'EQ', 'EQUALS', 'ERASE', 'ERRLVL', 'ERROR',
147+
'ERRORFILES', 'ERRORTABLES', 'ESCAPE', 'ESCAPED', 'ET', 'EVERY',
148+
'EXCEPT', 'EXCEPTION', 'EXCLUSIVE', 'EXEC', 'EXECUTE', 'EXISTS',
149+
'EXIT', 'EXP', 'EXPLAIN', 'EXTERNAL', 'EXTRACT', 'FALLBACK', 'FALSE',
150+
'FASTEXPORT', 'FENCED', 'FETCH', 'FIELDPROC', 'FILE', 'FILLFACTOR',
151+
'FILTER', 'FINAL', 'FIRST', 'FIRST_VALUE', 'FLOAT', 'FLOAT4', 'FLOAT8',
152+
'FLOOR', 'FOR', 'FORCE', 'FOREIGN', 'FORMAT', 'FOUND', 'FRAME_ROW',
153+
'FREE', 'FREESPACE', 'FREETEXT', 'FREETEXTTABLE', 'FREEZE', 'FROM',
154+
'FULL', 'FULLTEXT', 'FUNCTION', 'FUSION', 'GE', 'GENERAL', 'GENERATED',
155+
'GET', 'GIVE', 'GLOBAL', 'GO', 'GOTO', 'GRANT', 'GRAPHIC', 'GROUP',
156+
'GROUPING', 'GROUPS', 'GT', 'HANDLER', 'HASH', 'HASHAMP', 'HASHBAKAMP',
157+
'HASHBUCKET', 'HASHROW', 'HAVING', 'HELP', 'HIGH_PRIORITY', 'HOLD',
158+
'HOLDLOCK', 'HOST', 'HOUR', 'HOUR_MICROSECOND', 'HOUR_MINUTE',
159+
'HOUR_SECOND', 'HOURS', 'IDENTIFIED', 'IDENTITY', 'IDENTITY_INSERT',
160+
'IDENTITYCOL', 'IF', 'IGNORE', 'ILIKE', 'IMMEDIATE', 'IN', 'INCLUSIVE',
161+
'INCONSISTENT', 'INCREMENT', 'INDEX', 'INDICATOR', 'INFILE', 'INHERIT',
162+
'INITIAL', 'INITIALIZE', 'INITIALLY', 'INITIATE', 'INNER', 'INOUT',
163+
'INPUT', 'INS', 'INSENSITIVE', 'INSERT', 'INSTEAD', 'INT', 'INT1',
164+
'INT2', 'INT3', 'INT4', 'INT8', 'INTEGER', 'INTEGERDATE', 'INTERSECT',
165+
'INTERSECTION', 'INTERVAL', 'INTO', 'IO_AFTER_GTIDS',
166+
'IO_BEFORE_GTIDS', 'IS', 'ISNULL', 'ISOBID', 'ISOLATION', 'ITERATE',
167+
'JAR', 'JOIN', 'JOURNAL', 'JSON', 'JSON_ARRAY', 'JSON_ARRAYAGG',
168+
'JSON_EXISTS', 'JSON_OBJECT', 'JSON_OBJECTAGG', 'JSON_QUERY',
169+
'JSON_TABLE', 'JSON_TABLE_PRIMITIVE', 'JSON_VALUE', 'KEEP', 'KEY',
170+
'KEYS', 'KILL', 'KURTOSIS', 'LABEL', 'LAG', 'LANGUAGE', 'LARGE',
171+
'LAST', 'LAST_VALUE', 'LATERAL', 'LC_CTYPE', 'LE', 'LEAD', 'LEADING',
172+
'LEAVE', 'LEFT', 'LESS', 'LEVEL', 'LIKE', 'LIKE_REGEX', 'LIMIT',
173+
'LINEAR', 'LINENO', 'LINES', 'LISTAGG', 'LN', 'LOAD', 'LOADING',
174+
'LOCAL', 'LOCALE', 'LOCALTIME', 'LOCALTIMESTAMP', 'LOCATOR',
175+
'LOCATORS', 'LOCK', 'LOCKING', 'LOCKMAX', 'LOCKSIZE', 'LOG', 'LOG10',
176+
'LOGGING', 'LOGON', 'LONG', 'LONGBLOB', 'LONGTEXT', 'LOOP',
177+
'LOW_PRIORITY', 'LOWER', 'LT', 'MACRO', 'MAINTAINED', 'MAP',
178+
'MASTER_BIND', 'MASTER_SSL_VERIFY_SERVER_CERT', 'MATCH',
179+
'MATCH_NUMBER', 'MATCH_RECOGNIZE', 'MATCHES', 'MATERIALIZED', 'MAVG',
180+
'MAX', 'MAXEXTENTS', 'MAXIMUM', 'MAXVALUE', 'MCHARACTERS', 'MDIFF',
181+
'MEDIUMBLOB', 'MEDIUMINT', 'MEDIUMTEXT', 'MEMBER', 'MERGE', 'METHOD',
182+
'MICROSECOND', 'MICROSECONDS', 'MIDDLEINT', 'MIN', 'MINDEX', 'MINIMUM',
183+
'MINUS', 'MINUTE', 'MINUTE_MICROSECOND', 'MINUTE_SECOND', 'MINUTES',
184+
'MLINREG', 'MLOAD', 'MLSLABEL', 'MOD', 'MODE', 'MODIFIES', 'MODIFY',
185+
'MODULE', 'MONITOR', 'MONRESOURCE', 'MONSESSION', 'MONTH', 'MONTHS',
186+
'MSUBSTR', 'MSUM', 'MULTISET', 'NAMED', 'NAMES', 'NATIONAL', 'NATURAL',
187+
'NCHAR', 'NCLOB', 'NE', 'NESTED_TABLE_ID', 'NEW', 'NEW_TABLE', 'NEXT',
188+
'NEXTVAL', 'NO', 'NO_WRITE_TO_BINLOG', 'NOAUDIT', 'NOCHECK',
189+
'NOCOMPRESS', 'NONCLUSTERED', 'NONE', 'NORMALIZE', 'NOT', 'NOTNULL',
190+
'NOWAIT', 'NTH_VALUE', 'NTILE', 'NULL', 'NULLIF', 'NULLIFZERO',
191+
'NULLS', 'NUMBER', 'NUMERIC', 'NUMPARTS', 'OBID', 'OBJECT', 'OBJECTS',
192+
'OCCURRENCES_REGEX', 'OCTET_LENGTH', 'OF', 'OFF', 'OFFLINE', 'OFFSET',
193+
'OFFSETS', 'OLD', 'OLD_TABLE', 'OMIT', 'ON', 'ONE', 'ONLINE', 'ONLY',
194+
'OPEN', 'OPENDATASOURCE', 'OPENQUERY', 'OPENROWSET', 'OPENXML',
195+
'OPERATION', 'OPTIMIZATION', 'OPTIMIZE', 'OPTIMIZER_COSTS', 'OPTION',
196+
'OPTIONALLY', 'OR', 'ORDER', 'ORDINALITY', 'ORGANIZATION', 'OUT',
197+
'OUTER', 'OUTFILE', 'OUTPUT', 'OVER', 'OVERLAPS', 'OVERLAY',
198+
'OVERRIDE', 'PACKAGE', 'PAD', 'PADDED', 'PARAMETER', 'PARAMETERS',
199+
'PART', 'PARTIAL', 'PARTITION', 'PARTITIONED', 'PARTITIONING',
200+
'PASSWORD', 'PATH', 'PATTERN', 'PCTFREE', 'PER', 'PERCENT',
201+
'PERCENT_RANK', 'PERCENTILE_CONT', 'PERCENTILE_DISC', 'PERIOD', 'PERM',
202+
'PERMANENT', 'PIECESIZE', 'PIVOT', 'PLACING', 'PLAN', 'PORTION',
203+
'POSITION', 'POSITION_REGEX', 'POSTFIX', 'POWER', 'PRECEDES',
204+
'PRECISION', 'PREFIX', 'PREORDER', 'PREPARE', 'PRESERVE', 'PREVVAL',
205+
'PRIMARY', 'PRINT', 'PRIOR', 'PRIQTY', 'PRIVATE', 'PRIVILEGES', 'PROC',
206+
'PROCEDURE', 'PROFILE', 'PROGRAM', 'PROPORTIONAL', 'PROTECTION',
207+
'PSID', 'PTF', 'PUBLIC', 'PURGE', 'QUALIFIED', 'QUALIFY', 'QUANTILE',
208+
'QUERY', 'QUERYNO', 'RADIANS', 'RAISERROR', 'RANDOM', 'RANGE',
209+
'RANGE_N', 'RANK', 'RAW', 'READ', 'READ_WRITE', 'READS', 'READTEXT',
210+
'REAL', 'RECONFIGURE', 'RECURSIVE', 'REF', 'REFERENCES', 'REFERENCING',
211+
'REFRESH', 'REGEXP', 'REGR_AVGX', 'REGR_AVGY', 'REGR_COUNT',
212+
'REGR_INTERCEPT', 'REGR_R2', 'REGR_SLOPE', 'REGR_SXX', 'REGR_SXY',
213+
'REGR_SYY', 'RELATIVE', 'RELEASE', 'RENAME', 'REPEAT', 'REPLACE',
214+
'REPLICATION', 'REPOVERRIDE', 'REQUEST', 'REQUIRE', 'RESIGNAL',
215+
'RESOURCE', 'RESTART', 'RESTORE', 'RESTRICT', 'RESULT',
216+
'RESULT_SET_LOCATOR', 'RESUME', 'RET', 'RETRIEVE', 'RETURN',
217+
'RETURNING', 'RETURNS', 'REVALIDATE', 'REVERT', 'REVOKE', 'RIGHT',
218+
'RIGHTS', 'RLIKE', 'ROLE', 'ROLLBACK', 'ROLLFORWARD', 'ROLLUP',
219+
'ROUND_CEILING', 'ROUND_DOWN', 'ROUND_FLOOR', 'ROUND_HALF_DOWN',
220+
'ROUND_HALF_EVEN', 'ROUND_HALF_UP', 'ROUND_UP', 'ROUTINE', 'ROW',
221+
'ROW_NUMBER', 'ROWCOUNT', 'ROWGUIDCOL', 'ROWID', 'ROWNUM', 'ROWS',
222+
'ROWSET', 'RULE', 'RUN', 'RUNNING', 'SAMPLE', 'SAMPLEID', 'SAVE',
223+
'SAVEPOINT', 'SCHEMA', 'SCHEMAS', 'SCOPE', 'SCRATCHPAD', 'SCROLL',
224+
'SEARCH', 'SECOND', 'SECOND_MICROSECOND', 'SECONDS', 'SECQTY',
225+
'SECTION', 'SECURITY', 'SECURITYAUDIT', 'SEEK', 'SEL', 'SELECT',
226+
'SEMANTICKEYPHRASETABLE', 'SEMANTICSIMILARITYDETAILSTABLE',
227+
'SEMANTICSIMILARITYTABLE', 'SENSITIVE', 'SEPARATOR', 'SEQUENCE',
228+
'SESSION', 'SESSION_USER', 'SET', 'SETRESRATE', 'SETS', 'SETSESSRATE',
229+
'SETUSER', 'SHARE', 'SHOW', 'SHUTDOWN', 'SIGNAL', 'SIMILAR', 'SIMPLE',
230+
'SIN', 'SINH', 'SIZE', 'SKEW', 'SKIP', 'SMALLINT', 'SOME', 'SOUNDEX',
231+
'SOURCE', 'SPACE', 'SPATIAL', 'SPECIFIC', 'SPECIFICTYPE', 'SPOOL',
232+
'SQL', 'SQL_BIG_RESULT', 'SQL_CALC_FOUND_ROWS', 'SQL_SMALL_RESULT',
233+
'SQLEXCEPTION', 'SQLSTATE', 'SQLTEXT', 'SQLWARNING', 'SQRT', 'SS',
234+
'SSL', 'STANDARD', 'START', 'STARTING', 'STARTUP', 'STATE',
235+
'STATEMENT', 'STATIC', 'STATISTICS', 'STAY', 'STDDEV_POP',
236+
'STDDEV_SAMP', 'STEPINFO', 'STOGROUP', 'STORED', 'STORES',
237+
'STRAIGHT_JOIN', 'STRING_CS', 'STRUCTURE', 'STYLE', 'SUBMULTISET',
238+
'SUBSCRIBER', 'SUBSET', 'SUBSTR', 'SUBSTRING', 'SUBSTRING_REGEX',
239+
'SUCCEEDS', 'SUCCESSFUL', 'SUM', 'SUMMARY', 'SUSPEND', 'SYMMETRIC',
240+
'SYNONYM', 'SYSDATE', 'SYSTEM', 'SYSTEM_TIME', 'SYSTEM_USER',
241+
'SYSTIMESTAMP', 'TABLE', 'TABLESAMPLE', 'TABLESPACE', 'TAN', 'TANH',
242+
'TBL_CS', 'TEMPORARY', 'TERMINATE', 'TERMINATED', 'TEXTSIZE', 'THAN',
243+
'THEN', 'THRESHOLD', 'TIME', 'TIMESTAMP', 'TIMEZONE_HOUR',
244+
'TIMEZONE_MINUTE', 'TINYBLOB', 'TINYINT', 'TINYTEXT', 'TITLE', 'TO',
245+
'TOP', 'TRACE', 'TRAILING', 'TRAN', 'TRANSACTION', 'TRANSLATE',
246+
'TRANSLATE_CHK', 'TRANSLATE_REGEX', 'TRANSLATION', 'TREAT', 'TRIGGER',
247+
'TRIM', 'TRIM_ARRAY', 'TRUE', 'TRUNCATE', 'TRY_CONVERT', 'TSEQUAL',
248+
'TYPE', 'UC', 'UESCAPE', 'UID', 'UNDEFINED', 'UNDER', 'UNDO', 'UNION',
249+
'UNIQUE', 'UNKNOWN', 'UNLOCK', 'UNNEST', 'UNPIVOT', 'UNSIGNED',
250+
'UNTIL', 'UPD', 'UPDATE', 'UPDATETEXT', 'UPPER', 'UPPERCASE', 'USAGE',
251+
'USE', 'USER', 'USING', 'UTC_DATE', 'UTC_TIME', 'UTC_TIMESTAMP',
252+
'VALIDATE', 'VALIDPROC', 'VALUE', 'VALUE_OF', 'VALUES', 'VAR_POP',
253+
'VAR_SAMP', 'VARBINARY', 'VARBYTE', 'VARCHAR', 'VARCHAR2',
254+
'VARCHARACTER', 'VARGRAPHIC', 'VARIABLE', 'VARIADIC', 'VARIANT',
255+
'VARYING', 'VCAT', 'VERBOSE', 'VERSIONING', 'VIEW', 'VIRTUAL',
256+
'VOLATILE', 'VOLUMES', 'WAIT', 'WAITFOR', 'WHEN', 'WHENEVER', 'WHERE',
257+
'WHILE', 'WIDTH_BUCKET', 'WINDOW', 'WITH', 'WITHIN', 'WITHIN_GROUP',
258+
'WITHOUT', 'WLM', 'WORK', 'WRITE', 'WRITETEXT', 'XMLCAST', 'XMLEXISTS',
259+
'XMLNAMESPACES', 'XOR', 'YEAR', 'YEAR_MONTH', 'YEARS', 'ZEROFILL',
260+
'ZEROIFNULL', 'ZONE',
261+
];
262+
102263
/**
103264
* @param EntityFactoryInterface $entityFactory
104265
* @param Logger $logger
@@ -505,6 +666,9 @@ protected function _renderOrders()
505666
{
506667
if (!$this->_isOrdersRendered) {
507668
foreach ($this->_orders as $field => $direction) {
669+
if (in_array(strtoupper($field), self::SQL_RESERVED_WORDS)) {
670+
$field = "`$field`";
671+
}
508672
$this->_select->order(new \Zend_Db_Expr($field . ' ' . $direction));
509673
}
510674
$this->_isOrdersRendered = true;

0 commit comments

Comments
 (0)