CloudWatch: Metric Insights builder should wrap keywords in quotes (#95742)

This commit is contained in:
Isabella Siu 2024-11-01 18:00:54 -04:00 committed by GitHub
parent 403b60723d
commit d0ba4f18d3
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 946 additions and 10 deletions

View File

@ -69,6 +69,13 @@ describe('SQLGenerator', () => {
`SELECT COUNT("4xxErrorRate") FROM SCHEMA("AWS/EC2")`
);
});
it('should wrap in double quotes if metric name is a reserved keyword ', () => {
const select = createFunctionWithParameter('SUM', ['Count']);
expect(new SQLGenerator(mockTemplateSrv).expressionToSqlQuery({ ...baseQuery, select })).toEqual(
`SELECT SUM("Count") FROM SCHEMA("AWS/EC2")`
);
});
});
describe('from', () => {
@ -218,7 +225,7 @@ describe('SQLGenerator', () => {
// In this scenario, the parenthesis are redundant. However, they're not doing any harm and it would be really complicated to remove them
assertQueryEndsWith(
{ sql: { where: filter } },
`WHERE "Instance.Type" = 'I-123' AND (InstanceId != 'I-456' AND Type != 'some-type')`
`WHERE "Instance.Type" = 'I-123' AND (InstanceId != 'I-456' AND "Type" != 'some-type')`
);
});
@ -235,7 +242,7 @@ describe('SQLGenerator', () => {
);
assertQueryEndsWith(
{ sql: { where: filter } },
`WHERE InstanceId = 'I-123' AND (InstanceId != 'I-456' OR Type != 'some-type')`
`WHERE InstanceId = 'I-123' AND (InstanceId != 'I-456' OR "Type" != 'some-type')`
);
});
@ -256,7 +263,7 @@ describe('SQLGenerator', () => {
assertQueryEndsWith(
{ sql: { where: filter } },
`WHERE (InstanceId = 'I-123' AND Type != 'some-type') AND (InstanceId != 'I-456' OR Type != 'some-type')`
`WHERE (InstanceId = 'I-123' AND "Type" != 'some-type') AND (InstanceId != 'I-456' OR "Type" != 'some-type')`
);
});
@ -276,7 +283,7 @@ describe('SQLGenerator', () => {
);
assertQueryEndsWith(
{ sql: { where: filter } },
`WHERE (InstanceId = 'I-123' OR Type != 'some-type') OR (InstanceId != 'I-456' OR Type != 'some-type')`
`WHERE (InstanceId = 'I-123' OR "Type" != 'some-type') OR (InstanceId != 'I-456' OR "Type" != 'some-type')`
);
});
@ -291,7 +298,7 @@ describe('SQLGenerator', () => {
);
assertQueryEndsWith(
{ sql: { where: filter } },
`WHERE InstanceId = 'I-123' OR Type != 'some-type' OR InstanceId != 'I-456'`
`WHERE InstanceId = 'I-123' OR "Type" != 'some-type' OR InstanceId != 'I-456'`
);
});
@ -306,7 +313,7 @@ describe('SQLGenerator', () => {
);
assertQueryEndsWith(
{ sql: { where: filter } },
`WHERE InstanceId = 'I-123' AND Type != 'some-type' AND InstanceId != 'I-456'`
`WHERE InstanceId = 'I-123' AND "Type" != 'some-type' AND InstanceId != 'I-456'`
);
});
});
@ -324,7 +331,7 @@ describe('SQLGenerator', () => {
[createGroupBy('InstanceId'), createGroupBy('Type'), createGroupBy('Group')],
QueryEditorExpressionType.And
);
assertQueryEndsWith({ sql: { groupBy } }, `GROUP BY InstanceId, Type, Group`);
assertQueryEndsWith({ sql: { groupBy } }, `GROUP BY InstanceId, "Type", "Group"`);
});
});
@ -380,7 +387,7 @@ describe('SQLGenerator', () => {
limit: 100,
};
expect(new SQLGenerator(mockTemplateSrv).expressionToSqlQuery(query)).toEqual(
`SELECT COUNT(DroppedBytes) FROM SCHEMA("AWS/MQ", InstanceId, "Instance-Group") WHERE (InstanceId = 'I-123' OR Type != 'some-type') AND (InstanceId != 'I-456' OR Type != 'some-type') GROUP BY InstanceId, InstanceType ORDER BY COUNT() DESC LIMIT 100`
`SELECT COUNT(DroppedBytes) FROM SCHEMA("AWS/MQ", InstanceId, "Instance-Group") WHERE (InstanceId = 'I-123' OR "Type" != 'some-type') AND (InstanceId != 'I-456' OR "Type" != 'some-type') GROUP BY InstanceId, InstanceType ORDER BY COUNT() DESC LIMIT 100`
);
});
});
@ -416,7 +423,7 @@ describe('SQLGenerator', () => {
limit: 100,
};
expect(new SQLGenerator(templateService).expressionToSqlQuery(query)).toEqual(
`SELECT $aggregation($metric) FROM SCHEMA(\"$namespace\", $labels) WHERE (InstanceId = 'I-123' OR Type != 'some-type') AND (InstanceId != 'I-456' OR Type != 'some-type') GROUP BY $labels ORDER BY $aggregation() DESC LIMIT 100`
`SELECT $aggregation($metric) FROM SCHEMA(\"$namespace\", $labels) WHERE (InstanceId = 'I-123' OR "Type" != 'some-type') AND (InstanceId != 'I-456' OR "Type" != 'some-type') GROUP BY $labels ORDER BY $aggregation() DESC LIMIT 100`
);
});
});

