@abedmurrar/objection 4.0.0-alpha.0 → 4.0.0-beta.1

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.
Files changed (192) hide show
  1. package/README.md +103 -67
  2. package/lib/index.mjs +6 -0
  3. package/lib/initialize.js +6 -9
  4. package/lib/model/AjvValidator.js +235 -282
  5. package/lib/model/Model.js +653 -823
  6. package/lib/model/ModifierNotFoundError.js +5 -7
  7. package/lib/model/NotFoundError.js +14 -18
  8. package/lib/model/RelationDoesNotExistError.js +6 -9
  9. package/lib/model/ValidationError.js +33 -41
  10. package/lib/model/Validator.js +15 -21
  11. package/lib/model/getModel.js +1 -3
  12. package/lib/model/graph/ModelGraph.js +44 -64
  13. package/lib/model/graph/ModelGraphBuilder.js +164 -217
  14. package/lib/model/graph/ModelGraphEdge.js +31 -43
  15. package/lib/model/graph/ModelGraphNode.js +192 -231
  16. package/lib/model/inheritModel.js +9 -18
  17. package/lib/model/modelBindKnex.js +48 -62
  18. package/lib/model/modelClone.js +79 -98
  19. package/lib/model/modelColPropMap.js +16 -26
  20. package/lib/model/modelConcurrency.js +24 -0
  21. package/lib/model/modelId.js +44 -49
  22. package/lib/model/modelJsonAttributes.js +56 -76
  23. package/lib/model/modelParseRelations.js +68 -67
  24. package/lib/model/modelQueryProps.js +76 -107
  25. package/lib/model/modelSet.js +92 -112
  26. package/lib/model/modelTableMetadata.js +60 -72
  27. package/lib/model/modelToJson.js +120 -150
  28. package/lib/model/modelUtils.js +30 -37
  29. package/lib/model/modelValidate.js +34 -42
  30. package/lib/model/modelValues.js +78 -91
  31. package/lib/model/modelVisitor.js +22 -29
  32. package/lib/objection.js +42 -67
  33. package/lib/queryBuilder/FunctionBuilder.js +231 -279
  34. package/lib/queryBuilder/InternalOptions.js +19 -24
  35. package/lib/queryBuilder/JoinBuilder.js +116 -149
  36. package/lib/queryBuilder/QueryBuilder.js +1009 -1271
  37. package/lib/queryBuilder/QueryBuilderBase.js +647 -865
  38. package/lib/queryBuilder/QueryBuilderContext.js +14 -21
  39. package/lib/queryBuilder/QueryBuilderContextBase.js +20 -29
  40. package/lib/queryBuilder/QueryBuilderOperationSupport.js +462 -536
  41. package/lib/queryBuilder/QueryBuilderUserContext.js +19 -25
  42. package/lib/queryBuilder/RawBuilder.js +58 -73
  43. package/lib/queryBuilder/ReferenceBuilder.js +232 -270
  44. package/lib/queryBuilder/RelationExpression.js +322 -380
  45. package/lib/queryBuilder/StaticHookArguments.js +94 -106
  46. package/lib/queryBuilder/ValueBuilder.js +100 -112
  47. package/lib/queryBuilder/expressions.js +86 -116
  48. package/lib/queryBuilder/functions/mysql.js +642 -697
  49. package/lib/queryBuilder/graph/GraphAction.js +44 -59
  50. package/lib/queryBuilder/graph/GraphData.js +7 -9
  51. package/lib/queryBuilder/graph/GraphFetcher.js +115 -151
  52. package/lib/queryBuilder/graph/GraphNodeDbExistence.js +114 -152
  53. package/lib/queryBuilder/graph/GraphOperation.js +16 -22
  54. package/lib/queryBuilder/graph/GraphOptions.js +143 -185
  55. package/lib/queryBuilder/graph/GraphUpsert.js +167 -241
  56. package/lib/queryBuilder/graph/delete/GraphDelete.js +8 -13
  57. package/lib/queryBuilder/graph/delete/GraphDeleteAction.js +44 -62
  58. package/lib/queryBuilder/graph/insert/GraphInsert.js +99 -128
  59. package/lib/queryBuilder/graph/insert/GraphInsertAction.js +151 -193
  60. package/lib/queryBuilder/graph/insert/JoinRowGraphInsertAction.js +57 -79
  61. package/lib/queryBuilder/graph/patch/GraphPatch.js +8 -13
  62. package/lib/queryBuilder/graph/patch/GraphPatchAction.js +181 -234
  63. package/lib/queryBuilder/graph/recursiveUpsert/GraphRecursiveUpsert.js +16 -21
  64. package/lib/queryBuilder/graph/recursiveUpsert/GraphRecursiveUpsertAction.js +80 -110
  65. package/lib/queryBuilder/join/JoinResultColumn.js +14 -18
  66. package/lib/queryBuilder/join/JoinResultParser.js +88 -101
  67. package/lib/queryBuilder/join/RelationJoiner.js +205 -288
  68. package/lib/queryBuilder/join/TableNode.js +117 -144
  69. package/lib/queryBuilder/join/TableTree.js +60 -76
  70. package/lib/queryBuilder/join/utils.js +10 -16
  71. package/lib/queryBuilder/operations/DelegateOperation.js +93 -133
  72. package/lib/queryBuilder/operations/DeleteOperation.js +33 -37
  73. package/lib/queryBuilder/operations/FindByIdOperation.js +20 -28
  74. package/lib/queryBuilder/operations/FindByIdsOperation.js +17 -23
  75. package/lib/queryBuilder/operations/FindOperation.js +114 -131
  76. package/lib/queryBuilder/operations/FirstOperation.js +14 -19
  77. package/lib/queryBuilder/operations/FromOperation.js +69 -88
  78. package/lib/queryBuilder/operations/InsertAndFetchOperation.js +28 -39
  79. package/lib/queryBuilder/operations/InsertGraphAndFetchOperation.js +25 -35
  80. package/lib/queryBuilder/operations/InsertGraphOperation.js +77 -98
  81. package/lib/queryBuilder/operations/InsertOperation.js +132 -165
  82. package/lib/queryBuilder/operations/InstanceDeleteOperation.js +27 -36
  83. package/lib/queryBuilder/operations/InstanceFindOperation.js +9 -13
  84. package/lib/queryBuilder/operations/InstanceInsertOperation.js +13 -17
  85. package/lib/queryBuilder/operations/InstanceUpdateOperation.js +32 -46
  86. package/lib/queryBuilder/operations/JoinRelatedOperation.js +66 -86
  87. package/lib/queryBuilder/operations/KnexOperation.js +4 -7
  88. package/lib/queryBuilder/operations/MergeOperation.js +32 -45
  89. package/lib/queryBuilder/operations/ObjectionToKnexConvertingOperation.js +131 -150
  90. package/lib/queryBuilder/operations/OnBuildKnexOperation.js +17 -23
  91. package/lib/queryBuilder/operations/OnBuildOperation.js +17 -23
  92. package/lib/queryBuilder/operations/OnErrorOperation.js +17 -23
  93. package/lib/queryBuilder/operations/QueryBuilderOperation.js +231 -270
  94. package/lib/queryBuilder/operations/RangeOperation.js +30 -40
  95. package/lib/queryBuilder/operations/RelateOperation.js +14 -21
  96. package/lib/queryBuilder/operations/ReturningOperation.js +12 -18
  97. package/lib/queryBuilder/operations/RunAfterOperation.js +17 -23
  98. package/lib/queryBuilder/operations/RunBeforeOperation.js +17 -23
  99. package/lib/queryBuilder/operations/UnrelateOperation.js +12 -17
  100. package/lib/queryBuilder/operations/UpdateAndFetchOperation.js +48 -65
  101. package/lib/queryBuilder/operations/UpdateOperation.js +104 -129
  102. package/lib/queryBuilder/operations/UpsertGraphAndFetchOperation.js +25 -35
  103. package/lib/queryBuilder/operations/UpsertGraphOperation.js +36 -55
  104. package/lib/queryBuilder/operations/WhereCompositeOperation.js +30 -39
  105. package/lib/queryBuilder/operations/WhereInOperation.js +34 -36
  106. package/lib/queryBuilder/operations/eager/EagerOperation.js +37 -52
  107. package/lib/queryBuilder/operations/eager/JoinEagerOperation.js +34 -44
  108. package/lib/queryBuilder/operations/eager/NaiveEagerOperation.js +4 -7
  109. package/lib/queryBuilder/operations/eager/WhereInEagerOperation.js +193 -251
  110. package/lib/queryBuilder/operations/jsonApi/WhereJsonHasOperation.js +18 -25
  111. package/lib/queryBuilder/operations/jsonApi/WhereJsonNotObjectOperation.js +25 -41
  112. package/lib/queryBuilder/operations/jsonApi/WhereJsonOperation.js +19 -20
  113. package/lib/queryBuilder/operations/jsonApi/WhereJsonOverlapsOperation.js +23 -21
  114. package/lib/queryBuilder/operations/jsonApi/mysqlJsonApi.js +106 -118
  115. package/lib/queryBuilder/operations/jsonApi/postgresJsonApi.js +79 -108
  116. package/lib/queryBuilder/operations/select/SelectOperation.js +37 -53
  117. package/lib/queryBuilder/operations/select/Selection.js +94 -105
  118. package/lib/queryBuilder/operations/whereInComposite/WhereInCompositeMsSqlOperation.js +68 -101
  119. package/lib/queryBuilder/operations/whereInComposite/WhereInCompositeOperation.js +65 -75
  120. package/lib/queryBuilder/operations/whereInComposite/WhereInCompositeSqliteOperation.js +75 -84
  121. package/lib/queryBuilder/parsers/jsonFieldExpressionParser.js +760 -859
  122. package/lib/queryBuilder/parsers/relationExpressionParser.js +840 -952
  123. package/lib/queryBuilder/transformations/CompositeQueryTransformation.js +10 -15
  124. package/lib/queryBuilder/transformations/QueryTransformation.js +4 -6
  125. package/lib/queryBuilder/transformations/WrapMysqlModifySubqueryTransformation.js +35 -49
  126. package/lib/queryBuilder/transformations/index.js +3 -9
  127. package/lib/queryBuilder/whereScopes.js +158 -186
  128. package/lib/relations/Relation.js +293 -375
  129. package/lib/relations/RelationDeleteOperation.js +24 -28
  130. package/lib/relations/RelationFindOperation.js +108 -138
  131. package/lib/relations/RelationInsertOperation.js +24 -32
  132. package/lib/relations/RelationOwner.js +175 -209
  133. package/lib/relations/RelationProperty.js +186 -223
  134. package/lib/relations/RelationUpdateOperation.js +23 -29
  135. package/lib/relations/belongsToOne/BelongsToOneDeleteOperation.js +16 -21
  136. package/lib/relations/belongsToOne/BelongsToOneInsertOperation.js +30 -41
  137. package/lib/relations/belongsToOne/BelongsToOneRelateOperation.js +36 -47
  138. package/lib/relations/belongsToOne/BelongsToOneRelation.js +42 -50
  139. package/lib/relations/belongsToOne/BelongsToOneUnrelateOperation.js +43 -58
  140. package/lib/relations/hasMany/HasManyInsertOperation.js +40 -56
  141. package/lib/relations/hasMany/HasManyRelateOperation.js +45 -61
  142. package/lib/relations/hasMany/HasManyRelation.js +38 -46
  143. package/lib/relations/hasMany/HasManyUnrelateOperation.js +25 -32
  144. package/lib/relations/hasOne/HasOneRelation.js +9 -12
  145. package/lib/relations/hasOneThrough/HasOneThroughRelation.js +9 -12
  146. package/lib/relations/manyToMany/ManyToManyModifyMixin.js +73 -95
  147. package/lib/relations/manyToMany/ManyToManyRelation.js +374 -473
  148. package/lib/relations/manyToMany/ManyToManySqliteModifyMixin.js +23 -30
  149. package/lib/relations/manyToMany/delete/ManyToManyDeleteOperation.js +8 -10
  150. package/lib/relations/manyToMany/delete/ManyToManyDeleteOperationBase.js +20 -25
  151. package/lib/relations/manyToMany/delete/ManyToManyDeleteSqliteOperation.js +8 -12
  152. package/lib/relations/manyToMany/find/ManyToManyFindOperation.js +77 -100
  153. package/lib/relations/manyToMany/insert/ManyToManyInsertOperation.js +37 -49
  154. package/lib/relations/manyToMany/relate/ManyToManyRelateOperation.js +58 -74
  155. package/lib/relations/manyToMany/unrelate/ManyToManyUnrelateOperation.js +10 -13
  156. package/lib/relations/manyToMany/unrelate/ManyToManyUnrelateOperationBase.js +26 -33
  157. package/lib/relations/manyToMany/unrelate/ManyToManyUnrelateSqliteOperation.js +10 -15
  158. package/lib/relations/manyToMany/update/ManyToManyUpdateOperation.js +8 -10
  159. package/lib/relations/manyToMany/update/ManyToManyUpdateOperationBase.js +61 -78
  160. package/lib/relations/manyToMany/update/ManyToManyUpdateSqliteOperation.js +8 -12
  161. package/lib/transaction.js +53 -83
  162. package/lib/utils/assert.js +15 -21
  163. package/lib/utils/buildUtils.js +17 -19
  164. package/lib/utils/classUtils.js +7 -11
  165. package/lib/utils/cloneDeep.js +365 -0
  166. package/lib/utils/createModifier.js +36 -41
  167. package/lib/utils/deprecate.js +8 -12
  168. package/lib/utils/identifierMapping.js +153 -192
  169. package/lib/utils/internalPropUtils.js +4 -8
  170. package/lib/utils/knexUtils.js +61 -56
  171. package/lib/utils/mixin.js +16 -23
  172. package/lib/utils/mysqlJsonPath.js +55 -40
  173. package/lib/utils/normalizeIds.js +110 -127
  174. package/lib/utils/objectUtils.js +236 -338
  175. package/lib/utils/parseFieldExpression.js +66 -44
  176. package/lib/utils/postgresJsonPath.js +48 -62
  177. package/lib/utils/promiseUtils/after.js +10 -13
  178. package/lib/utils/promiseUtils/afterReturn.js +10 -13
  179. package/lib/utils/promiseUtils/index.js +15 -17
  180. package/lib/utils/promiseUtils/isPromise.js +6 -9
  181. package/lib/utils/promiseUtils/map.js +75 -89
  182. package/lib/utils/promiseUtils/mapAfterAllReturn.js +17 -23
  183. package/lib/utils/promiseUtils/try.js +15 -18
  184. package/lib/utils/resolveModel.js +91 -94
  185. package/lib/utils/tmpColumnUtils.js +4 -13
  186. package/package.json +50 -23
  187. package/typings/objection/index.d.mts +362 -0
  188. package/typings/objection/index.d.ts +36 -9
  189. package/lib/.eslintrc.json +0 -8
  190. package/lib/queryBuilder/parsers/jsonFieldExpressionParser.pegjs +0 -97
  191. package/lib/queryBuilder/parsers/relationExpressionParser.pegjs +0 -141
  192. package/lib/utils/clone.js +0 -2329
