|
| 1 | +; Lexical forms |
| 2 | +[ |
| 3 | + (semicolon_comment) |
| 4 | + (bang_comment) |
| 5 | + (block_comment) |
| 6 | +] @comment |
| 7 | + |
| 8 | +(directive |
| 9 | + marker: (directive_marker) @punctuation.special |
| 10 | + name: (directive_name) @preproc |
| 11 | + arguments: (directive_arguments)? @string.special) |
| 12 | +(label_directive name: (identifier) @label) |
| 13 | +(line_continuation) @punctuation.special |
| 14 | + |
| 15 | +(string_literal) @string |
| 16 | +[ |
| 17 | + (integer_literal) |
| 18 | + (wide_integer_literal) |
| 19 | + (real_literal) |
| 20 | +] @number |
| 21 | +(boolean_literal) @boolean |
| 22 | +(null_literal) @constant.builtin |
| 23 | +(pseudo_column) @constant.builtin |
| 24 | +(prompt_parameter) @variable.special |
| 25 | +(data_type) @type.builtin |
| 26 | + |
| 27 | +; Identifiers default to variables. More specific patterns below override this. |
| 28 | +(identifier) @variable |
| 29 | + |
| 30 | +; Complete modern Discern Explorer reserved-variable index. The documentation |
| 31 | +; repeats CURNETDOMAIN where its description names CURNETDOMAINID; both names |
| 32 | +; are intentionally recognized. Function and table captures below take final |
| 33 | +; precedence when a documented name is valid in more than one context. |
| 34 | +((identifier) @variable.special |
| 35 | + (#match? @variable.special "(?i)^(COL|CURACCEPT|CURBATCH|CURBEDROCK|CURCCLREV|CURCCLVER|CURCLIENTID|CURCLK|CURDATE|CURDOMAIN|CURECHO|CURENDREPORT|CURENV|CURGROUP|CURHELP|CURIMAGE|CURLOCALE|CURLOGDOMAIN|CURLOGDOMAINID|CURMAXVARLEN|CURMEM|CURNETDOMAIN|CURNETDOMAINID|CURNODE|CURPAGE|CURPRCNAME|CURPROG|CURQUAL|CURRDB|CURRDBACCESS|CURRDBHANDLE|CURRDBLINK|CURRDBNAME|CURRDBOPT|CURRDBSYS|CURRDBUSER|CURRDBVER|CURREF|CURRETURN|CURREV|CURREVHNAM|CURREVMINOR|CURREVMINOR2|CURSCROLL|CURSERVER|CURSOURCE|CURSUB|CURSYS|CURSYS2|CURSYSBIT|CURTIME|CURTIME2|CURTIME3|CURTIMEZONE|CURTIMEZONEAPP|CURTIMEZONEDEF|CURTIMEZONESYS|CURUSER|CURUTC|CURUTCDIFF|CURWORK|FALSE|MAXCOL|MAXROW|ROW|SYSDATE|SYSTIMESTAMP|TRUE)$")) |
| 36 | +((boolean_literal) @variable.special |
| 37 | + (#match? @variable.special "(?i)^(FALSE|TRUE)$")) |
| 38 | + |
| 39 | +(program_definition name: (qualified_identifier) @title) |
| 40 | +(drop_program_statement name: (qualified_identifier) @title) |
| 41 | + |
| 42 | +(subroutine_definition name: (qualified_identifier) @function) |
| 43 | +(subroutine_declaration name: (qualified_identifier) @function) |
| 44 | + |
| 45 | +(call_expression function: (identifier) @function) |
| 46 | +(call_expression |
| 47 | + function: (namespace_expression |
| 48 | + name: (identifier) @function)) |
| 49 | +(call_expression |
| 50 | + function: (member_expression |
| 51 | + member: (identifier) @function)) |
| 52 | + |
| 53 | +; The function-name allowlist is sourced from Oracle's Functions Reference. |
| 54 | +; Calls remain syntactically unrestricted; these predicates only add color. |
| 55 | +(call_expression |
| 56 | + function: (identifier) @function.builtin |
| 57 | + (#match? @function.builtin "(?i)^(ABS|AESDECRYPT|AESDECRYPTFILE|AESENCRYPT|AESENCRYPTFILE|ALTER|ALTER2|ALTER3|ALTERLIST|ARRAYJOIN|ARRAYSPLIT|ASIS|ASSIGN|ASSIGN2|ASSIGN3|AVG|BAND|BLOBGET|BLOBGETLEN|BNOT|BOR|BSHIFT|BTEST|BUILD|BUILD2|BUILD2CHK|BUILD3|BXOR|CALCPOS|CALLPRG|CALLR|CCLIO|CCLFMT|CCLREGEXP|CCLTIMER|CEIL|CHAR|CHECK|CHECKDIC|CHECKFUN|CHECKPRG|CHECKQUEUE|CLASS|CLASSREF|CNVTACC|CNVTAGE|CNVTAGE2|CNVTAGEDATETIME|CNVTALIAS|CNVTALPHANUM|CNVTBOOL|CNVTB10B16|CNVTB10B36|CNVTB16B10|CNVTB36B10|CNVTCAP|CNVTDATE|CNVTDATE2|CNVTDATETIME|CNVTDATETIME2|CNVTDATETIMERDB|CNVTDATETIMEUTC|CNVTDATETIMEUTC2|CNVTDATETIMEUTC3|CNVTHEXRAW|CNVTINT|CNVTJSONTOREC|CNVTLOOKAHEAD|CNVTLOOKBEHIND|CNVTLONG|CNVTLOWER|CNVTMIN|CNVTMIN2|CNVTNLS|CNVTNLSSORT|CNVTPHONE|CNVTRAWHEX|CNVTREAL|CNVTRECTOJSON|CNVTRECTOXML|CNVTSTRING|CNVTSTRINGCHK|CNVTTIME|CNVTTIME2|CNVTTIME3|CNVTTIMESTAMP|CNVTUPPER|CNVTXMLTOREC|CONCAT|COPYREC|COST|COUNT|CUBE|CUME_DIST|CURCODECOVER|CURFILE|CURLOB|CURLOCALE|CURMEM|CURPROG|CURSUB|DATEBIRTHFORMAT|DATEDECEASEDFORMAT|DATETIMEADD|DATETIMECMP|DATETIMECMPUTC|DATETIMEDIFF|DATETIMEFIND|DATETIMEPART|DATETIMETRUNC|DATETIMEZONE|DATETIMEZONEBYINDEX|DATETIMEZONEBYNAME|DATETIMEZONEFORMAT|DATETIMEZONEUTC|DAY|DECODE|DENSE_RANK|ERROR|EVALUATE|EVALUATE2|EVEN|EXP|EXPAND|FILLSTRING|FINDFILE|FINDSTRING|FLOOR|FORMAT|GREATEST|HOUR|ICHAR|INITARRAY|INITREC|ISNUMERIC|JULIAN|LEAST|LIST|LISTAGG|LOCATEVAL|LOCATEVALSORT|LOG|LOG10|LOGICAL|MAP|MAX|MAXREC|MAXVAL|MEDIAN|MEMALLOC|MEMFREE|MEMREALLOC|MIN|MINUTE|MINVAL|MOD|MODIFY|MODCHECK|MONTH|MOVEREC|MOVERECLIST|MOVESTRING|NEGATE|NOPATSTRING|NORDBBIND|NOTRIM|NTILE|NULL|NULLCHECK|NULLFMT|NULLIND|NULLTERM|NULLVAL|OPERATOR|ORDERDIR|OUTERJOIN|PARAMETER|PARAMETER2|PARSER|PATSTRING|PERCENT|PERCENT_RANK|PERCENTILE|PERCENTILE_CONT|PERCENTILE_DISC|PIECE|PROXYUSER|RAND|RANK|RDBBIND|RECTRAVERSE|REFLECT|REMOVE|RENAMEREC|REPLACE|REPORTINFO|REPORTROW|ROLLUP|ROUND|ROW_NUMBER|SELECTIVITY|SEQ|SIZE|SORT|SORTSEARCH|SOUND|SOUNDEX|SQLPASSTHRU|STDDEV|SUBSTRING|SUM|TABLEREF|TDBEXECUTE|TEXT|TEXTLEN|TIMESTAMPDIFF|TRACE|TRIM|TRIMBIND|TYPE|VALIDATE|VALUE|VARIANCE|WEEKDAY|WTMODCHECK|YEAR|UAR_GET_CODE_BY|UAR_GET_CODE_DESCRIPTION|UAR_GET_CODE_DISPLAY|UAR_GET_CODE_MEANING|UAR_GET_DEFINITION|UAR_GET_DISPLAYKEY|UAR_GET_MEANING_BY_CODESET)$")) |
| 58 | +(call_expression |
| 59 | + function: (namespace_expression |
| 60 | + name: (identifier) @function.builtin) |
| 61 | + (#match? @function.builtin "(?i)^(ABS|AESDECRYPT|AESDECRYPTFILE|AESENCRYPT|AESENCRYPTFILE|ALTER|ALTER2|ALTER3|ALTERLIST|ARRAYJOIN|ARRAYSPLIT|ASIS|ASSIGN|ASSIGN2|ASSIGN3|AVG|BAND|BLOBGET|BLOBGETLEN|BNOT|BOR|BSHIFT|BTEST|BUILD|BUILD2|BUILD2CHK|BUILD3|BXOR|CALCPOS|CALLPRG|CALLR|CCLIO|CCLFMT|CCLREGEXP|CCLTIMER|CEIL|CHAR|CHECK|CHECKDIC|CHECKFUN|CHECKPRG|CHECKQUEUE|CLASS|CLASSREF|CNVTACC|CNVTAGE|CNVTAGE2|CNVTAGEDATETIME|CNVTALIAS|CNVTALPHANUM|CNVTBOOL|CNVTB10B16|CNVTB10B36|CNVTB16B10|CNVTB36B10|CNVTCAP|CNVTDATE|CNVTDATE2|CNVTDATETIME|CNVTDATETIME2|CNVTDATETIMERDB|CNVTDATETIMEUTC|CNVTDATETIMEUTC2|CNVTDATETIMEUTC3|CNVTHEXRAW|CNVTINT|CNVTJSONTOREC|CNVTLOOKAHEAD|CNVTLOOKBEHIND|CNVTLONG|CNVTLOWER|CNVTMIN|CNVTMIN2|CNVTNLS|CNVTNLSSORT|CNVTPHONE|CNVTRAWHEX|CNVTREAL|CNVTRECTOJSON|CNVTRECTOXML|CNVTSTRING|CNVTSTRINGCHK|CNVTTIME|CNVTTIME2|CNVTTIME3|CNVTTIMESTAMP|CNVTUPPER|CNVTXMLTOREC|CONCAT|COPYREC|COST|COUNT|CUBE|CUME_DIST|CURCODECOVER|CURFILE|CURLOB|CURLOCALE|CURMEM|CURPROG|CURSUB|DATEBIRTHFORMAT|DATEDECEASEDFORMAT|DATETIMEADD|DATETIMECMP|DATETIMECMPUTC|DATETIMEDIFF|DATETIMEFIND|DATETIMEPART|DATETIMETRUNC|DATETIMEZONE|DATETIMEZONEBYINDEX|DATETIMEZONEBYNAME|DATETIMEZONEFORMAT|DATETIMEZONEUTC|DAY|DECODE|DENSE_RANK|ERROR|EVALUATE|EVALUATE2|EVEN|EXP|EXPAND|FILLSTRING|FINDFILE|FINDSTRING|FLOOR|FORMAT|GREATEST|HOUR|ICHAR|INITARRAY|INITREC|ISNUMERIC|JULIAN|LEAST|LIST|LISTAGG|LOCATEVAL|LOCATEVALSORT|LOG|LOG10|LOGICAL|MAP|MAX|MAXREC|MAXVAL|MEDIAN|MEMALLOC|MEMFREE|MEMREALLOC|MIN|MINUTE|MINVAL|MOD|MODIFY|MODCHECK|MONTH|MOVEREC|MOVERECLIST|MOVESTRING|NEGATE|NOPATSTRING|NORDBBIND|NOTRIM|NTILE|NULL|NULLCHECK|NULLFMT|NULLIND|NULLTERM|NULLVAL|OPERATOR|ORDERDIR|OUTERJOIN|PARAMETER|PARAMETER2|PARSER|PATSTRING|PERCENT|PERCENT_RANK|PERCENTILE|PERCENTILE_CONT|PERCENTILE_DISC|PIECE|PROXYUSER|RAND|RANK|RDBBIND|RECTRAVERSE|REFLECT|REMOVE|RENAMEREC|REPLACE|REPORTINFO|REPORTROW|ROLLUP|ROUND|ROW_NUMBER|SELECTIVITY|SEQ|SIZE|SORT|SORTSEARCH|SOUND|SOUNDEX|SQLPASSTHRU|STDDEV|SUBSTRING|SUM|TABLEREF|TDBEXECUTE|TEXT|TEXTLEN|TIMESTAMPDIFF|TRACE|TRIM|TRIMBIND|TYPE|VALIDATE|VALUE|VARIANCE|WEEKDAY|WTMODCHECK|YEAR|UAR_GET_CODE_BY|UAR_GET_CODE_DESCRIPTION|UAR_GET_CODE_DISPLAY|UAR_GET_CODE_MEANING|UAR_GET_DEFINITION|UAR_GET_DISPLAYKEY|UAR_GET_MEANING_BY_CODESET)$")) |
| 62 | +(call_expression |
| 63 | + function: (member_expression |
| 64 | + member: (identifier) @function.builtin) |
| 65 | + (#match? @function.builtin "(?i)^(ABS|AESDECRYPT|AESDECRYPTFILE|AESENCRYPT|AESENCRYPTFILE|ALTER|ALTER2|ALTER3|ALTERLIST|ARRAYJOIN|ARRAYSPLIT|ASIS|ASSIGN|ASSIGN2|ASSIGN3|AVG|BAND|BLOBGET|BLOBGETLEN|BNOT|BOR|BSHIFT|BTEST|BUILD|BUILD2|BUILD2CHK|BUILD3|BXOR|CALCPOS|CALLPRG|CALLR|CCLIO|CCLFMT|CCLREGEXP|CCLTIMER|CEIL|CHAR|CHECK|CHECKDIC|CHECKFUN|CHECKPRG|CHECKQUEUE|CLASS|CLASSREF|CNVTACC|CNVTAGE|CNVTAGE2|CNVTAGEDATETIME|CNVTALIAS|CNVTALPHANUM|CNVTBOOL|CNVTB10B16|CNVTB10B36|CNVTB16B10|CNVTB36B10|CNVTCAP|CNVTDATE|CNVTDATE2|CNVTDATETIME|CNVTDATETIME2|CNVTDATETIMERDB|CNVTDATETIMEUTC|CNVTDATETIMEUTC2|CNVTDATETIMEUTC3|CNVTHEXRAW|CNVTINT|CNVTJSONTOREC|CNVTLOOKAHEAD|CNVTLOOKBEHIND|CNVTLONG|CNVTLOWER|CNVTMIN|CNVTMIN2|CNVTNLS|CNVTNLSSORT|CNVTPHONE|CNVTRAWHEX|CNVTREAL|CNVTRECTOJSON|CNVTRECTOXML|CNVTSTRING|CNVTSTRINGCHK|CNVTTIME|CNVTTIME2|CNVTTIME3|CNVTTIMESTAMP|CNVTUPPER|CNVTXMLTOREC|CONCAT|COPYREC|COST|COUNT|CUBE|CUME_DIST|CURCODECOVER|CURFILE|CURLOB|CURLOCALE|CURMEM|CURPROG|CURSUB|DATEBIRTHFORMAT|DATEDECEASEDFORMAT|DATETIMEADD|DATETIMECMP|DATETIMECMPUTC|DATETIMEDIFF|DATETIMEFIND|DATETIMEPART|DATETIMETRUNC|DATETIMEZONE|DATETIMEZONEBYINDEX|DATETIMEZONEBYNAME|DATETIMEZONEFORMAT|DATETIMEZONEUTC|DAY|DECODE|DENSE_RANK|ERROR|EVALUATE|EVALUATE2|EVEN|EXP|EXPAND|FILLSTRING|FINDFILE|FINDSTRING|FLOOR|FORMAT|GREATEST|HOUR|ICHAR|INITARRAY|INITREC|ISNUMERIC|JULIAN|LEAST|LIST|LISTAGG|LOCATEVAL|LOCATEVALSORT|LOG|LOG10|LOGICAL|MAP|MAX|MAXREC|MAXVAL|MEDIAN|MEMALLOC|MEMFREE|MEMREALLOC|MIN|MINUTE|MINVAL|MOD|MODIFY|MODCHECK|MONTH|MOVEREC|MOVERECLIST|MOVESTRING|NEGATE|NOPATSTRING|NORDBBIND|NOTRIM|NTILE|NULL|NULLCHECK|NULLFMT|NULLIND|NULLTERM|NULLVAL|OPERATOR|ORDERDIR|OUTERJOIN|PARAMETER|PARAMETER2|PARSER|PATSTRING|PERCENT|PERCENT_RANK|PERCENTILE|PERCENTILE_CONT|PERCENTILE_DISC|PIECE|PROXYUSER|RAND|RANK|RDBBIND|RECTRAVERSE|REFLECT|REMOVE|RENAMEREC|REPLACE|REPORTINFO|REPORTROW|ROLLUP|ROUND|ROW_NUMBER|SELECTIVITY|SEQ|SIZE|SORT|SORTSEARCH|SOUND|SOUNDEX|SQLPASSTHRU|STDDEV|SUBSTRING|SUM|TABLEREF|TDBEXECUTE|TEXT|TEXTLEN|TIMESTAMPDIFF|TRACE|TRIM|TRIMBIND|TYPE|VALIDATE|VALUE|VARIANCE|WEEKDAY|WTMODCHECK|YEAR|UAR_GET_CODE_BY|UAR_GET_CODE_DESCRIPTION|UAR_GET_CODE_DISPLAY|UAR_GET_CODE_MEANING|UAR_GET_DEFINITION|UAR_GET_DISPLAYKEY|UAR_GET_MEANING_BY_CODESET)$")) |
| 66 | + |
| 67 | +(record_definition name: (qualified_identifier) @type) |
| 68 | +(record_field name: (identifier) @property) |
| 69 | + |
| 70 | +(variable_declaration name: (qualified_identifier) @variable) |
| 71 | +(array_declaration name: (qualified_identifier) @variable) |
| 72 | + |
| 73 | +(parameter name: (identifier) @variable.parameter) |
| 74 | +(selection_alias alias: (identifier) @variable) |
| 75 | +(table_reference table: (qualified_identifier) @type) |
| 76 | +(table_reference alias: (identifier) @variable) |
| 77 | +(table_control_reference table: (qualified_identifier) @type) |
| 78 | +(table_control_reference alias: (identifier) @variable) |
| 79 | +(dml_table_reference table: (qualified_identifier) @type) |
| 80 | +(dml_table_reference alias: (identifier) @variable) |
| 81 | +(derived_table alias: (identifier) @variable) |
| 82 | +(merge_source alias: (identifier) @variable) |
| 83 | +(namespace_expression namespace: (identifier) @type) |
| 84 | +(member_expression member: (identifier) @property) |
| 85 | +(control_option name: (identifier) @attribute) |
| 86 | + |
| 87 | +; DUMMYT is special only when it occupies a table-name field. |
| 88 | +(table_reference |
| 89 | + table: (qualified_identifier) @type.builtin |
| 90 | + (#match? @type.builtin "(?i)^DUMMYT$")) |
| 91 | +(table_control_reference |
| 92 | + table: (qualified_identifier) @type.builtin |
| 93 | + (#match? @type.builtin "(?i)^DUMMYT$")) |
| 94 | +(dml_table_reference |
| 95 | + table: (qualified_identifier) @type.builtin |
| 96 | + (#match? @type.builtin "(?i)^DUMMYT$")) |
| 97 | + |
| 98 | +; Case-insensitive keyword tokens are aliased to these canonical names by the |
| 99 | +; grammar, so one query covers every source spelling. |
| 100 | +[ |
| 101 | + "and" |
| 102 | + "all" |
| 103 | + "asc" |
| 104 | + "between" |
| 105 | + "break" |
| 106 | + "by" |
| 107 | + "call" |
| 108 | + "case" |
| 109 | + "col" |
| 110 | + "constant" |
| 111 | + "commit" |
| 112 | + "copy" |
| 113 | + "create" |
| 114 | + "declare" |
| 115 | + "delete" |
| 116 | + "desc" |
| 117 | + "detail" |
| 118 | + "distinct" |
| 119 | + "drop" |
| 120 | + "else" |
| 121 | + "elseif" |
| 122 | + "end" |
| 123 | + "endcase" |
| 124 | + "endfor" |
| 125 | + "endif" |
| 126 | + "endwhile" |
| 127 | + "execute" |
| 128 | + "exists" |
| 129 | + "foot" |
| 130 | + "for" |
| 131 | + "free" |
| 132 | + "from" |
| 133 | + "full" |
| 134 | + "go" |
| 135 | + "group" |
| 136 | + "having" |
| 137 | + "head" |
| 138 | + "if" |
| 139 | + "in" |
| 140 | + "inner" |
| 141 | + "insert" |
| 142 | + "intersect" |
| 143 | + "into" |
| 144 | + "is" |
| 145 | + "join" |
| 146 | + "left" |
| 147 | + "like" |
| 148 | + "matched" |
| 149 | + "merge" |
| 150 | + "minus" |
| 151 | + "noconstant" |
| 152 | + "nopersist" |
| 153 | + "not" |
| 154 | + "of" |
| 155 | + "on" |
| 156 | + "or" |
| 157 | + "order" |
| 158 | + "orjoin" |
| 159 | + "page" |
| 160 | + "persist" |
| 161 | + "persistscript" |
| 162 | + "plan" |
| 163 | + "private" |
| 164 | + "privateprotect" |
| 165 | + "program" |
| 166 | + "prompt" |
| 167 | + "protect" |
| 168 | + "public" |
| 169 | + "record" |
| 170 | + "ref" |
| 171 | + "report" |
| 172 | + "return" |
| 173 | + "right" |
| 174 | + "rollback" |
| 175 | + "row" |
| 176 | + "select" |
| 177 | + "set" |
| 178 | + "subroutine" |
| 179 | + "then" |
| 180 | + "to" |
| 181 | + "update" |
| 182 | + "union" |
| 183 | + "using" |
| 184 | + "value" |
| 185 | + "values" |
| 186 | + "when" |
| 187 | + "where" |
| 188 | + "while" |
| 189 | + "with" |
| 190 | +] @keyword |
| 191 | + |
| 192 | +[ |
| 193 | + "=" |
| 194 | + "+=" |
| 195 | + "-=" |
| 196 | + "*=" |
| 197 | + "/=" |
| 198 | + "+" |
| 199 | + "-" |
| 200 | + "*" |
| 201 | + "/" |
| 202 | + "**" |
| 203 | + "||" |
| 204 | + "!=" |
| 205 | + "<>" |
| 206 | + "<" |
| 207 | + "<=" |
| 208 | + ">" |
| 209 | + ">=" |
| 210 | + "->" |
| 211 | + "::" |
| 212 | +] @operator |
| 213 | + |
| 214 | +[ |
| 215 | + "(" |
| 216 | + ")" |
| 217 | + "[" |
| 218 | + "]" |
| 219 | +] @punctuation.bracket |
| 220 | + |
| 221 | +[ |
| 222 | + "," |
| 223 | + ":" |
| 224 | + "." |
| 225 | +] @punctuation.delimiter |
0 commit comments