View File

@ -1,3 +1,5 @@
import { toLower } from 'lodash';
import { getTemplateSrv, TemplateSrv } from '@grafana/runtime';
import {
@ -10,6 +12,8 @@ import {
} from '../../expressions';
import { SQLExpression } from '../../types';
import { InsightsReservedKeywords } from './consts';
const isAccountIdDefined = (accountId: string | undefined): boolean => !!(accountId && accountId !== 'all');
export default class SQLGenerator {
@ -162,7 +166,11 @@ export default class SQLGenerator {
const interpolated = this.templateSrv.replace(label, {}, 'raw');
if (interpolated !== 'AWS.AccountId') {
// AWS.AccountId should never be in quotes
if (specialCharacters.test(interpolated) || startsWithNumber.test(interpolated)) {
if (
specialCharacters.test(interpolated) ||
startsWithNumber.test(interpolated) ||
InsightsReservedKeywords.some((e) => toLower(e) === toLower(interpolated))
) {
return `"${label}"`;
}
}

View File

@ -0,0 +1,921 @@
// Array of reserved keywords in metrics insights, taken from
//https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/cloudwatch-metrics-insights-reserved-keywords.html
export const InsightsReservedKeywords = [
'ABORT',
'ABORTSESSION',
'ABS',
'ABSOLUTE',
'ACCESS',
'ACCESSIBLE',
'ACCESS_LOCK',
'ACCOUNT',
'ACOS',
'ACOSH',
'ACTION',
'ADD',
'ADD_MONTHS',
'ADMIN',
'AFTER',
'AGGREGATE',
'ALIAS',
'ALL',
'ALLOCATE',
'ALLOW',
'ALTER',
'ALTERAND',
'AMP',
'ANALYSE',
'ANALYZE',
'AND',
'ANSIDATE',
'ANY',
'ARE',
'ARRAY',
'ARRAY_AGG',
'ARRAY_EXISTS',
'ARRAY_MAX_CARDINALITY',
'AS',
'ASC',
'ASENSITIVE',
'ASIN',
'ASINH',
'ASSERTION',
'ASSOCIATE',
'ASUTIME',
'ASYMMETRIC',
'AT',
'ATAN',
'ATAN2',
'ATANH',
'ATOMIC',
'AUDIT',
'AUTHORIZATION',
'AUX',
'AUXILIARY',
'AVE',
'AVERAGE',
'AVG',
'BACKUP',
'BEFORE',
'BEGIN',
'BEGIN_FRAME',
'BEGIN_PARTITION',
'BETWEEN',
'BIGINT',
'BINARY',
'BIT',
'BLOB',
'BOOLEAN',
'BOTH',
'BREADTH',
'BREAK',
'BROWSE',
'BT',
'BUFFERPOOL',
'BULK',
'BUT',
'BY',
'BYTE',
'BYTEINT',
'BYTES',
'CALL',
'CALLED',
'CAPTURE',
'CARDINALITY',
'CASCADE',
'CASCADED',
'CASE',
'CASESPECIFIC',
'CASE_N',
'CAST',
'CATALOG',
'CCSID',
'CD',
'CEIL',
'CEILING',
'CHANGE',
'CHAR',
'CHAR2HEXINT',
'CHARACTER',
'CHARACTERS',
'CHARACTER_LENGTH',
'CHARS',
'CHAR_LENGTH',
'CHECK',
'CHECKPOINT',
'CLASS',
'CLASSIFIER',
'CLOB',
'CLONE',
'CLOSE',
'CLUSTER',
'CLUSTERED',
'CM',
'COALESCE',
'COLLATE',
'COLLATION',
'COLLECT',
'COLLECTION',
'COLLID',
'COLUMN',
'COLUMN_VALUE',
'COMMENT',
'COMMIT',
'COMPLETION',
'COMPRESS',
'COMPUTE',
'CONCAT',
'CONCURRENTLY',
'CONDITION',
'CONNECT',
'CONNECTION',
'CONSTRAINT',
'CONSTRAINTS',
'CONSTRUCTOR',
'CONTAINS',
'CONTAINSTABLE',
'CONTENT',
'CONTINUE',
'CONVERT',
'CONVERT_TABLE_HEADER',
'COPY',
'CORR',
'CORRESPONDING',
'COS',
'COSH',
'COUNT',
'COVAR_POP',
'COVAR_SAMP',
'CREATE',
'CROSS',
'CS',
'CSUM',
'CT',
'CUBE',
'CUME_DIST',
'CURRENT',
'CURRENT_CATALOG',
'CURRENT_DATE',
'CURRENT_DEFAULT_TRANSFORM_GROUP',
'CURRENT_LC_CTYPE',
'CURRENT_PATH',
'CURRENT_ROLE',
'CURRENT_ROW',
'CURRENT_SCHEMA',
'CURRENT_SERVER',
'CURRENT_TIME',
'CURRENT_TIMESTAMP',
'CURRENT_TIMEZONE',
'CURRENT_TRANSFORM_GROUP_FOR_TYPE',
'CURRENT_USER',
'CURRVAL',
'CURSOR',
'CV',
'CYCLE',
'DATA',
'DATABASE',
'DATABASES',
'DATABLOCKSIZE',
'DATE',
'DATEFORM',
'DAY',
'DAYS',
'DAY_HOUR',
'DAY_MICROSECOND',
'DAY_MINUTE',
'DAY_SECOND',
'DBCC',
'DBINFO',
'DEALLOCATE',
'DEC',
'DECFLOAT',
'DECIMAL',
'DECLARE',
'DEFAULT',
'DEFERRABLE',
'DEFERRED',
'DEFINE',
'DEGREES',
'DEL',
'DELAYED',
'DELETE',
'DENSE_RANK',
'DENY',
'DEPTH',
'DEREF',
'DESC',
'DESCRIBE',
'DESCRIPTOR',
'DESTROY',
'DESTRUCTOR',
'DETERMINISTIC',
'DIAGNOSTIC',
'DIAGNOSTICS',
'DICTIONARY',
'DISABLE',
'DISABLED',
'DISALLOW',
'DISCONNECT',
'DISK',
'DISTINCT',
'DISTINCTROW',
'DISTRIBUTED',
'DIV',
'DO',
'DOCUMENT',
'DOMAIN',
'DOUBLE',
'DROP',
'DSSIZE',
'DUAL',
'DUMP',
'DYNAMIC',
'EACH',
'ECHO',
'EDITPROC',
'ELEMENT',
'ELSE',
'ELSEIF',
'EMPTY',
'ENABLED',
'ENCLOSED',
'ENCODING',
'ENCRYPTION',
'END',
'END-EXEC',
'ENDING',
'END_FRAME',
'END_PARTITION',
'EQ',
'EQUALS',
'ERASE',
'ERRLVL',
'ERROR',
'ERRORFILES',
'ERRORTABLES',
'ESCAPE',
'ESCAPED',
'ET',
'EVERY',
'EXCEPT',
'EXCEPTION',
'EXCLUSIVE',
'EXEC',
'EXECUTE',
'EXISTS',
'EXIT',
'EXP',
'EXPLAIN',
'EXTERNAL',
'EXTRACT',
'FALLBACK',
'FALSE',
'FASTEXPORT',
'FENCED',
'FETCH',
'FIELDPROC',
'FILE',
'FILLFACTOR',
'FILTER',
'FINAL',
'FIRST',
'FIRST_VALUE',
'FLOAT',
'FLOAT4',
'FLOAT8',
'FLOOR',
'FOR',
'FORCE',
'FOREIGN',
'FORMAT',
'FOUND',
'FRAME_ROW',
'FREE',
'FREESPACE',
'FREETEXT',
'FREETEXTTABLE',
'FREEZE',
'FROM',
'FULL',
'FULLTEXT',
'FUNCTION',
'FUSION',
'GE',
'GENERAL',
'GENERATED',
'GET',
'GIVE',
'GLOBAL',
'GO',
'GOTO',
'GRANT',
'GRAPHIC',
'GROUP',
'GROUPING',
'GROUPS',
'GT',
'HANDLER',
'HASH',
'HASHAMP',
'HASHBAKAMP',
'HASHBUCKET',
'HASHROW',
'HAVING',
'HELP',
'HIGH_PRIORITY',
'HOLD',
'HOLDLOCK',
'HOUR',
'HOURS',
'HOUR_MICROSECOND',
'HOUR_MINUTE',
'HOUR_SECOND',
'IDENTIFIED',
'IDENTITY',
'IDENTITYCOL',
'IDENTITY_INSERT',
'IF',
'IGNORE',
'ILIKE',
'IMMEDIATE',
'IN',
'INCLUSIVE',
'INCONSISTENT',
'INCREMENT',
'INDEX',
'INDICATOR',
'INFILE',
'INHERIT',
'INITIAL',
'INITIALIZE',
'INITIALLY',
'INITIATE',
'INNER',
'INOUT',
'INPUT',
'INS',
'INSENSITIVE',
'INSERT',
'INSTEAD',
'INT',
'INT1',
'INT2',
'INT3',
'INT4',
'INT8',
'INTEGER',
'INTEGERDATE',
'INTERSECT',
'INTERSECTION',
'INTERVAL',
'INTO',
'IO_AFTER_GTIDS',
'IO_BEFORE_GTIDS',
'IS',
'ISNULL',
'ISOBID',
'ISOLATION',
'ITERATE',
'JAR',
'JOIN',
'JOURNAL',
'JSON_ARRAY',
'JSON_ARRAYAGG',
'JSON_EXISTS',
'JSON_OBJECT',
'JSON_OBJECTAGG',
'JSON_QUERY',
'JSON_TABLE',
'JSON_TABLE_PRIMITIVE',
'JSON_VALUE',
'KEEP',
'KEY',
'KEYS',
'KILL',
'KURTOSIS',
'LABEL',
'LAG',
'LANGUAGE',
'LARGE',
'LAST',
'LAST_VALUE',
'LATERAL',
'LC_CTYPE',
'LE',
'LEAD',
'LEADING',
'LEAVE',
'LEFT',
'LESS',
'LEVEL',
'LIKE',
'LIKE_REGEX',
'LIMIT',
'LINEAR',
'LINENO',
'LINES',
'LISTAGG',
'LN',
'LOAD',
'LOADING',
'LOCAL',
'LOCALE',
'LOCALTIME',
'LOCALTIMESTAMP',
'LOCATOR',
'LOCATORS',
'LOCK',
'LOCKING',
'LOCKMAX',
'LOCKSIZE',
'LOG',
'LOG10',
'LOGGING',
'LOGON',
'LONG',
'LONGBLOB',
'LONGTEXT',
'LOOP',
'LOWER',
'LOW_PRIORITY',
'LT',
'MACRO',
'MAINTAINED',
'MAP',
'MASTER_BIND',
'MASTER_SSL_VERIFY_SERVER_CERT',
'MATCH',
'MATCHES',
'MATCH_NUMBER',
'MATCH_RECOGNIZE',
'MATERIALIZED',
'MAVG',
'MAX',
'MAXEXTENTS',
'MAXIMUM',
'MAXVALUE',
'MCHARACTERS',
'MDIFF',
'MEDIUMBLOB',
'MEDIUMINT',
'MEDIUMTEXT',
'MEMBER',
'MERGE',
'METHOD',
'MICROSECOND',
'MICROSECONDS',
'MIDDLEINT',
'MIN',
'MINDEX',
'MINIMUM',
'MINUS',
'MINUTE',
'MINUTES',
'MINUTE_MICROSECOND',
'MINUTE_SECOND',
'MLINREG',
'MLOAD',
'MLSLABEL',
'MOD',
'MODE',
'MODIFIES',
'MODIFY',
'MODULE',
'MONITOR',
'MONRESOURCE',
'MONSESSION',
'MONTH',
'MONTHS',
'MSUBSTR',
'MSUM',
'MULTISET',
'NAMED',
'NAMES',
'NATIONAL',
'NATURAL',
'NCHAR',
'NCLOB',
'NE',
'NESTED_TABLE_ID',
'NEW',
'NEW_TABLE',
'NEXT',
'NEXTVAL',
'NO',
'NOAUDIT',
'NOCHECK',
'NOCOMPRESS',
'NONCLUSTERED',
'NONE',
'NORMALIZE',
'NOT',
'NOTNULL',
'NOWAIT',
'NO_WRITE_TO_BINLOG',
'NTH_VALUE',
'NTILE',
'NULL',
'NULLIF',
'NULLIFZERO',
'NULLS',
'NUMBER',
'NUMERIC',
'NUMPARTS',
'OBID',
'OBJECT',
'OBJECTS',
'OCCURRENCES_REGEX',
'OCTET_LENGTH',
'OF',
'OFF',
'OFFLINE',
'OFFSET',
'OFFSETS',
'OLD',
'OLD_TABLE',
'OMIT',
'ON',
'ONE',
'ONLINE',
'ONLY',
'OPEN',
'OPENDATASOURCE',
'OPENQUERY',
'OPENROWSET',
'OPENXML',
'OPERATION',
'OPTIMIZATION',
'OPTIMIZE',
'OPTIMIZER_COSTS',
'OPTION',
'OPTIONALLY',
'OR',
'ORDER',
'ORDINALITY',
'ORGANIZATION',
'OUT',
'OUTER',
'OUTFILE',
'OUTPUT',
'OVER',
'OVERLAPS',
'OVERLAY',
'OVERRIDE',
'PACKAGE',
'PAD',
'PADDED',
'PARAMETER',
'PARAMETERS',
'PART',
'PARTIAL',
'PARTITION',
'PARTITIONED',
'PARTITIONING',
'PASSWORD',
'PATH',
'PATTERN',
'PCTFREE',
'PER',
'PERCENT',
'PERCENTILE',
'PERCENTILE_CONT',
'PERCENTILE_DISC',
'PERCENT_RANK',
'PERIOD',
'PERM',
'PERMANENT',
'PIECESIZE',
'PIVOT',
'PLACING',
'PLAN',
'PORTION',
'POSITION',
'POSITION_REGEX',
'POSTFIX',
'POWER',
'PRECEDES',
'PRECISION',
'PREFIX',
'PREORDER',
'PREPARE',
'PRESERVE',
'PREVVAL',
'PRIMARY',
'PRINT',
'PRIOR',
'PRIQTY',
'PRIVATE',
'PRIVILEGES',
'PROC',
'PROCEDURE',
'PROFILE',
'PROGRAM',
'PROPORTIONAL',
'PROTECTION',
'PSID',
'PTF',
'PUBLIC',
'PURGE',
'QUALIFIED',
'QUALIFY',
'QUANTILE',
'QUERY',
'QUERYNO',
'RADIANS',
'RAISERROR',
'RANDOM',
'RANGE',
'RANGE_N',
'RANK',
'RAW',
'READ',
'READS',
'READTEXT',
'READ_WRITE',
'REAL',
'RECONFIGURE',
'RECURSIVE',
'REF',
'REFERENCES',
'REFERENCING',
'REFRESH',
'REGEXP',
'REGR_AVGX',
'REGR_AVGY',
'REGR_COUNT',
'REGR_INTERCEPT',
'REGR_R2',
'REGR_SLOPE',
'REGR_SXX',
'REGR_SXY',
'REGR_SYY',
'RELATIVE',
'RELEASE',
'RENAME',
'REPEAT',
'REPLACE',
'REPLICATION',
'REPOVERRIDE',
'REQUEST',
'REQUIRE',
'RESIGNAL',
'RESOURCE',
'RESTART',
'RESTORE',
'RESTRICT',
'RESULT',
'RESULT_SET_LOCATOR',
'RESUME',
'RET',
'RETRIEVE',
'RETURN',
'RETURNING',
'RETURNS',
'REVALIDATE',
'REVERT',
'REVOKE',
'RIGHT',
'RIGHTS',
'RLIKE',
'ROLE',
'ROLLBACK',
'ROLLFORWARD',
'ROLLUP',
'ROUND_CEILING',
'ROUND_DOWN',
'ROUND_FLOOR',
'ROUND_HALF_DOWN',
'ROUND_HALF_EVEN',
'ROUND_HALF_UP',
'ROUND_UP',
'ROUTINE',
'ROW',
'ROWCOUNT',
'ROWGUIDCOL',
'ROWID',
'ROWNUM',
'ROWS',
'ROWSET',
'ROW_NUMBER',
'RULE',
'RUN',
'RUNNING',
'SAMPLE',
'SAMPLEID',
'SAVE',
'SAVEPOINT',
'SCHEMA',
'SCHEMAS',
'SCOPE',
'SCRATCHPAD',
'SCROLL',
'SEARCH',
'SECOND',
'SECONDS',
'SECOND_MICROSECOND',
'SECQTY',
'SECTION',
'SECURITY',
'SECURITYAUDIT',
'SEEK',
'SEL',
'SELECT',
'SEMANTICKEYPHRASETABLE',
'SEMANTICSIMILARITYDETAILSTABLE',
'SEMANTICSIMILARITYTABLE',
'SENSITIVE',
'SEPARATOR',
'SEQUENCE',
'SESSION',
'SESSION_USER',
'SET',
'SETRESRATE',
'SETS',
'SETSESSRATE',
'SETUSER',
'SHARE',
'SHOW',
'SHUTDOWN',
'SIGNAL',
'SIMILAR',
'SIMPLE',
'SIN',
'SINH',
'SIZE',
'SKEW',
'SKIP',
'SMALLINT',
'SOME',
'SOUNDEX',
'SOURCE',
'SPACE',
'SPATIAL',
'SPECIFIC',
'SPECIFICTYPE',
'SPOOL',
'SQL',
'SQLEXCEPTION',
'SQLSTATE',
'SQLTEXT',
'SQLWARNING',
'SQL_BIG_RESULT',
'SQL_CALC_FOUND_ROWS',
'SQL_SMALL_RESULT',
'SQRT',
'SS',
'SSL',
'STANDARD',
'START',
'STARTING',
'STARTUP',
'STAT',
'STATE',
'STATEMENT',
'STATIC',
'STATISTICS',
'STAY',
'STDDEV_POP',
'STDDEV_SAMP',
'STEPINFO',
'STOGROUP',
'STORED',
'STORES',
'STRAIGHT_JOIN',
'STRING_CS',
'STRUCTURE',
'STYLE',
'SUBMULTISET',
'SUBSCRIBER',
'SUBSET',
'SUBSTR',
'SUBSTRING',
'SUBSTRING_REGEX',
'SUCCEEDS',
'SUCCESSFUL',
'SUM',
'SUMMARY',
'SUSPEND',
'SYMMETRIC',
'SYNONYM',
'SYSDATE',
'SYSTEM',
'SYSTEM_TIME',
'SYSTEM_USER',
'SYSTIMESTAMP',
'TABLE',
'TABLESAMPLE',
'TABLESPACE',
'TAN',
'TANH',
'TBL_CS',
'TEMPORARY',
'TERMINATE',
'TERMINATED',
'TEXTSIZE',
'THAN',
'THEN',
'THRESHOLD',
'TIME',
'TIMESTAMP',
'TIMEZONE_HOUR',
'TIMEZONE_MINUTE',
'TINYBLOB',
'TINYINT',
'TINYTEXT',
'TITLE',
'TO',
'TOP',
'TRACE',
'TRAILING',
'TRAN',
'TRANSACTION',
'TRANSLATE',
'TRANSLATE_CHK',
'TRANSLATE_REGEX',
'TRANSLATION',
'TREAT',
'TRIGGER',
'TRIM',
'TRIM_ARRAY',
'TRUE',
'TRUNCATE',
'TRY_CONVERT',
'TSEQUAL',
'TYPE',
'UC',
'UESCAPE',
'UID',
'UNDEFINED',
'UNDER',
'UNDO',
'UNION',
'UNIQUE',
'UNKNOWN',
'UNLOCK',
'UNNEST',
'UNPIVOT',
'UNSIGNED',
'UNTIL',
'UPD',
'UPDATE',
'UPDATETEXT',
'UPPER',
'UPPERCASE',
'USAGE',
'USE',
'USER',
'USING',
'UTC_DATE',
'UTC_TIME',
'UTC_TIMESTAMP',
'VALIDATE',
'VALIDPROC',
'VALUE',
'VALUES',
'VALUE_OF',
'VARBINARY',
'VARBYTE',
'VARCHAR',
'VARCHAR2',
'VARCHARACTER',
'VARGRAPHIC',
'VARIABLE',
'VARIADIC',
'VARIANT',
'VARYING',
'VAR_POP',
'VAR_SAMP',
'VCAT',
'VERBOSE',
'VERSIONING',
'VIEW',
'VIRTUAL',
'VOLATILE',
'VOLUMES',
'WAIT',
'WAITFOR',
'WHEN',
'WHENEVER',
'WHERE',
'WHILE',
'WIDTH_BUCKET',
'WINDOW',
'WITH',
'WITHIN',
'WITHIN_GROUP',
'WITHOUT',
'WLM',
'WORK',
'WRITE',
'WRITETEXT',
'XMLCAST',
'XMLEXISTS',
'XMLNAMESPACES',
'XOR',
'YEAR',
'YEARS',
'YEAR_MONTH',
'ZEROFILL',
'ZEROIFNULL',
'ZONE',
];