@@ -1,7 +1,5 @@
1
1
  'use strict';
2
-
3
2
  const { ref } = require('../ReferenceBuilder');
4
-
5
3
  // The MySQL 8.4 built-in functions, as `fn.*` helpers.
6
4
  //
7
5
  // Each entry is `[name, sql, params, result, options]`:
@@ -32,7 +30,6 @@ const { ref } = require('../ReferenceBuilder');
32
30
  // that are deprecated (`JSON_MERGE()`, `FOUND_ROWS()`, `VALUES()`,
33
31
  // `MASTER_POS_WAIT()`) or that need a component (`VALIDATE_PASSWORD_STRENGTH()`).
34
32
  // `fn('NAME', ...args)` calls any function.
35
-
36
33
  const STR = 'string | null';
37
34
  const NUM = 'number | null';
38
35
  const DEC = 'FnNumeric | null';
@@ -41,777 +38,725 @@ const DATE = 'Date | string | null';
41
38
  const TIME = 'string | null';
42
39
  const BIN = 'Buffer | null';
43
40
  const ANY = 'unknown';
44
-
45
41
  const X = 'x: FnArg';
46
42
  const STRING = 'str: FnArg';
47
43
  const DATE_ARG = 'date: FnArg';
48
44
  const FSP = 'fsp?: number';
49
45
  const LAG_PARAMS = 'x: FnArg, offset?: number, defaultValue?: FnArg';
50
46
  const WINDOW = { portable: true, window: true };
51
-
52
47
  const INTERVAL_UNITS = [
53
- 'MICROSECOND',
54
- 'SECOND',
55
- 'MINUTE',
56
- 'HOUR',
57
- 'DAY',
58
- 'WEEK',
59
- 'MONTH',
60
- 'QUARTER',
61
- 'YEAR',
62
- 'SECOND_MICROSECOND',
63
- 'MINUTE_MICROSECOND',
64
- 'MINUTE_SECOND',
65
- 'HOUR_MICROSECOND',
66
- 'HOUR_SECOND',
67
- 'HOUR_MINUTE',
68
- 'DAY_MICROSECOND',
69
- 'DAY_SECOND',
70
- 'DAY_MINUTE',
71
- 'DAY_HOUR',
72
- 'YEAR_MONTH',
48
+ 'MICROSECOND',
49
+ 'SECOND',
50
+ 'MINUTE',
51
+ 'HOUR',
52
+ 'DAY',
53
+ 'WEEK',
54
+ 'MONTH',
55
+ 'QUARTER',
56
+ 'YEAR',
57
+ 'SECOND_MICROSECOND',
58
+ 'MINUTE_MICROSECOND',
59
+ 'MINUTE_SECOND',
60
+ 'HOUR_MICROSECOND',
61
+ 'HOUR_SECOND',
62
+ 'HOUR_MINUTE',
63
+ 'DAY_MICROSECOND',
64
+ 'DAY_SECOND',
65
+ 'DAY_MINUTE',
66
+ 'DAY_HOUR',
67
+ 'YEAR_MONTH',
73
68
  ];
74
-
75
69
  const TIMESTAMP_UNITS = INTERVAL_UNITS.slice(0, 9);
76
- const CAST_TYPE =
77
- /^((BINARY|CHAR|NCHAR)(\(\d+\))?( CHARACTER SET \w+)?|DATE|(DATETIME|TIME)(\(\d\))?|DECIMAL(\(\d+(, ?\d+)?\))?|DOUBLE|FLOAT(\(\d+\))?|JSON|REAL|(SIGNED|UNSIGNED)( INTEGER)?|YEAR)$/i;
70
+ const CAST_TYPE = /^((BINARY|CHAR|NCHAR)(\(\d+\))?( CHARACTER SET \w+)?|DATE|(DATETIME|TIME)(\(\d\))?|DECIMAL(\(\d+(, ?\d+)?\))?|DOUBLE|FLOAT(\(\d+\))?|JSON|REAL|(SIGNED|UNSIGNED)( INTEGER)?|YEAR)$/i;
78
71
  const CHARSET = /^\w+$/;
79
72
  const MATCH_MODES = {
80
- natural: 'IN NATURAL LANGUAGE MODE',
81
- 'natural with query expansion': 'IN NATURAL LANGUAGE MODE WITH QUERY EXPANSION',
82
- boolean: 'IN BOOLEAN MODE',
83
- 'with query expansion': 'WITH QUERY EXPANSION',
73
+ natural: 'IN NATURAL LANGUAGE MODE',
74
+ 'natural with query expansion': 'IN NATURAL LANGUAGE MODE WITH QUERY EXPANSION',
75
+ boolean: 'IN BOOLEAN MODE',
76
+ 'with query expansion': 'WITH QUERY EXPANSION',
84
77
  };
85
78
  const TRIM_SIDES = ['BOTH', 'LEADING', 'TRAILING'];
86
79
  const DIRECTIONS = ['ASC', 'DESC'];
87
80
  const FORMAT_TYPES = ['DATE', 'TIME', 'DATETIME', 'TIMESTAMP'];
88
-
89
81
  const FUNCTIONS = [
90
- // String functions.
91
- ['ascii', 'ASCII', STRING, NUM, { portable: true }],
92
- ['bin', 'BIN', 'n: FnArg', STR],
93
- ['bitLength', 'BIT_LENGTH', STRING, NUM, { portable: true }],
94
- [
95
- 'char',
96
- 'CHAR',
97
- 'codes: FnArg | FnArg[], options?: { using?: string }',
98
- BIN,
99
- { build: buildChar },
100
- ],
101
- ['charLength', 'CHAR_LENGTH', STRING, NUM, { portable: true }],
102
- ['characterLength', 'CHARACTER_LENGTH', STRING, NUM, { portable: true }],
103
- ['concatWs', 'CONCAT_WS', 'separator: FnArg, ...strs: FnArg[]', STR, { portable: true }],
104
- ['elt', 'ELT', 'n: FnArg, ...strs: FnArg[]', STR],
105
- [
106
- 'exportSet',
107
- 'EXPORT_SET',
108
- 'bits: FnArg, on: FnArg, off: FnArg, separator?: FnArg, numberOfBits?: FnArg',
109
- STR,
110
- ],
111
- ['field', 'FIELD', 'str: FnArg, ...strs: FnArg[]', NUM],
112
- ['findInSet', 'FIND_IN_SET', 'str: FnArg, strList: FnArg', NUM],
113
- ['format', 'FORMAT', 'x: FnArg, decimals: FnArg, locale?: FnArg', STR],
114
- ['fromBase64', 'FROM_BASE64', STRING, BIN],
115
- ['hex', 'HEX', X, STR],
116
- ['insert', 'INSERT', 'str: FnArg, pos: FnArg, len: FnArg, newStr: FnArg', STR],
117
- ['instr', 'INSTR', 'str: FnArg, substr: FnArg', NUM],
118
- ['lcase', 'LCASE', STRING, STR],
119
- ['left', 'LEFT', 'str: FnArg, len: FnArg', STR, { portable: true }],
120
- ['length', 'LENGTH', STRING, NUM, { portable: true }],
121
- ['locate', 'LOCATE', 'substr: FnArg, str: FnArg, pos?: FnArg', NUM],
122
- ['lpad', 'LPAD', 'str: FnArg, len: FnArg, padStr: FnArg', STR, { portable: true }],
123
- ['ltrim', 'LTRIM', STRING, STR, { portable: true }],
124
- ['makeSet', 'MAKE_SET', 'bits: FnArg, ...strs: FnArg[]', STR],
125
- ['mid', 'MID', 'str: FnArg, pos: FnArg, len?: FnArg', STR],
126
- ['oct', 'OCT', 'n: FnArg', STR],
127
- ['octetLength', 'OCTET_LENGTH', STRING, NUM, { portable: true }],
128
- ['ord', 'ORD', STRING, NUM],
129
- [
130
- 'position',
131
- 'POSITION',
132
- 'substr: FnArg, str: FnArg',
133
- NUM,
134
- { portable: true, build: buildPosition },
135
- ],
136
- ['quote', 'QUOTE', STRING, STR],
137
- [
138
- 'regexpInstr',
139
- 'REGEXP_INSTR',
140
- 'expr: FnArg, pattern: FnArg, pos?: FnArg, occurrence?: FnArg, returnOption?: FnArg, matchType?: FnArg',
141
- NUM,
142
- ],
143
- ['regexpLike', 'REGEXP_LIKE', 'expr: FnArg, pattern: FnArg, matchType?: FnArg', BOOL],
144
- [
145
- 'regexpReplace',
146
- 'REGEXP_REPLACE',
147
- 'expr: FnArg, pattern: FnArg, replacement: FnArg, pos?: FnArg, occurrence?: FnArg, matchType?: FnArg',
148
- STR,
149
- ],
150
- [
151
- 'regexpSubstr',
152
- 'REGEXP_SUBSTR',
153
- 'expr: FnArg, pattern: FnArg, pos?: FnArg, occurrence?: FnArg, matchType?: FnArg',
154
- STR,
155
- ],
156
- ['repeat', 'REPEAT', 'str: FnArg, count: FnArg', STR, { portable: true }],
157
- ['replace', 'REPLACE', 'str: FnArg, from: FnArg, to: FnArg', STR, { portable: true }],
158
- ['reverse', 'REVERSE', STRING, STR, { portable: true }],
159
- ['right', 'RIGHT', 'str: FnArg, len: FnArg', STR, { portable: true }],
160
- ['rpad', 'RPAD', 'str: FnArg, len: FnArg, padStr: FnArg', STR, { portable: true }],
161
- ['rtrim', 'RTRIM', STRING, STR, { portable: true }],
162
- ['soundex', 'SOUNDEX', STRING, STR],
163
- ['space', 'SPACE', 'n: FnArg', STR],
164
- ['strcmp', 'STRCMP', 'a: FnArg, b: FnArg', '-1 | 0 | 1 | null'],
165
- ['substr', 'SUBSTR', 'str: FnArg, pos: FnArg, len?: FnArg', STR, { portable: true }],
166
- ['substring', 'SUBSTRING', 'str: FnArg, pos: FnArg, len?: FnArg', STR, { portable: true }],
167
- ['substringIndex', 'SUBSTRING_INDEX', 'str: FnArg, delimiter: FnArg, count: FnArg', STR],
168
- ['toBase64', 'TO_BASE64', STRING, STR],
169
- [
170
- 'trim',
171
- 'TRIM',
172
- "str: FnArg, options?: { side?: 'both' | 'leading' | 'trailing'; remove?: FnArg }",
173
- STR,
174
- { portable: true, build: buildTrim },
175
- ],
176
- ['ucase', 'UCASE', STRING, STR],
177
- ['unhex', 'UNHEX', STRING, BIN],
178
- ['weightString', 'WEIGHT_STRING', STRING, BIN],
179
- [
180
- 'match',
181
- 'MATCH',
182
- "columns: FnArg | FnArg[], search: FnArg, options?: { mode?: 'natural' | 'natural with query expansion' | 'boolean' | 'with query expansion' }",
183
- NUM,
184
- { build: buildMatch },
185
- ],
186
-
187
- // Numeric functions.
188
- ['abs', 'ABS', X, DEC, { portable: true }],
189
- ['acos', 'ACOS', X, NUM, { portable: true }],
190
- ['asin', 'ASIN', X, NUM, { portable: true }],
191
- ['atan', 'ATAN', 'x: FnArg, y?: FnArg', NUM],
192
- ['atan2', 'ATAN2', 'y: FnArg, x: FnArg', NUM, { portable: true }],
193
- ['ceil', 'CEIL', X, DEC, { portable: true }],
194
- ['ceiling', 'CEILING', X, DEC, { portable: true }],
195
- ['conv', 'CONV', 'n: FnArg, fromBase: FnArg, toBase: FnArg', STR],
196
- ['cos', 'COS', X, NUM, { portable: true }],
197
- ['cot', 'COT', X, NUM, { portable: true }],
198
- ['crc32', 'CRC32', X, NUM],
199
- ['degrees', 'DEGREES', X, NUM, { portable: true }],
200
- ['exp', 'EXP', X, NUM, { portable: true }],
201
- ['floor', 'FLOOR', X, DEC, { portable: true }],
202
- ['ln', 'LN', X, NUM, { portable: true }],
203
- ['log', 'LOG', 'baseOrX: FnArg, x?: FnArg', NUM],
204
- ['log10', 'LOG10', X, NUM],
205
- ['log2', 'LOG2', X, NUM],
206
- ['mod', 'MOD', 'n: FnArg, m: FnArg', DEC, { portable: true }],
207
- ['pi', 'PI', '', NUM, { portable: true }],
208
- ['pow', 'POW', 'x: FnArg, y: FnArg', NUM],
209
- ['power', 'POWER', 'x: FnArg, y: FnArg', NUM, { portable: true }],
210
- ['radians', 'RADIANS', X, NUM, { portable: true }],
211
- ['rand', 'RAND', 'seed?: FnArg', NUM],
212
- ['round', 'ROUND', 'x: FnArg, decimals?: FnArg', DEC, { portable: true }],
213
- ['sign', 'SIGN', X, NUM, { portable: true }],
214
- ['sin', 'SIN', X, NUM, { portable: true }],
215
- ['sqrt', 'SQRT', X, NUM, { portable: true }],
216
- ['tan', 'TAN', X, NUM, { portable: true }],
217
- ['truncate', 'TRUNCATE', 'x: FnArg, decimals: FnArg', DEC],
218
-
219
- // Date and time functions.
220
- [
221
- 'addDate',
222
- 'ADDDATE',
223
- 'date: FnArg, amount: FnArg, unit?: FnIntervalUnit',
224
- DATE,
225
- { build: buildDateAdd },
226
- ],
227
- ['addTime', 'ADDTIME', 'datetime: FnArg, time: FnArg', DATE],
228
- ['convertTz', 'CONVERT_TZ', 'datetime: FnArg, fromTz: FnArg, toTz: FnArg', DATE],
229
- ['curDate', 'CURDATE', '', DATE],
230
- ['currentDate', 'CURRENT_DATE', '', DATE],
231
- ['currentTime', 'CURRENT_TIME', FSP, TIME],
232
- ['currentTimestamp', 'CURRENT_TIMESTAMP', FSP, DATE],
233
- ['curTime', 'CURTIME', FSP, TIME],
234
- ['date', 'DATE', X, DATE],
235
- [
236
- 'dateAdd',
237
- 'DATE_ADD',
238
- 'date: FnArg, amount: FnArg, unit: FnIntervalUnit',
239
- DATE,
240
- { build: buildDateAdd },
241
- ],
242
- ['dateDiff', 'DATEDIFF', 'a: FnArg, b: FnArg', NUM],
243
- ['dateFormat', 'DATE_FORMAT', 'date: FnArg, format: FnArg', STR],
244
- [
245
- 'dateSub',
246
- 'DATE_SUB',
247
- 'date: FnArg, amount: FnArg, unit: FnIntervalUnit',
248
- DATE,
249
- { build: buildDateAdd },
250
- ],
251
- ['day', 'DAY', DATE_ARG, NUM],
252
- ['dayName', 'DAYNAME', DATE_ARG, STR],
253
- ['dayOfMonth', 'DAYOFMONTH', DATE_ARG, NUM],
254
- ['dayOfWeek', 'DAYOFWEEK', DATE_ARG, NUM],
255
- ['dayOfYear', 'DAYOFYEAR', DATE_ARG, NUM],
256
- ['extract', 'EXTRACT', 'unit: FnIntervalUnit, date: FnArg', NUM, { build: buildExtract }],
257
- ['fromDays', 'FROM_DAYS', 'days: FnArg', DATE],
258
- ['fromUnixTime', 'FROM_UNIXTIME', 'timestamp: FnArg, format?: FnArg', DATE],
259
- [
260
- 'getFormat',
261
- 'GET_FORMAT',
262
- "type: 'DATE' | 'TIME' | 'DATETIME' | 'TIMESTAMP', locale: FnArg",
263
- STR,
264
- { build: buildGetFormat },
265
- ],
266
- ['hour', 'HOUR', 'time: FnArg', NUM],
267
- ['lastDay', 'LAST_DAY', DATE_ARG, DATE],
268
- ['localTime', 'LOCALTIME', FSP, DATE],
269
- ['localTimestamp', 'LOCALTIMESTAMP', FSP, DATE],
270
- ['makeDate', 'MAKEDATE', 'year: FnArg, dayOfYear: FnArg', DATE],
271
- ['makeTime', 'MAKETIME', 'hour: FnArg, minute: FnArg, second: FnArg', TIME],
272
- ['microsecond', 'MICROSECOND', 'time: FnArg', NUM],
273
- ['minute', 'MINUTE', 'time: FnArg', NUM],
274
- ['month', 'MONTH', DATE_ARG, NUM],
275
- ['monthName', 'MONTHNAME', DATE_ARG, STR],
276
- ['periodAdd', 'PERIOD_ADD', 'period: FnArg, months: FnArg', NUM],
277
- ['periodDiff', 'PERIOD_DIFF', 'a: FnArg, b: FnArg', NUM],
278
- ['quarter', 'QUARTER', DATE_ARG, NUM],
279
- ['second', 'SECOND', 'time: FnArg', NUM],
280
- ['secToTime', 'SEC_TO_TIME', 'seconds: FnArg', TIME],
281
- ['strToDate', 'STR_TO_DATE', 'str: FnArg, format: FnArg', DATE],
282
- [
283
- 'subDate',
284
- 'SUBDATE',
285
- 'date: FnArg, amount: FnArg, unit?: FnIntervalUnit',
286
- DATE,
287
- { build: buildDateAdd },
288
- ],
289
- ['subTime', 'SUBTIME', 'datetime: FnArg, time: FnArg', DATE],
290
- ['sysdate', 'SYSDATE', FSP, DATE],
291
- ['time', 'TIME', X, TIME],
292
- ['timeDiff', 'TIMEDIFF', 'a: FnArg, b: FnArg', TIME],
293
- ['timestamp', 'TIMESTAMP', 'x: FnArg, time?: FnArg', DATE],
294
- [
295
- 'timestampAdd',
296
- 'TIMESTAMPADD',
297
- 'unit: FnTimestampUnit, amount: FnArg, date: FnArg',
298
- DATE,
299
- { build: buildTimestampFunction },
300
- ],
301
- [
302
- 'timestampDiff',
303
- 'TIMESTAMPDIFF',
304
- 'unit: FnTimestampUnit, from: FnArg, to: FnArg',
305
- NUM,
306
- { build: buildTimestampFunction },
307
- ],
308
- ['timeFormat', 'TIME_FORMAT', 'time: FnArg, format: FnArg', STR],
309
- ['timeToSec', 'TIME_TO_SEC', 'time: FnArg', NUM],
310
- ['toDays', 'TO_DAYS', DATE_ARG, NUM],
311
- ['toSeconds', 'TO_SECONDS', DATE_ARG, NUM],
312
- ['unixTimestamp', 'UNIX_TIMESTAMP', 'date?: FnArg', DEC],
313
- ['utcDate', 'UTC_DATE', '', DATE],
314
- ['utcTime', 'UTC_TIME', FSP, TIME],
315
- ['utcTimestamp', 'UTC_TIMESTAMP', FSP, DATE],
316
- ['week', 'WEEK', 'date: FnArg, mode?: FnArg', NUM],
317
- ['weekday', 'WEEKDAY', DATE_ARG, NUM],
318
- ['weekOfYear', 'WEEKOFYEAR', DATE_ARG, NUM],
319
- ['year', 'YEAR', DATE_ARG, NUM],
320
- ['yearWeek', 'YEARWEEK', 'date: FnArg, mode?: FnArg', NUM],
321
-
322
- // Aggregate functions. `fn.count()`, `fn.sum()`, `fn.avg()`, `fn.min()` and
323
- // `fn.max()` already exist.
324
- ['bitAnd', 'BIT_AND', X, DEC, { aggregate: true }],
325
- ['bitOr', 'BIT_OR', X, DEC, { aggregate: true }],
326
- ['bitXor', 'BIT_XOR', X, DEC, { aggregate: true }],
327
- [
328
- 'countDistinct',
329
- 'COUNT',
330
- '...exprs: FnArg[]',
331
- 'number',
332
- { build: buildCountDistinct, aggregate: true, portable: true },
333
- ],
334
- [
335
- 'groupConcat',
336
- 'GROUP_CONCAT',
337
- 'exprs: FnArg | FnArg[], options?: { distinct?: boolean; orderBy?: FnOrderBy | FnOrderBy[]; separator?: string }',
338
- STR,
339
- { build: buildGroupConcat, aggregate: ([exprs]) => (Array.isArray(exprs) ? exprs.length : 1) },
340
- ],
341
- ['jsonArrayAgg', 'JSON_ARRAYAGG', X, 'unknown[] | null', { aggregate: true }],
342
- ['jsonObjectAgg', 'JSON_OBJECTAGG', 'key: FnArg, value: FnArg', 'Record<string, unknown> | null'],
343
- ['std', 'STD', X, NUM, { aggregate: true }],
344
- ['stddev', 'STDDEV', X, NUM, { portable: true, aggregate: true }],
345
- ['stddevPop', 'STDDEV_POP', X, NUM, { portable: true, aggregate: true }],
346
- ['stddevSamp', 'STDDEV_SAMP', X, NUM, { portable: true, aggregate: true }],
347
- ['variance', 'VARIANCE', X, NUM, { portable: true, aggregate: true }],
348
- ['varPop', 'VAR_POP', X, NUM, { portable: true, aggregate: true }],
349
- ['varSamp', 'VAR_SAMP', X, NUM, { portable: true, aggregate: true }],
350
-
351
- // Window functions. They need `over()`: `fn.rowNumber().over({ orderBy })`.
352
- // Aggregate functions work as window functions too.
353
- ['rowNumber', 'ROW_NUMBER', '', 'number', WINDOW],
354
- ['rank', 'RANK', '', 'number', WINDOW],
355
- ['denseRank', 'DENSE_RANK', '', 'number', WINDOW],
356
- ['percentRank', 'PERCENT_RANK', '', 'number', WINDOW],
357
- ['cumeDist', 'CUME_DIST', '', 'number', WINDOW],
358
- ['ntile', 'NTILE', 'buckets: number', 'number', { ...WINDOW, build: buildNtile }],
359
- ['lag', 'LAG', LAG_PARAMS, ANY, { ...WINDOW, build: buildLagOrLead }],
360
- ['lead', 'LEAD', LAG_PARAMS, ANY, { ...WINDOW, build: buildLagOrLead }],
361
- ['firstValue', 'FIRST_VALUE', X, ANY, WINDOW],
362
- ['lastValue', 'LAST_VALUE', X, ANY, WINDOW],
363
- ['nthValue', 'NTH_VALUE', 'x: FnArg, n: number', ANY, { ...WINDOW, build: buildNthValue }],
364
-
365
- // Comparison and flow control functions. `fn.coalesce()` already exists.
366
- ['greatest', 'GREATEST', '...values: FnArg[]', ANY, { portable: true }],
367
- ['if', 'IF', 'condition: FnArg, then: FnArg, otherwise: FnArg', ANY],
368
- ['ifNull', 'IFNULL', 'value: FnArg, otherwise: FnArg', ANY],
369
- ['interval', 'INTERVAL', 'n: FnArg, ...ns: FnArg[]', NUM],
370
- ['isNull', 'ISNULL', X, BOOL],
371
- ['least', 'LEAST', '...values: FnArg[]', ANY, { portable: true }],
372
- ['nullIf', 'NULLIF', 'a: FnArg, b: FnArg', ANY, { portable: true }],
373
-
374
- // Cast functions.
375
- ['cast', 'CAST', 'x: FnArg, type: string', ANY, { build: buildCast }],
376
- [
377
- 'convert',
378
- 'CONVERT',
379
- 'x: FnArg, type: string | { using: string }',
380
- ANY,
381
- { build: buildConvert },
382
- ],
383
-
384
- // Information functions.
385
- ['charset', 'CHARSET', STRING, STR],
386
- ['coercibility', 'COERCIBILITY', STRING, NUM],
387
- ['collation', 'COLLATION', STRING, STR],
388
- ['connectionId', 'CONNECTION_ID', '', NUM],
389
- ['currentRole', 'CURRENT_ROLE', '', STR],
390
- ['currentUser', 'CURRENT_USER', '', STR],
391
- ['database', 'DATABASE', '', STR],
392
- ['icuVersion', 'ICU_VERSION', '', STR],
393
- ['lastInsertId', 'LAST_INSERT_ID', 'x?: FnArg', NUM],
394
- ['rolesGraphml', 'ROLES_GRAPHML', '', STR],
395
- ['rowCount', 'ROW_COUNT', '', NUM],
396
- ['schema', 'SCHEMA', '', STR],
397
- ['sessionUser', 'SESSION_USER', '', STR],
398
- ['systemUser', 'SYSTEM_USER', '', STR],
399
- ['user', 'USER', '', STR],
400
- ['version', 'VERSION', '', STR],
401
-
402
- // Encryption and compression functions.
403
- ['aesDecrypt', 'AES_DECRYPT', 'crypt: FnArg, key: FnArg, ...options: FnArg[]', BIN],
404
- ['aesEncrypt', 'AES_ENCRYPT', 'str: FnArg, key: FnArg, ...options: FnArg[]', BIN],
405
- ['compress', 'COMPRESS', STRING, BIN],
406
- ['md5', 'MD5', STRING, STR, { portable: true }],
407
- ['randomBytes', 'RANDOM_BYTES', 'length: FnArg', BIN],
408
- ['sha1', 'SHA1', STRING, STR],
409
- ['sha2', 'SHA2', 'str: FnArg, hashLength: FnArg', STR],
410
- ['statementDigest', 'STATEMENT_DIGEST', 'statement: FnArg', STR],
411
- ['statementDigestText', 'STATEMENT_DIGEST_TEXT', 'statement: FnArg', STR],
412
- ['uncompress', 'UNCOMPRESS', STRING, BIN],
413
- ['uncompressedLength', 'UNCOMPRESSED_LENGTH', STRING, NUM],
414
-
415
- // Locking functions.
416
- ['getLock', 'GET_LOCK', 'name: FnArg, timeout: FnArg', BOOL],
417
- ['isFreeLock', 'IS_FREE_LOCK', 'name: FnArg', BOOL],
418
- ['isUsedLock', 'IS_USED_LOCK', 'name: FnArg', NUM],
419
- ['releaseAllLocks', 'RELEASE_ALL_LOCKS', '', NUM],
420
- ['releaseLock', 'RELEASE_LOCK', 'name: FnArg', BOOL],
421
-
422
- // Miscellaneous functions.
423
- ['anyValue', 'ANY_VALUE', X, ANY],
424
- ['binToUuid', 'BIN_TO_UUID', 'bin: FnArg, swap?: FnArg', STR],
425
- ['default', 'DEFAULT', 'column: FnArg', ANY],
426
- ['grouping', 'GROUPING', '...exprs: FnArg[]', NUM],
427
- ['inet6Aton', 'INET6_ATON', 'address: FnArg', BIN],
428
- ['inet6Ntoa', 'INET6_NTOA', 'address: FnArg', STR],
429
- ['inetAton', 'INET_ATON', 'address: FnArg', NUM],
430
- ['inetNtoa', 'INET_NTOA', 'address: FnArg', STR],
431
- ['isIpv4', 'IS_IPV4', 'address: FnArg', BOOL],
432
- ['isIpv4Compat', 'IS_IPV4_COMPAT', 'address: FnArg', BOOL],
433
- ['isIpv4Mapped', 'IS_IPV4_MAPPED', 'address: FnArg', BOOL],
434
- ['isIpv6', 'IS_IPV6', 'address: FnArg', BOOL],
435
- ['isUuid', 'IS_UUID', 'uuid: FnArg', BOOL],
436
- ['sleep', 'SLEEP', 'seconds: FnArg', NUM],
437
- ['uuid', 'UUID', '', 'string'],
438
- ['uuidShort', 'UUID_SHORT', '', 'FnNumeric'],
439
- ['uuidToBin', 'UUID_TO_BIN', 'uuid: FnArg, swap?: FnArg', BIN],
440
-
441
- // Bit, performance schema, GTID and XML functions.
442
- ['bitCount', 'BIT_COUNT', X, NUM],
443
- ['formatBytes', 'FORMAT_BYTES', 'bytes: FnArg', STR],
444
- ['formatPicoTime', 'FORMAT_PICO_TIME', 'time: FnArg', STR],
445
- ['psCurrentThreadId', 'PS_CURRENT_THREAD_ID', '', NUM],
446
- ['psThreadId', 'PS_THREAD_ID', 'connectionId: FnArg', NUM],
447
- ['gtidSubset', 'GTID_SUBSET', 'set1: FnArg, set2: FnArg', BOOL],
448
- ['gtidSubtract', 'GTID_SUBTRACT', 'set1: FnArg, set2: FnArg', STR],
449
- ['sourcePosWait', 'SOURCE_POS_WAIT', 'logName: FnArg, logPos: FnArg, ...options: FnArg[]', NUM],
450
- ['waitForExecutedGtidSet', 'WAIT_FOR_EXECUTED_GTID_SET', 'gtidSet: FnArg, timeout?: FnArg', NUM],
451
- ['extractValue', 'EXTRACTVALUE', 'xml: FnArg, xpath: FnArg', STR],
452
- ['updateXml', 'UPDATEXML', 'xml: FnArg, xpath: FnArg, newXml: FnArg', STR],
453
-
454
- // JSON functions. Objects and arrays passed as JSON documents are cast to JSON.
455
- ['jsonArray', 'JSON_ARRAY', '...values: FnJsonArg[]', 'unknown[]', { json: 'all' }],
456
- [
457
- 'jsonArrayAppend',
458
- 'JSON_ARRAY_APPEND',
459
- 'doc: FnJsonArg, path: FnArg, value: FnJsonArg, ...pathsAndValues: FnJsonArg[]',
460
- ANY,
461
- { json: 'even' },
462
- ],
463
- [
464
- 'jsonArrayInsert',
465
- 'JSON_ARRAY_INSERT',
466
- 'doc: FnJsonArg, path: FnArg, value: FnJsonArg, ...pathsAndValues: FnJsonArg[]',
467
- ANY,
468
- { json: 'even' },
469
- ],
470
- [
471
- 'jsonContains',
472
- 'JSON_CONTAINS',
473
- 'target: FnJsonArg, candidate: FnJsonArg, path?: FnArg',
474
- BOOL,
475
- { json: [0, 1] },
476
- ],
477
- [
478
- 'jsonContainsPath',
479
- 'JSON_CONTAINS_PATH',
480
- "doc: FnJsonArg, oneOrAll: 'one' | 'all', ...paths: FnArg[]",
481
- BOOL,
482
- { json: [0] },
483
- ],
484
- ['jsonDepth', 'JSON_DEPTH', 'doc: FnJsonArg', NUM, { json: [0] }],
485
- ['jsonExtract', 'JSON_EXTRACT', 'doc: FnJsonArg, ...paths: FnArg[]', ANY, { json: [0] }],
486
- [
487
- 'jsonInsert',
488
- 'JSON_INSERT',
489
- 'doc: FnJsonArg, path: FnArg, value: FnJsonArg, ...pathsAndValues: FnJsonArg[]',
490
- ANY,
491
- { json: 'even' },
492
- ],
493
- ['jsonKeys', 'JSON_KEYS', 'doc: FnJsonArg, path?: FnArg', 'string[] | null', { json: [0] }],
494
- ['jsonLength', 'JSON_LENGTH', 'doc: FnJsonArg, path?: FnArg', NUM, { json: [0] }],
495
- ['jsonMergePatch', 'JSON_MERGE_PATCH', '...docs: FnJsonArg[]', ANY, { json: 'all' }],
496
- ['jsonMergePreserve', 'JSON_MERGE_PRESERVE', '...docs: FnJsonArg[]', ANY, { json: 'all' }],
497
- [
498
- 'jsonObject',
499
- 'JSON_OBJECT',
500
- 'objectOrKeysAndValues?: { [key: string]: FnJsonArg } | FnJsonArg, ...keysAndValues: FnJsonArg[]',
501
- 'Record<string, unknown>',
502
- { json: 'odd', build: buildJsonObject },
503
- ],
504
- ['jsonOverlaps', 'JSON_OVERLAPS', 'a: FnJsonArg, b: FnJsonArg', BOOL, { json: [0, 1] }],
505
- ['jsonPretty', 'JSON_PRETTY', 'doc: FnJsonArg', STR, { json: [0] }],
506
- ['jsonQuote', 'JSON_QUOTE', STRING, STR],
507
- ['jsonRemove', 'JSON_REMOVE', 'doc: FnJsonArg, ...paths: FnArg[]', ANY, { json: [0] }],
508
- [
509
- 'jsonReplace',
510
- 'JSON_REPLACE',
511
- 'doc: FnJsonArg, path: FnArg, value: FnJsonArg, ...pathsAndValues: FnJsonArg[]',
512
- ANY,
513
- { json: 'even' },
514
- ],
515
- [
516
- 'jsonSchemaValid',
517
- 'JSON_SCHEMA_VALID',
518
- 'schema: FnJsonArg, doc: FnJsonArg',
519
- BOOL,
520
- { json: [0, 1] },
521
- ],
522
- [
523
- 'jsonSchemaValidationReport',
524
- 'JSON_SCHEMA_VALIDATION_REPORT',
525
- 'schema: FnJsonArg, doc: FnJsonArg',
526
- 'Record<string, unknown> | null',
527
- { json: [0, 1] },
528
- ],
529
- [
530
- 'jsonSearch',
531
- 'JSON_SEARCH',
532
- "doc: FnJsonArg, oneOrAll: 'one' | 'all', search: FnArg, escape?: FnArg, ...paths: FnArg[]",
533
- 'string | string[] | null',
534
- { json: [0] },
535
- ],
536
- [
537
- 'jsonSet',
538
- 'JSON_SET',
539
- 'doc: FnJsonArg, path: FnArg, value: FnJsonArg, ...pathsAndValues: FnJsonArg[]',
540
- ANY,
541
- { json: 'even' },
542
- ],
543
- ['jsonStorageFree', 'JSON_STORAGE_FREE', 'doc: FnJsonArg', NUM, { json: [0] }],
544
- ['jsonStorageSize', 'JSON_STORAGE_SIZE', 'doc: FnJsonArg', NUM, { json: [0] }],
545
- ['jsonType', 'JSON_TYPE', 'value: FnJsonArg', STR, { json: [0] }],
546
- ['jsonUnquote', 'JSON_UNQUOTE', STRING, STR],
547
- ['jsonValid', 'JSON_VALID', 'value: FnArg', BOOL],
548
- [
549
- 'jsonValue',
550
- 'JSON_VALUE',
551
- 'doc: FnJsonArg, path: FnArg, options?: { returning?: string }',
552
- ANY,
553
- { json: [0], build: buildJsonValue },
554
- ],
555
- [
556
- 'memberOf',
557
- 'MEMBER OF',
558
- 'value: FnJsonArg, array: FnJsonArg',
559
- BOOL,
560
- { json: [0, 1], build: buildMemberOf },
561
- ],
82
+ // String functions.
83
+ ['ascii', 'ASCII', STRING, NUM, { portable: true }],
84
+ ['bin', 'BIN', 'n: FnArg', STR],
85
+ ['bitLength', 'BIT_LENGTH', STRING, NUM, { portable: true }],
86
+ [
87
+ 'char',
88
+ 'CHAR',
89
+ 'codes: FnArg | FnArg[], options?: { using?: string }',
90
+ BIN,
91
+ { build: buildChar },
92
+ ],
93
+ ['charLength', 'CHAR_LENGTH', STRING, NUM, { portable: true }],
94
+ ['characterLength', 'CHARACTER_LENGTH', STRING, NUM, { portable: true }],
95
+ ['concatWs', 'CONCAT_WS', 'separator: FnArg, ...strs: FnArg[]', STR, { portable: true }],
96
+ ['elt', 'ELT', 'n: FnArg, ...strs: FnArg[]', STR],
97
+ [
98
+ 'exportSet',
99
+ 'EXPORT_SET',
100
+ 'bits: FnArg, on: FnArg, off: FnArg, separator?: FnArg, numberOfBits?: FnArg',
101
+ STR,
102
+ ],
103
+ ['field', 'FIELD', 'str: FnArg, ...strs: FnArg[]', NUM],
104
+ ['findInSet', 'FIND_IN_SET', 'str: FnArg, strList: FnArg', NUM],
105
+ ['format', 'FORMAT', 'x: FnArg, decimals: FnArg, locale?: FnArg', STR],
106
+ ['fromBase64', 'FROM_BASE64', STRING, BIN],
107
+ ['hex', 'HEX', X, STR],
108
+ ['insert', 'INSERT', 'str: FnArg, pos: FnArg, len: FnArg, newStr: FnArg', STR],
109
+ ['instr', 'INSTR', 'str: FnArg, substr: FnArg', NUM],
110
+ ['lcase', 'LCASE', STRING, STR],
111
+ ['left', 'LEFT', 'str: FnArg, len: FnArg', STR, { portable: true }],
112
+ ['length', 'LENGTH', STRING, NUM, { portable: true }],
113
+ ['locate', 'LOCATE', 'substr: FnArg, str: FnArg, pos?: FnArg', NUM],
114
+ ['lpad', 'LPAD', 'str: FnArg, len: FnArg, padStr: FnArg', STR, { portable: true }],
115
+ ['ltrim', 'LTRIM', STRING, STR, { portable: true }],
116
+ ['makeSet', 'MAKE_SET', 'bits: FnArg, ...strs: FnArg[]', STR],
117
+ ['mid', 'MID', 'str: FnArg, pos: FnArg, len?: FnArg', STR],
118
+ ['oct', 'OCT', 'n: FnArg', STR],
119
+ ['octetLength', 'OCTET_LENGTH', STRING, NUM, { portable: true }],
120
+ ['ord', 'ORD', STRING, NUM],
121
+ [
122
+ 'position',
123
+ 'POSITION',
124
+ 'substr: FnArg, str: FnArg',
125
+ NUM,
126
+ { portable: true, build: buildPosition },
127
+ ],
128
+ ['quote', 'QUOTE', STRING, STR],
129
+ [
130
+ 'regexpInstr',
131
+ 'REGEXP_INSTR',
132
+ 'expr: FnArg, pattern: FnArg, pos?: FnArg, occurrence?: FnArg, returnOption?: FnArg, matchType?: FnArg',
133
+ NUM,
134
+ ],
135
+ ['regexpLike', 'REGEXP_LIKE', 'expr: FnArg, pattern: FnArg, matchType?: FnArg', BOOL],
136
+ [
137
+ 'regexpReplace',
138
+ 'REGEXP_REPLACE',
139
+ 'expr: FnArg, pattern: FnArg, replacement: FnArg, pos?: FnArg, occurrence?: FnArg, matchType?: FnArg',
140
+ STR,
141
+ ],
142
+ [
143
+ 'regexpSubstr',
144
+ 'REGEXP_SUBSTR',
145
+ 'expr: FnArg, pattern: FnArg, pos?: FnArg, occurrence?: FnArg, matchType?: FnArg',
146
+ STR,
147
+ ],
148
+ ['repeat', 'REPEAT', 'str: FnArg, count: FnArg', STR, { portable: true }],
149
+ ['replace', 'REPLACE', 'str: FnArg, from: FnArg, to: FnArg', STR, { portable: true }],
150
+ ['reverse', 'REVERSE', STRING, STR, { portable: true }],
151
+ ['right', 'RIGHT', 'str: FnArg, len: FnArg', STR, { portable: true }],
152
+ ['rpad', 'RPAD', 'str: FnArg, len: FnArg, padStr: FnArg', STR, { portable: true }],
153
+ ['rtrim', 'RTRIM', STRING, STR, { portable: true }],
154
+ ['soundex', 'SOUNDEX', STRING, STR],
155
+ ['space', 'SPACE', 'n: FnArg', STR],
156
+ ['strcmp', 'STRCMP', 'a: FnArg, b: FnArg', '-1 | 0 | 1 | null'],
157
+ ['substr', 'SUBSTR', 'str: FnArg, pos: FnArg, len?: FnArg', STR, { portable: true }],
158
+ ['substring', 'SUBSTRING', 'str: FnArg, pos: FnArg, len?: FnArg', STR, { portable: true }],
159
+ ['substringIndex', 'SUBSTRING_INDEX', 'str: FnArg, delimiter: FnArg, count: FnArg', STR],
160
+ ['toBase64', 'TO_BASE64', STRING, STR],
161
+ [
162
+ 'trim',
163
+ 'TRIM',
164
+ "str: FnArg, options?: { side?: 'both' | 'leading' | 'trailing'; remove?: FnArg }",
165
+ STR,
166
+ { portable: true, build: buildTrim },
167
+ ],
168
+ ['ucase', 'UCASE', STRING, STR],
169
+ ['unhex', 'UNHEX', STRING, BIN],
170
+ ['weightString', 'WEIGHT_STRING', STRING, BIN],
171
+ [
172
+ 'match',
173
+ 'MATCH',
174
+ "columns: FnArg | FnArg[], search: FnArg, options?: { mode?: 'natural' | 'natural with query expansion' | 'boolean' | 'with query expansion' }",
175
+ NUM,
176
+ { build: buildMatch },
177
+ ],
178
+ // Numeric functions.
179
+ ['abs', 'ABS', X, DEC, { portable: true }],
180
+ ['acos', 'ACOS', X, NUM, { portable: true }],
181
+ ['asin', 'ASIN', X, NUM, { portable: true }],
182
+ ['atan', 'ATAN', 'x: FnArg, y?: FnArg', NUM],
183
+ ['atan2', 'ATAN2', 'y: FnArg, x: FnArg', NUM, { portable: true }],
184
+ ['ceil', 'CEIL', X, DEC, { portable: true }],
185
+ ['ceiling', 'CEILING', X, DEC, { portable: true }],
186
+ ['conv', 'CONV', 'n: FnArg, fromBase: FnArg, toBase: FnArg', STR],
187
+ ['cos', 'COS', X, NUM, { portable: true }],
188
+ ['cot', 'COT', X, NUM, { portable: true }],
189
+ ['crc32', 'CRC32', X, NUM],
190
+ ['degrees', 'DEGREES', X, NUM, { portable: true }],
191
+ ['exp', 'EXP', X, NUM, { portable: true }],
192
+ ['floor', 'FLOOR', X, DEC, { portable: true }],
193
+ ['ln', 'LN', X, NUM, { portable: true }],
194
+ ['log', 'LOG', 'baseOrX: FnArg, x?: FnArg', NUM],
195
+ ['log10', 'LOG10', X, NUM],
196
+ ['log2', 'LOG2', X, NUM],
197
+ ['mod', 'MOD', 'n: FnArg, m: FnArg', DEC, { portable: true }],
198
+ ['pi', 'PI', '', NUM, { portable: true }],
199
+ ['pow', 'POW', 'x: FnArg, y: FnArg', NUM],
200
+ ['power', 'POWER', 'x: FnArg, y: FnArg', NUM, { portable: true }],
201
+ ['radians', 'RADIANS', X, NUM, { portable: true }],
202
+ ['rand', 'RAND', 'seed?: FnArg', NUM],
203
+ ['round', 'ROUND', 'x: FnArg, decimals?: FnArg', DEC, { portable: true }],
204
+ ['sign', 'SIGN', X, NUM, { portable: true }],
205
+ ['sin', 'SIN', X, NUM, { portable: true }],
206
+ ['sqrt', 'SQRT', X, NUM, { portable: true }],
207
+ ['tan', 'TAN', X, NUM, { portable: true }],
208
+ ['truncate', 'TRUNCATE', 'x: FnArg, decimals: FnArg', DEC],
209
+ // Date and time functions.
210
+ [
211
+ 'addDate',
212
+ 'ADDDATE',
213
+ 'date: FnArg, amount: FnArg, unit?: FnIntervalUnit',
214
+ DATE,
215
+ { build: buildDateAdd },
216
+ ],
217
+ ['addTime', 'ADDTIME', 'datetime: FnArg, time: FnArg', DATE],
218
+ ['convertTz', 'CONVERT_TZ', 'datetime: FnArg, fromTz: FnArg, toTz: FnArg', DATE],
219
+ ['curDate', 'CURDATE', '', DATE],
220
+ ['currentDate', 'CURRENT_DATE', '', DATE],
221
+ ['currentTime', 'CURRENT_TIME', FSP, TIME],
222
+ ['currentTimestamp', 'CURRENT_TIMESTAMP', FSP, DATE],
223
+ ['curTime', 'CURTIME', FSP, TIME],
224
+ ['date', 'DATE', X, DATE],
225
+ [
226
+ 'dateAdd',
227
+ 'DATE_ADD',
228
+ 'date: FnArg, amount: FnArg, unit: FnIntervalUnit',
229
+ DATE,
230
+ { build: buildDateAdd },
231
+ ],
232
+ ['dateDiff', 'DATEDIFF', 'a: FnArg, b: FnArg', NUM],
233
+ ['dateFormat', 'DATE_FORMAT', 'date: FnArg, format: FnArg', STR],
234
+ [
235
+ 'dateSub',
236
+ 'DATE_SUB',
237
+ 'date: FnArg, amount: FnArg, unit: FnIntervalUnit',
238
+ DATE,
239
+ { build: buildDateAdd },
240
+ ],
241
+ ['day', 'DAY', DATE_ARG, NUM],
242
+ ['dayName', 'DAYNAME', DATE_ARG, STR],
243
+ ['dayOfMonth', 'DAYOFMONTH', DATE_ARG, NUM],
244
+ ['dayOfWeek', 'DAYOFWEEK', DATE_ARG, NUM],
245
+ ['dayOfYear', 'DAYOFYEAR', DATE_ARG, NUM],
246
+ ['extract', 'EXTRACT', 'unit: FnIntervalUnit, date: FnArg', NUM, { build: buildExtract }],
247
+ ['fromDays', 'FROM_DAYS', 'days: FnArg', DATE],
248
+ ['fromUnixTime', 'FROM_UNIXTIME', 'timestamp: FnArg, format?: FnArg', DATE],
249
+ [
250
+ 'getFormat',
251
+ 'GET_FORMAT',
252
+ "type: 'DATE' | 'TIME' | 'DATETIME' | 'TIMESTAMP', locale: FnArg",
253
+ STR,
254
+ { build: buildGetFormat },
255
+ ],
256
+ ['hour', 'HOUR', 'time: FnArg', NUM],
257
+ ['lastDay', 'LAST_DAY', DATE_ARG, DATE],
258
+ ['localTime', 'LOCALTIME', FSP, DATE],
259
+ ['localTimestamp', 'LOCALTIMESTAMP', FSP, DATE],
260
+ ['makeDate', 'MAKEDATE', 'year: FnArg, dayOfYear: FnArg', DATE],
261
+ ['makeTime', 'MAKETIME', 'hour: FnArg, minute: FnArg, second: FnArg', TIME],
262
+ ['microsecond', 'MICROSECOND', 'time: FnArg', NUM],
263
+ ['minute', 'MINUTE', 'time: FnArg', NUM],
264
+ ['month', 'MONTH', DATE_ARG, NUM],
265
+ ['monthName', 'MONTHNAME', DATE_ARG, STR],
266
+ ['periodAdd', 'PERIOD_ADD', 'period: FnArg, months: FnArg', NUM],
267
+ ['periodDiff', 'PERIOD_DIFF', 'a: FnArg, b: FnArg', NUM],
268
+ ['quarter', 'QUARTER', DATE_ARG, NUM],
269
+ ['second', 'SECOND', 'time: FnArg', NUM],
270
+ ['secToTime', 'SEC_TO_TIME', 'seconds: FnArg', TIME],
271
+ ['strToDate', 'STR_TO_DATE', 'str: FnArg, format: FnArg', DATE],
272
+ [
273
+ 'subDate',
274
+ 'SUBDATE',
275
+ 'date: FnArg, amount: FnArg, unit?: FnIntervalUnit',
276
+ DATE,
277
+ { build: buildDateAdd },
278
+ ],
279
+ ['subTime', 'SUBTIME', 'datetime: FnArg, time: FnArg', DATE],
280
+ ['sysdate', 'SYSDATE', FSP, DATE],
281
+ ['time', 'TIME', X, TIME],
282
+ ['timeDiff', 'TIMEDIFF', 'a: FnArg, b: FnArg', TIME],
283
+ ['timestamp', 'TIMESTAMP', 'x: FnArg, time?: FnArg', DATE],
284
+ [
285
+ 'timestampAdd',
286
+ 'TIMESTAMPADD',
287
+ 'unit: FnTimestampUnit, amount: FnArg, date: FnArg',
288
+ DATE,
289
+ { build: buildTimestampFunction },
290
+ ],
291
+ [
292
+ 'timestampDiff',
293
+ 'TIMESTAMPDIFF',
294
+ 'unit: FnTimestampUnit, from: FnArg, to: FnArg',
295
+ NUM,
296
+ { build: buildTimestampFunction },
297
+ ],
298
+ ['timeFormat', 'TIME_FORMAT', 'time: FnArg, format: FnArg', STR],
299
+ ['timeToSec', 'TIME_TO_SEC', 'time: FnArg', NUM],
300
+ ['toDays', 'TO_DAYS', DATE_ARG, NUM],
301
+ ['toSeconds', 'TO_SECONDS', DATE_ARG, NUM],
302
+ ['unixTimestamp', 'UNIX_TIMESTAMP', 'date?: FnArg', DEC],
303
+ ['utcDate', 'UTC_DATE', '', DATE],
304
+ ['utcTime', 'UTC_TIME', FSP, TIME],
305
+ ['utcTimestamp', 'UTC_TIMESTAMP', FSP, DATE],
306
+ ['week', 'WEEK', 'date: FnArg, mode?: FnArg', NUM],
307
+ ['weekday', 'WEEKDAY', DATE_ARG, NUM],
308
+ ['weekOfYear', 'WEEKOFYEAR', DATE_ARG, NUM],
309
+ ['year', 'YEAR', DATE_ARG, NUM],
310
+ ['yearWeek', 'YEARWEEK', 'date: FnArg, mode?: FnArg', NUM],
311
+ // Aggregate functions. `fn.count()`, `fn.sum()`, `fn.avg()`, `fn.min()` and
312
+ // `fn.max()` already exist.
313
+ ['bitAnd', 'BIT_AND', X, DEC, { aggregate: true }],
314
+ ['bitOr', 'BIT_OR', X, DEC, { aggregate: true }],
315
+ ['bitXor', 'BIT_XOR', X, DEC, { aggregate: true }],
316
+ [
317
+ 'countDistinct',
318
+ 'COUNT',
319
+ '...exprs: FnArg[]',
320
+ 'number',
321
+ { build: buildCountDistinct, aggregate: true, portable: true },
322
+ ],
323
+ [
324
+ 'groupConcat',
325
+ 'GROUP_CONCAT',
326
+ 'exprs: FnArg | FnArg[], options?: { distinct?: boolean; orderBy?: FnOrderBy | FnOrderBy[]; separator?: string }',
327
+ STR,
328
+ { build: buildGroupConcat, aggregate: ([exprs]) => (Array.isArray(exprs) ? exprs.length : 1) },
329
+ ],
330
+ ['jsonArrayAgg', 'JSON_ARRAYAGG', X, 'unknown[] | null', { aggregate: true }],
331
+ ['jsonObjectAgg', 'JSON_OBJECTAGG', 'key: FnArg, value: FnArg', 'Record<string, unknown> | null'],
332
+ ['std', 'STD', X, NUM, { aggregate: true }],
333
+ ['stddev', 'STDDEV', X, NUM, { portable: true, aggregate: true }],
334
+ ['stddevPop', 'STDDEV_POP', X, NUM, { portable: true, aggregate: true }],
335
+ ['stddevSamp', 'STDDEV_SAMP', X, NUM, { portable: true, aggregate: true }],
336
+ ['variance', 'VARIANCE', X, NUM, { portable: true, aggregate: true }],
337
+ ['varPop', 'VAR_POP', X, NUM, { portable: true, aggregate: true }],
338
+ ['varSamp', 'VAR_SAMP', X, NUM, { portable: true, aggregate: true }],
339
+ // Window functions. They need `over()`: `fn.rowNumber().over({ orderBy })`.
340
+ // Aggregate functions work as window functions too.
341
+ ['rowNumber', 'ROW_NUMBER', '', 'number', WINDOW],
342
+ ['rank', 'RANK', '', 'number', WINDOW],
343
+ ['denseRank', 'DENSE_RANK', '', 'number', WINDOW],
344
+ ['percentRank', 'PERCENT_RANK', '', 'number', WINDOW],
345
+ ['cumeDist', 'CUME_DIST', '', 'number', WINDOW],
346
+ ['ntile', 'NTILE', 'buckets: number', 'number', { ...WINDOW, build: buildNtile }],
347
+ ['lag', 'LAG', LAG_PARAMS, ANY, { ...WINDOW, build: buildLagOrLead }],
348
+ ['lead', 'LEAD', LAG_PARAMS, ANY, { ...WINDOW, build: buildLagOrLead }],
349
+ ['firstValue', 'FIRST_VALUE', X, ANY, WINDOW],
350
+ ['lastValue', 'LAST_VALUE', X, ANY, WINDOW],
351
+ ['nthValue', 'NTH_VALUE', 'x: FnArg, n: number', ANY, { ...WINDOW, build: buildNthValue }],
352
+ // Comparison and flow control functions. `fn.coalesce()` already exists.
353
+ ['greatest', 'GREATEST', '...values: FnArg[]', ANY, { portable: true }],
354
+ ['if', 'IF', 'condition: FnArg, then: FnArg, otherwise: FnArg', ANY],
355
+ ['ifNull', 'IFNULL', 'value: FnArg, otherwise: FnArg', ANY],
356
+ ['interval', 'INTERVAL', 'n: FnArg, ...ns: FnArg[]', NUM],
357
+ ['isNull', 'ISNULL', X, BOOL],
358
+ ['least', 'LEAST', '...values: FnArg[]', ANY, { portable: true }],
359
+ ['nullIf', 'NULLIF', 'a: FnArg, b: FnArg', ANY, { portable: true }],
360
+ // Cast functions.
361
+ ['cast', 'CAST', 'x: FnArg, type: string', ANY, { build: buildCast }],
362
+ [
363
+ 'convert',
364
+ 'CONVERT',
365
+ 'x: FnArg, type: string | { using: string }',
366
+ ANY,
367
+ { build: buildConvert },
368
+ ],
369
+ // Information functions.
370
+ ['charset', 'CHARSET', STRING, STR],
371
+ ['coercibility', 'COERCIBILITY', STRING, NUM],
372
+ ['collation', 'COLLATION', STRING, STR],
373
+ ['connectionId', 'CONNECTION_ID', '', NUM],
374
+ ['currentRole', 'CURRENT_ROLE', '', STR],
375
+ ['currentUser', 'CURRENT_USER', '', STR],
376
+ ['database', 'DATABASE', '', STR],
377
+ ['icuVersion', 'ICU_VERSION', '', STR],
378
+ ['lastInsertId', 'LAST_INSERT_ID', 'x?: FnArg', NUM],
379
+ ['rolesGraphml', 'ROLES_GRAPHML', '', STR],
380
+ ['rowCount', 'ROW_COUNT', '', NUM],
381
+ ['schema', 'SCHEMA', '', STR],
382
+ ['sessionUser', 'SESSION_USER', '', STR],
383
+ ['systemUser', 'SYSTEM_USER', '', STR],
384
+ ['user', 'USER', '', STR],
385
+ ['version', 'VERSION', '', STR],
386
+ // Encryption and compression functions.
387
+ ['aesDecrypt', 'AES_DECRYPT', 'crypt: FnArg, key: FnArg, ...options: FnArg[]', BIN],
388
+ ['aesEncrypt', 'AES_ENCRYPT', 'str: FnArg, key: FnArg, ...options: FnArg[]', BIN],
389
+ ['compress', 'COMPRESS', STRING, BIN],
390
+ ['md5', 'MD5', STRING, STR, { portable: true }],
391
+ ['randomBytes', 'RANDOM_BYTES', 'length: FnArg', BIN],
392
+ ['sha1', 'SHA1', STRING, STR],
393
+ ['sha2', 'SHA2', 'str: FnArg, hashLength: FnArg', STR],
394
+ ['statementDigest', 'STATEMENT_DIGEST', 'statement: FnArg', STR],
395
+ ['statementDigestText', 'STATEMENT_DIGEST_TEXT', 'statement: FnArg', STR],
396
+ ['uncompress', 'UNCOMPRESS', STRING, BIN],
397
+ ['uncompressedLength', 'UNCOMPRESSED_LENGTH', STRING, NUM],
398
+ // Locking functions.
399
+ ['getLock', 'GET_LOCK', 'name: FnArg, timeout: FnArg', BOOL],
400
+ ['isFreeLock', 'IS_FREE_LOCK', 'name: FnArg', BOOL],
401
+ ['isUsedLock', 'IS_USED_LOCK', 'name: FnArg', NUM],
402
+ ['releaseAllLocks', 'RELEASE_ALL_LOCKS', '', NUM],
403
+ ['releaseLock', 'RELEASE_LOCK', 'name: FnArg', BOOL],
404
+ // Miscellaneous functions.
405
+ ['anyValue', 'ANY_VALUE', X, ANY],
406
+ ['binToUuid', 'BIN_TO_UUID', 'bin: FnArg, swap?: FnArg', STR],
407
+ ['default', 'DEFAULT', 'column: FnArg', ANY],
408
+ ['grouping', 'GROUPING', '...exprs: FnArg[]', NUM],
409
+ ['inet6Aton', 'INET6_ATON', 'address: FnArg', BIN],
410
+ ['inet6Ntoa', 'INET6_NTOA', 'address: FnArg', STR],
411
+ ['inetAton', 'INET_ATON', 'address: FnArg', NUM],
412
+ ['inetNtoa', 'INET_NTOA', 'address: FnArg', STR],
413
+ ['isIpv4', 'IS_IPV4', 'address: FnArg', BOOL],
414
+ ['isIpv4Compat', 'IS_IPV4_COMPAT', 'address: FnArg', BOOL],
415
+ ['isIpv4Mapped', 'IS_IPV4_MAPPED', 'address: FnArg', BOOL],
416
+ ['isIpv6', 'IS_IPV6', 'address: FnArg', BOOL],
417
+ ['isUuid', 'IS_UUID', 'uuid: FnArg', BOOL],
418
+ ['sleep', 'SLEEP', 'seconds: FnArg', NUM],
419
+ ['uuid', 'UUID', '', 'string'],
420
+ ['uuidShort', 'UUID_SHORT', '', 'FnNumeric'],
421
+ ['uuidToBin', 'UUID_TO_BIN', 'uuid: FnArg, swap?: FnArg', BIN],
422
+ // Bit, performance schema, GTID and XML functions.
423
+ ['bitCount', 'BIT_COUNT', X, NUM],
424
+ ['formatBytes', 'FORMAT_BYTES', 'bytes: FnArg', STR],
425
+ ['formatPicoTime', 'FORMAT_PICO_TIME', 'time: FnArg', STR],
426
+ ['psCurrentThreadId', 'PS_CURRENT_THREAD_ID', '', NUM],
427
+ ['psThreadId', 'PS_THREAD_ID', 'connectionId: FnArg', NUM],
428
+ ['gtidSubset', 'GTID_SUBSET', 'set1: FnArg, set2: FnArg', BOOL],
429
+ ['gtidSubtract', 'GTID_SUBTRACT', 'set1: FnArg, set2: FnArg', STR],
430
+ ['sourcePosWait', 'SOURCE_POS_WAIT', 'logName: FnArg, logPos: FnArg, ...options: FnArg[]', NUM],
431
+ ['waitForExecutedGtidSet', 'WAIT_FOR_EXECUTED_GTID_SET', 'gtidSet: FnArg, timeout?: FnArg', NUM],
432
+ ['extractValue', 'EXTRACTVALUE', 'xml: FnArg, xpath: FnArg', STR],
433
+ ['updateXml', 'UPDATEXML', 'xml: FnArg, xpath: FnArg, newXml: FnArg', STR],
434
+ // JSON functions. Objects and arrays passed as JSON documents are cast to JSON.
435
+ ['jsonArray', 'JSON_ARRAY', '...values: FnJsonArg[]', 'unknown[]', { json: 'all' }],
436
+ [
437
+ 'jsonArrayAppend',
438
+ 'JSON_ARRAY_APPEND',
439
+ 'doc: FnJsonArg, path: FnArg, value: FnJsonArg, ...pathsAndValues: FnJsonArg[]',
440
+ ANY,
441
+ { json: 'even' },
442
+ ],
443
+ [
444
+ 'jsonArrayInsert',
445
+ 'JSON_ARRAY_INSERT',
446
+ 'doc: FnJsonArg, path: FnArg, value: FnJsonArg, ...pathsAndValues: FnJsonArg[]',
447
+ ANY,
448
+ { json: 'even' },
449
+ ],
450
+ [
451
+ 'jsonContains',
452
+ 'JSON_CONTAINS',
453
+ 'target: FnJsonArg, candidate: FnJsonArg, path?: FnArg',
454
+ BOOL,
455
+ { json: [0, 1] },
456
+ ],
457
+ [
458
+ 'jsonContainsPath',
459
+ 'JSON_CONTAINS_PATH',
460
+ "doc: FnJsonArg, oneOrAll: 'one' | 'all', ...paths: FnArg[]",
461
+ BOOL,
462
+ { json: [0] },
463
+ ],
464
+ ['jsonDepth', 'JSON_DEPTH', 'doc: FnJsonArg', NUM, { json: [0] }],
465
+ ['jsonExtract', 'JSON_EXTRACT', 'doc: FnJsonArg, ...paths: FnArg[]', ANY, { json: [0] }],
466
+ [
467
+ 'jsonInsert',
468
+ 'JSON_INSERT',
469
+ 'doc: FnJsonArg, path: FnArg, value: FnJsonArg, ...pathsAndValues: FnJsonArg[]',
470
+ ANY,
471
+ { json: 'even' },
472
+ ],
473
+ ['jsonKeys', 'JSON_KEYS', 'doc: FnJsonArg, path?: FnArg', 'string[] | null', { json: [0] }],
474
+ ['jsonLength', 'JSON_LENGTH', 'doc: FnJsonArg, path?: FnArg', NUM, { json: [0] }],
475
+ ['jsonMergePatch', 'JSON_MERGE_PATCH', '...docs: FnJsonArg[]', ANY, { json: 'all' }],
476
+ ['jsonMergePreserve', 'JSON_MERGE_PRESERVE', '...docs: FnJsonArg[]', ANY, { json: 'all' }],
477
+ [
478
+ 'jsonObject',
479
+ 'JSON_OBJECT',
480
+ 'objectOrKeysAndValues?: { [key: string]: FnJsonArg } | FnJsonArg, ...keysAndValues: FnJsonArg[]',
481
+ 'Record<string, unknown>',
482
+ { json: 'odd', build: buildJsonObject },
483
+ ],
484
+ ['jsonOverlaps', 'JSON_OVERLAPS', 'a: FnJsonArg, b: FnJsonArg', BOOL, { json: [0, 1] }],
485
+ ['jsonPretty', 'JSON_PRETTY', 'doc: FnJsonArg', STR, { json: [0] }],
486
+ ['jsonQuote', 'JSON_QUOTE', STRING, STR],
487
+ ['jsonRemove', 'JSON_REMOVE', 'doc: FnJsonArg, ...paths: FnArg[]', ANY, { json: [0] }],
488
+ [
489
+ 'jsonReplace',
490
+ 'JSON_REPLACE',
491
+ 'doc: FnJsonArg, path: FnArg, value: FnJsonArg, ...pathsAndValues: FnJsonArg[]',
492
+ ANY,
493
+ { json: 'even' },
494
+ ],
495
+ [
496
+ 'jsonSchemaValid',
497
+ 'JSON_SCHEMA_VALID',
498
+ 'schema: FnJsonArg, doc: FnJsonArg',
499
+ BOOL,
500
+ { json: [0, 1] },
501
+ ],
502
+ [
503
+ 'jsonSchemaValidationReport',
504
+ 'JSON_SCHEMA_VALIDATION_REPORT',
505
+ 'schema: FnJsonArg, doc: FnJsonArg',
506
+ 'Record<string, unknown> | null',
507
+ { json: [0, 1] },
508
+ ],
509
+ [
510
+ 'jsonSearch',
511
+ 'JSON_SEARCH',
512
+ "doc: FnJsonArg, oneOrAll: 'one' | 'all', search: FnArg, escape?: FnArg, ...paths: FnArg[]",
513
+ 'string | string[] | null',
514
+ { json: [0] },
515
+ ],
516
+ [
517
+ 'jsonSet',
518
+ 'JSON_SET',
519
+ 'doc: FnJsonArg, path: FnArg, value: FnJsonArg, ...pathsAndValues: FnJsonArg[]',
520
+ ANY,
521
+ { json: 'even' },
522
+ ],
523
+ ['jsonStorageFree', 'JSON_STORAGE_FREE', 'doc: FnJsonArg', NUM, { json: [0] }],
524
+ ['jsonStorageSize', 'JSON_STORAGE_SIZE', 'doc: FnJsonArg', NUM, { json: [0] }],
525
+ ['jsonType', 'JSON_TYPE', 'value: FnJsonArg', STR, { json: [0] }],
526
+ ['jsonUnquote', 'JSON_UNQUOTE', STRING, STR],
527
+ ['jsonValid', 'JSON_VALID', 'value: FnArg', BOOL],
528
+ [
529
+ 'jsonValue',
530
+ 'JSON_VALUE',
531
+ 'doc: FnJsonArg, path: FnArg, options?: { returning?: string }',
532
+ ANY,
533
+ { json: [0], build: buildJsonValue },
534
+ ],
535
+ [
536
+ 'memberOf',
537
+ 'MEMBER OF',
538
+ 'value: FnJsonArg, array: FnJsonArg',
539
+ BOOL,
540
+ { json: [0, 1], build: buildMemberOf },
541
+ ],
562
542
  ];
563
-
564
543
  // Builders for the functions with keywords in their syntax. They return
565
544
  // `[sql, args]`. Keywords are checked against lists, since they can't be bindings.
566
-
567
545
  function buildDateAdd(name, sql, [date, amount, unit]) {
568
- if (unit === undefined && (sql === 'ADDDATE' || sql === 'SUBDATE')) {
569
- // The `ADDDATE(date, days)` form.
570
- return [`${sql}(?, ?)`, [date, amount]];
571
- }
572
-
573
- return [`${sql}(?, INTERVAL ? ${keyword(name, 'unit', unit, INTERVAL_UNITS)})`, [date, amount]];
546
+ if (unit === undefined && (sql === 'ADDDATE' || sql === 'SUBDATE')) {
547
+ // The `ADDDATE(date, days)` form.
548
+ return [`${sql}(?, ?)`, [date, amount]];
549
+ }
550
+ return [`${sql}(?, INTERVAL ? ${keyword(name, 'unit', unit, INTERVAL_UNITS)})`, [date, amount]];
574
551
  }
575
-
576
552
  function buildTimestampFunction(name, sql, [unit, a, b]) {
577
- return [`${sql}(${keyword(name, 'unit', unit, TIMESTAMP_UNITS)}, ?, ?)`, [a, b]];
553
+ return [`${sql}(${keyword(name, 'unit', unit, TIMESTAMP_UNITS)}, ?, ?)`, [a, b]];
578
554
  }
579
-
580
555
  function buildExtract(name, sql, [unit, date]) {
581
- return [`EXTRACT(${keyword(name, 'unit', unit, INTERVAL_UNITS)} FROM ?)`, [date]];
556
+ return [`EXTRACT(${keyword(name, 'unit', unit, INTERVAL_UNITS)} FROM ?)`, [date]];
582
557
  }
583
-
584
558
  function buildGetFormat(name, sql, [type, locale]) {
585
- return [`GET_FORMAT(${keyword(name, 'type', type, FORMAT_TYPES)}, ?)`, [locale]];
559
+ return [`GET_FORMAT(${keyword(name, 'type', type, FORMAT_TYPES)}, ?)`, [locale]];
586
560
  }
587
-
588
561
  function buildCast(name, sql, [value, type]) {
589
- if (typeof type !== 'string' || !CAST_TYPE.test(type.trim())) {
590
- throw new Error(`fn.cast(): invalid type ${JSON.stringify(type)}`);
591
- }
592
-
593
- return [`CAST(? AS ${type.trim().toUpperCase()})`, [value]];
562
+ if (typeof type !== 'string' || !CAST_TYPE.test(type.trim())) {
563
+ throw new Error(`fn.cast(): invalid type ${JSON.stringify(type)}`);
564
+ }
565
+ return [`CAST(? AS ${type.trim().toUpperCase()})`, [value]];
594
566
  }
595
-
596
567
  function buildConvert(name, sql, [value, type]) {
597
- if (type !== null && typeof type === 'object') {
598
- if (typeof type.using !== 'string' || !CHARSET.test(type.using)) {
599
- throw new Error(`fn.convert(): invalid character set ${JSON.stringify(type.using)}`);
568
+ if (type !== null && typeof type === 'object') {
569
+ if (typeof type.using !== 'string' || !CHARSET.test(type.using)) {
570
+ throw new Error(`fn.convert(): invalid character set ${JSON.stringify(type.using)}`);
571
+ }
572
+ return [`CONVERT(? USING ${type.using})`, [value]];
573
+ }
574
+ if (typeof type !== 'string' || !CAST_TYPE.test(type.trim())) {
575
+ throw new Error(`fn.convert(): invalid type ${JSON.stringify(type)}`);
600
576
  }
601
-
602
- return [`CONVERT(? USING ${type.using})`, [value]];
603
- }
604
-
605
- if (typeof type !== 'string' || !CAST_TYPE.test(type.trim())) {
606
- throw new Error(`fn.convert(): invalid type ${JSON.stringify(type)}`);
607
- }
608
-
609
- return [`CONVERT(?, ${type.trim().toUpperCase()})`, [value]];
577
+ return [`CONVERT(?, ${type.trim().toUpperCase()})`, [value]];
610
578
  }
611
-
612
579
  function buildPosition(name, sql, [substr, str]) {
613
- return ['POSITION(? IN ?)', [substr, str]];
580
+ return ['POSITION(? IN ?)', [substr, str]];
614
581
  }
615
-
616
582
  function buildTrim(name, sql, [str, options = {}]) {
617
- if (options.side === undefined && options.remove === undefined) {
618
- return ['TRIM(?)', [str]];
619
- }
620
-
621
- const side =
622
- options.side === undefined ? 'BOTH' : keyword(name, 'side', options.side, TRIM_SIDES);
623
-
624
- if (options.remove === undefined) {
625
- return [`TRIM(${side} FROM ?)`, [str]];
626
- } else {
627
- return [`TRIM(${side} ? FROM ?)`, [options.remove, str]];
628
- }
583
+ if (options.side === undefined && options.remove === undefined) {
584
+ return ['TRIM(?)', [str]];
585
+ }
586
+ const side = options.side === undefined ? 'BOTH' : keyword(name, 'side', options.side, TRIM_SIDES);
587
+ if (options.remove === undefined) {
588
+ return [`TRIM(${side} FROM ?)`, [str]];
589
+ }
590
+ else {
591
+ return [`TRIM(${side} ? FROM ?)`, [options.remove, str]];
592
+ }
629
593
  }
630
-
631
594
  function buildChar(name, sql, [codes, options = {}]) {
632
- codes = Array.isArray(codes) ? codes : [codes];
633
- const placeholders = codes.map(() => '?').join(', ');
634
-
635
- if (options.using === undefined) {
636
- return [`CHAR(${placeholders})`, codes];
637
- }
638
-
639
- if (typeof options.using !== 'string' || !CHARSET.test(options.using)) {
640
- throw new Error(`fn.char(): invalid character set ${JSON.stringify(options.using)}`);
641
- }
642
-
643
- return [`CHAR(${placeholders} USING ${options.using})`, codes];
595
+ codes = Array.isArray(codes) ? codes : [codes];
596
+ const placeholders = codes.map(() => '?').join(', ');
597
+ if (options.using === undefined) {
598
+ return [`CHAR(${placeholders})`, codes];
599
+ }
600
+ if (typeof options.using !== 'string' || !CHARSET.test(options.using)) {
601
+ throw new Error(`fn.char(): invalid character set ${JSON.stringify(options.using)}`);
602
+ }
603
+ return [`CHAR(${placeholders} USING ${options.using})`, codes];
644
604
  }
645
-
646
605
  function buildMatch(name, sql, [columns, search, options = {}]) {
647
- columns = Array.isArray(columns) ? columns : [columns];
648
- let mode = '';
649
-
650
- if (options.mode !== undefined) {
651
- mode = MATCH_MODES[options.mode];
652
-
653
- if (!mode) {
654
- throw new Error(`fn.match(): invalid mode ${JSON.stringify(options.mode)}`);
606
+ columns = Array.isArray(columns) ? columns : [columns];
607
+ let mode = '';
608
+ if (options.mode !== undefined) {
609
+ mode = MATCH_MODES[options.mode];
610
+ if (!mode) {
611
+ throw new Error(`fn.match(): invalid mode ${JSON.stringify(options.mode)}`);
612
+ }
613
+ mode = ` ${mode}`;
655
614
  }
656
-
657
- mode = ` ${mode}`;
658
- }
659
-
660
- return [`MATCH(${columns.map(() => '?').join(', ')}) AGAINST(?${mode})`, [...columns, search]];
615
+ return [`MATCH(${columns.map(() => '?').join(', ')}) AGAINST(?${mode})`, [...columns, search]];
661
616
  }
662
-
663
617
  function buildCountDistinct(name, sql, exprs) {
664
- return [`COUNT(DISTINCT ${exprs.map(() => '?').join(', ')})`, exprs];
618
+ return [`COUNT(DISTINCT ${exprs.map(() => '?').join(', ')})`, exprs];
665
619
  }
666
-
667
620
  function buildGroupConcat(name, sql, [exprs, options = {}]) {
668
- exprs = Array.isArray(exprs) ? exprs : [exprs];
669
-
670
- let text = `GROUP_CONCAT(${options.distinct ? 'DISTINCT ' : ''}${exprs.map(() => '?').join(', ')}`;
671
- const args = [...exprs];
672
-
673
- if (options.orderBy !== undefined) {
674
- const [orderBySql, orderByArgs] = buildOrderBy(name, options.orderBy);
675
- text += ` ORDER BY ${orderBySql}`;
676
- args.push(...orderByArgs);
677
- }
678
-
679
- if (options.separator !== undefined) {
680
- text += ' SEPARATOR ?';
681
- args.push(options.separator);
682
- }
683
-
684
- return [`${text})`, args];
621
+ exprs = Array.isArray(exprs) ? exprs : [exprs];
622
+ let text = `GROUP_CONCAT(${options.distinct ? 'DISTINCT ' : ''}${exprs.map(() => '?').join(', ')}`;
623
+ const args = [...exprs];
624
+ if (options.orderBy !== undefined) {
625
+ const [orderBySql, orderByArgs] = buildOrderBy(name, options.orderBy);
626
+ text += ` ORDER BY ${orderBySql}`;
627
+ args.push(...orderByArgs);
628
+ }
629
+ if (options.separator !== undefined) {
630
+ text += ' SEPARATOR ?';
631
+ args.push(options.separator);
632
+ }
633
+ return [`${text})`, args];
685
634
  }
686
-
687
635
  // `orderBy` of `groupConcat()` and `over()`: a column, `[column, 'desc']` or a
688
636
  // list of them. Strings are column names.
689
637
  function buildOrderBy(name, orderBy) {
690
- const list = Array.isArray(orderBy) && !isOrderByPair(orderBy) ? orderBy : [orderBy];
691
- const args = [];
692
-
693
- const sql = list
694
- .map((it) => {
695
- if (!Array.isArray(it)) {
696
- args.push(toColumn(it));
697
- return '?';
698
- }
699
-
700
- if (it.length !== 2) {
701
- throw new Error(
702
- `${label(name)}: invalid orderBy item. Use a column or [column, 'asc' | 'desc'].`,
703
- );
704
- }
705
-
706
- args.push(toColumn(it[0]));
707
- return `? ${keyword(name, 'direction', it[1], DIRECTIONS)}`;
638
+ const list = Array.isArray(orderBy) && !isOrderByPair(orderBy) ? orderBy : [orderBy];
639
+ const args = [];
640
+ const sql = list
641
+ .map((it) => {
642
+ if (!Array.isArray(it)) {
643
+ args.push(toColumn(it));
644
+ return '?';
645
+ }
646
+ if (it.length !== 2) {
647
+ throw new Error(`${label(name)}: invalid orderBy item. Use a column or [column, 'asc' | 'desc'].`);
648
+ }
649
+ args.push(toColumn(it[0]));
650
+ return `? ${keyword(name, 'direction', it[1], DIRECTIONS)}`;
708
651
  })
709
- .join(', ');
710
-
711
- return [sql, args];
652
+ .join(', ');
653
+ return [sql, args];
712
654
  }
713
-
714
655
  function toColumn(column) {
715
- return typeof column === 'string' ? ref(column) : column;
656
+ return typeof column === 'string' ? ref(column) : column;
716
657
  }
717
-
718
658
  function buildNtile(name, sql, [buckets]) {
719
- return [`NTILE(${integer(name, 'buckets', buckets, 1)})`, []];
659
+ return [`NTILE(${integer(name, 'buckets', buckets, 1)})`, []];
720
660
  }
721
-
722
661
  function buildLagOrLead(name, sql, [value, offset, defaultValue]) {
723
- if (offset === undefined && defaultValue === undefined) {
724
- return [`${sql}(?)`, [value]];
725
- }
726
-
727
- offset = offset === undefined ? 1 : integer(name, 'offset', offset, 0);
728
-
729
- if (defaultValue === undefined) {
730
- return [`${sql}(?, ${offset})`, [value]];
731
- }
732
-
733
- return [`${sql}(?, ${offset}, ?)`, [value, defaultValue]];
662
+ if (offset === undefined && defaultValue === undefined) {
663
+ return [`${sql}(?)`, [value]];
664
+ }
665
+ offset = offset === undefined ? 1 : integer(name, 'offset', offset, 0);
666
+ if (defaultValue === undefined) {
667
+ return [`${sql}(?, ${offset})`, [value]];
668
+ }
669
+ return [`${sql}(?, ${offset}, ?)`, [value, defaultValue]];
734
670
  }
735
-
736
671
  function buildNthValue(name, sql, [value, n]) {
737
- return [`NTH_VALUE(?, ${integer(name, 'n', n, 1)})`, [value]];
672
+ return [`NTH_VALUE(?, ${integer(name, 'n', n, 1)})`, [value]];
738
673
  }
739
-
740
674
  // The integer arguments of window functions are checked and written into the
741
675
  // sql, since they are part of the syntax rather than values.
742
676
  function integer(name, what, value, min) {
743
- if (!Number.isInteger(value) || value < min) {
744
- throw new Error(
745
- `fn.${name}(): ${what} must be an integer >= ${min}, got ${JSON.stringify(value)}`,
746
- );
747
- }
748
-
749
- return value;
677
+ if (!Number.isInteger(value) || value < min) {
678
+ throw new Error(`fn.${name}(): ${what} must be an integer >= ${min}, got ${JSON.stringify(value)}`);
679
+ }
680
+ return value;
750
681
  }
751
-
752
682
  // `[column, 'desc']`, as opposed to a list of two columns.
753
683
  function isOrderByPair(it) {
754
- return (
755
- Array.isArray(it) &&
756
- it.length === 2 &&
757
- typeof it[1] === 'string' &&
758
- DIRECTIONS.includes(it[1].trim().toUpperCase())
759
- );
684
+ return (Array.isArray(it) &&
685
+ it.length === 2 &&
686
+ typeof it[1] === 'string' &&
687
+ DIRECTIONS.includes(it[1].trim().toUpperCase()));
760
688
  }
761
-
762
689
  function buildJsonValue(name, sql, [doc, path, options = {}]) {
763
- if (options.returning === undefined) {
764
- return ['JSON_VALUE(?, ?)', [doc, path]];
765
- }
766
-
767
- if (typeof options.returning !== 'string' || !CAST_TYPE.test(options.returning.trim())) {
768
- throw new Error(`fn.jsonValue(): invalid type ${JSON.stringify(options.returning)}`);
769
- }
770
-
771
- return [`JSON_VALUE(?, ? RETURNING ${options.returning.trim().toUpperCase()})`, [doc, path]];
690
+ if (options.returning === undefined) {
691
+ return ['JSON_VALUE(?, ?)', [doc, path]];
692
+ }
693
+ if (typeof options.returning !== 'string' || !CAST_TYPE.test(options.returning.trim())) {
694
+ throw new Error(`fn.jsonValue(): invalid type ${JSON.stringify(options.returning)}`);
695
+ }
696
+ return [`JSON_VALUE(?, ? RETURNING ${options.returning.trim().toUpperCase()})`, [doc, path]];
772
697
  }
773
-
774
698
  function buildMemberOf(name, sql, [value, array]) {
775
- return ['(? MEMBER OF(?))', [value, array]];
699
+ return ['(? MEMBER OF(?))', [value, array]];
776
700
  }
777
-
778
701
  function buildJsonObject(name, sql, args) {
779
- // `fn.jsonObject({ a: ref('a'), b: 1 })` is `JSON_OBJECT('a', a, 'b', 1)`.
780
- if (args.length === 1 && isPlainObjectArg(args[0])) {
781
- args = Object.entries(args[0]).flat();
782
- }
783
-
784
- return [`JSON_OBJECT(${args.map(() => '?').join(', ')})`, args];
702
+ // `fn.jsonObject({ a: ref('a'), b: 1 })` is `JSON_OBJECT('a', a, 'b', 1)`.
703
+ if (args.length === 1 && isPlainObjectArg(args[0])) {
704
+ args = Object.entries(args[0]).flat();
705
+ }
706
+ return [`JSON_OBJECT(${args.map(() => '?').join(', ')})`, args];
785
707
  }
786
-
787
708
  function isPlainObjectArg(value) {
788
- return (
789
- value !== null &&
790
- typeof value === 'object' &&
791
- (value.constructor === Object || value.constructor === undefined)
792
- );
709
+ return (value !== null &&
710
+ typeof value === 'object' &&
711
+ (value.constructor === Object || value.constructor === undefined));
793
712
  }
794
-
795
713
  // `name` is the name of an `fn` helper, or a method like `over()`.
796
714
  function label(name) {
797
- return name.endsWith('()') ? name : `fn.${name}()`;
715
+ return name.endsWith('()') ? name : `fn.${name}()`;
798
716
  }
799
-
800
717
  function keyword(name, what, value, allowed) {
801
- const upper = typeof value === 'string' ? value.trim().toUpperCase() : null;
802
-
803
- if (!allowed.includes(upper)) {
804
- throw new Error(
805
- `${label(name)}: invalid ${what} ${JSON.stringify(value)}. Use one of ${allowed.join(', ')}.`,
806
- );
807
- }
808
-
809
- return upper;
718
+ const upper = typeof value === 'string' ? value.trim().toUpperCase() : null;
719
+ if (!allowed.includes(upper)) {
720
+ throw new Error(`${label(name)}: invalid ${what} ${JSON.stringify(value)}. Use one of ${allowed.join(', ')}.`);
721
+ }
722
+ return upper;
810
723
  }
811
-
724
+ // The helpers MariaDB (10.6 and 11.4) can't run as MySQL writes them. Each
725
+ // returns why for the given arguments, or null. A query built for MariaDB throws
726
+ // the reason instead of sending SQL MariaDB rejects.
727
+ const DOESNT_EXIST = () => "doesn't exist on MariaDB";
728
+ const MAX_ARGS = (max) => (args) => args.length > max ? `takes at most ${max} arguments on MariaDB` : null;
729
+ const MARIADB_UNSUPPORTED = {
730
+ regexpLike: DOESNT_EXIST,
731
+ memberOf: DOESNT_EXIST,
732
+ anyValue: DOESNT_EXIST,
733
+ grouping: DOESNT_EXIST,
734
+ uuidToBin: DOESNT_EXIST,
735
+ binToUuid: DOESNT_EXIST,
736
+ isUuid: DOESNT_EXIST,
737
+ icuVersion: DOESNT_EXIST,
738
+ rolesGraphml: DOESNT_EXIST,
739
+ statementDigest: DOESNT_EXIST,
740
+ statementDigestText: DOESNT_EXIST,
741
+ formatBytes: DOESNT_EXIST,
742
+ psCurrentThreadId: DOESNT_EXIST,
743
+ psThreadId: DOESNT_EXIST,
744
+ gtidSubset: DOESNT_EXIST,
745
+ gtidSubtract: DOESNT_EXIST,
746
+ waitForExecutedGtidSet: DOESNT_EXIST,
747
+ sourcePosWait: DOESNT_EXIST,
748
+ jsonSchemaValidationReport: DOESNT_EXIST,
749
+ jsonStorageFree: DOESNT_EXIST,
750
+ jsonStorageSize: DOESNT_EXIST,
751
+ regexpInstr: MAX_ARGS(2),
752
+ regexpSubstr: MAX_ARGS(2),
753
+ regexpReplace: MAX_ARGS(3),
754
+ jsonValue: (args) => args[2] && args[2].returning !== undefined ? "can't use the returning option on MariaDB" : null,
755
+ };
812
756
  module.exports = {
813
- FUNCTIONS,
814
- buildOrderBy,
815
- INTERVAL_UNITS,
816
- TIMESTAMP_UNITS,
757
+ FUNCTIONS,
758
+ MARIADB_UNSUPPORTED,
759
+ buildOrderBy,
760
+ INTERVAL_UNITS,
761
+ TIMESTAMP_UNITS,
817
762
  };