pg_query 0.7.0

PostgreSQL parser that uses the actual PostgreSQL server source to parse SQL queries and return the internal PostgreSQL parse tree.
Documentation
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
[
  {
    "input": "SELECT 1",
    "expectedParts": ["RawStmt", "stmt", "SelectStmt", "limitOption", "LIMIT_OPTION_DEFAULT", "op", "SETOP_NONE", "targetList", "ResTarget"],
    "expectedHash": "50fde20626009aba"
  },
  {
    "input": "SELECT 2",
    "expectedParts": ["RawStmt", "stmt", "SelectStmt", "limitOption", "LIMIT_OPTION_DEFAULT", "op", "SETOP_NONE", "targetList", "ResTarget"],
    "expectedHash": "50fde20626009aba"
  },
  {
    "input": "SELECT ?",
    "expectedParts": ["RawStmt", "stmt", "SelectStmt", "limitOption", "LIMIT_OPTION_DEFAULT", "op", "SETOP_NONE", "targetList", "ResTarget"],
    "expectedHash": "50fde20626009aba"
  },
  {
    "input": "SELECT $1",
    "expectedParts": ["RawStmt", "stmt", "SelectStmt", "limitOption", "LIMIT_OPTION_DEFAULT", "op", "SETOP_NONE", "targetList", "ResTarget"],
    "expectedHash": "50fde20626009aba"
  },
  {
    "input": "SELECT 1; SELECT a FROM b",
    "expectedParts": ["RawStmt", "stmt", "SelectStmt", "limitOption", "LIMIT_OPTION_DEFAULT", "op", "SETOP_NONE", "targetList", "ResTarget",
      "RawStmt", "stmt", "SelectStmt",
      "fromClause", "RangeVar", "inh", "true", "relname", "b", "relpersistence",
      "p", "limitOption", "LIMIT_OPTION_DEFAULT", "op", "SETOP_NONE", "targetList",
      "ResTarget", "val", "ColumnRef", "fields", "String", "str", "a"],
    "expectedHash": "3efa3b10d558d06d"
  },
  {
    "input": "SELECT COUNT(DISTINCT id), * FROM targets WHERE something IS NOT NULL AND elsewhere::interval < now()",
		"expectedParts": ["RawStmt", "stmt", "SelectStmt", "fromClause", "RangeVar", "inh", "true", "relname",
      "targets", "relpersistence", "p", "limitOption", "LIMIT_OPTION_DEFAULT", "op", "SETOP_NONE", "targetList", "ResTarget", "val",
      "FuncCall", "agg_distinct", "true", "args", "ColumnRef", "fields", "String", "str", "id", "funcname", "String", "str", "count",
      "ResTarget", "val", "ColumnRef", "fields", "A_Star",
      "whereClause", "BoolExpr", "args", "A_Expr", "kind", "AEXPR_OP", "lexpr", "TypeCast", "arg",
      "ColumnRef", "fields", "String", "str", "elsewhere", "typeName",
      "names", "String", "str", "pg_catalog", "String", "str", "interval", "typemod",
      "-1", "name", "String", "str", "<", "rexpr", "FuncCall", "funcname", "String",
      "str", "now", "NullTest", "arg", "ColumnRef", "fields", "String",
      "str", "something", "nulltesttype", "IS_NOT_NULL", "boolop", "AND_EXPR"],
		"expectedHash": "4380dd02d56bbe1a"
  },
  {
    "input": "INSERT INTO test (a, b) VALUES (?, ?)",
		"expectedParts": ["RawStmt", "stmt", "InsertStmt", "cols", "ResTarget",
      "name", "b", "ResTarget", "name", "a", "override", "OVERRIDING_NOT_SET", "relation",
      "inh", "true", "relname", "test", "relpersistence", "p", "selectStmt", "SelectStmt", "limitOption", "LIMIT_OPTION_DEFAULT", "op", "SETOP_NONE"],
		"expectedHash": "51e63b8083b48bdd"
  },
  {
    "input": "INSERT INTO test (b, a) VALUES (?, ?)",
		"expectedParts": ["RawStmt", "stmt", "InsertStmt", "cols", "ResTarget",
      "name", "b", "ResTarget", "name", "a", "override", "OVERRIDING_NOT_SET", "relation",
      "inh", "true", "relname", "test", "relpersistence", "p", "selectStmt", "SelectStmt", "limitOption", "LIMIT_OPTION_DEFAULT", "op", "SETOP_NONE"],
		"expectedHash": "51e63b8083b48bdd"
  },
  {
    "input": "INSERT INTO test (a, b) VALUES (ARRAY[?, ?, ?, ?], ?::timestamptz), (ARRAY[?, ?, ?, ?], ?::timestamptz), (?, ?::timestamptz)",
    "expectedParts": ["RawStmt", "stmt", "InsertStmt", "cols", "ResTarget", "name",
      "b", "ResTarget", "name", "a", "override", "OVERRIDING_NOT_SET", "relation", "inh", "true",
      "relname", "test", "relpersistence", "p", "selectStmt", "SelectStmt", "limitOption", "LIMIT_OPTION_DEFAULT", "op", "SETOP_NONE",
      "valuesLists", "A_ArrayExpr"],
    "expectedHash": "4dfdd5260cac5acf"
  },
  {
    "input": "SELECT b AS x, a AS y FROM z",
		"expectedParts": ["RawStmt", "stmt", "SelectStmt", "fromClause", "RangeVar", "inh", "true", "relname", "z",
      "relpersistence", "p", "limitOption", "LIMIT_OPTION_DEFAULT", "op", "SETOP_NONE", "targetList", "ResTarget", "val", "ColumnRef", "fields",
      "String", "str", "b", "ResTarget", "val", "ColumnRef", "fields", "String", "str", "a"],
		"expectedHash": "1a8bf5d7614de3a5"
  },
  {
    "input": "SELECT * FROM x WHERE y = ?",
    "expectedParts": ["RawStmt", "stmt", "SelectStmt", "fromClause", "RangeVar", "inh", "true", "relname", "x",
      "relpersistence", "p", "limitOption", "LIMIT_OPTION_DEFAULT", "op", "SETOP_NONE", "targetList", "ResTarget", "val", "ColumnRef", "fields", "A_Star",
      "whereClause", "A_Expr", "kind", "AEXPR_OP", "lexpr", "ColumnRef", "fields", "String", "str", "y",
      "name", "String", "str", "="],
		"expectedHash": "4ff39426bd074231"
  },
  {
    "input": "SELECT * FROM x WHERE y = ANY ($1)",
    "expectedParts": ["RawStmt", "stmt", "SelectStmt", "fromClause", "RangeVar", "inh", "true", "relname", "x",
      "relpersistence", "p", "limitOption", "LIMIT_OPTION_DEFAULT", "op", "SETOP_NONE", "targetList", "ResTarget", "val", "ColumnRef", "fields", "A_Star",
      "whereClause", "A_Expr", "kind", "AEXPR_OP", "lexpr", "ColumnRef", "fields", "String", "str", "y",
      "name", "String", "str", "="],
		"expectedHash": "4ff39426bd074231"
  },
  {
    "input": "SELECT * FROM x WHERE y IN (?)",
    "expectedParts": ["RawStmt", "stmt", "SelectStmt", "fromClause", "RangeVar", "inh", "true", "relname", "x",
      "relpersistence", "p", "limitOption", "LIMIT_OPTION_DEFAULT", "op", "SETOP_NONE", "targetList", "ResTarget", "val", "ColumnRef", "fields", "A_Star",
      "whereClause", "A_Expr", "kind", "AEXPR_OP", "lexpr", "ColumnRef", "fields", "String", "str", "y",
      "name", "String", "str", "="],
		"expectedHash": "4ff39426bd074231"
  },
  {
    "input": "SELECT * FROM x WHERE y IN (?, ?, ?)",
		"expectedParts": ["RawStmt", "stmt", "SelectStmt", "fromClause", "RangeVar", "inh", "true", "relname", "x",
      "relpersistence", "p", "limitOption", "LIMIT_OPTION_DEFAULT", "op", "SETOP_NONE", "targetList", "ResTarget", "val", "ColumnRef", "fields", "A_Star",
      "whereClause", "A_Expr", "kind", "AEXPR_OP", "lexpr", "ColumnRef", "fields", "String", "str", "y",
      "name", "String", "str", "="],
		"expectedHash": "4ff39426bd074231"
  },
  {
    "input": "SELECT * FROM x WHERE y IN ( ?::uuid )",
		"expectedParts": ["RawStmt", "stmt", "SelectStmt", "fromClause", "RangeVar", "inh", "true", "relname", "x",
      "relpersistence", "p", "limitOption", "LIMIT_OPTION_DEFAULT", "op", "SETOP_NONE", "targetList", "ResTarget", "val", "ColumnRef", "fields", "A_Star",
      "whereClause", "A_Expr", "kind", "AEXPR_OP", "lexpr", "ColumnRef", "fields", "String", "str", "y",
      "name", "String", "str", "="],
		"expectedHash": "4ff39426bd074231"
  },
  {
    "input": "SELECT * FROM x WHERE y IN ( ?::uuid, ?::uuid, ?::uuid )",
		"expectedParts": ["RawStmt", "stmt", "SelectStmt", "fromClause", "RangeVar", "inh", "true", "relname", "x",
      "relpersistence", "p", "limitOption", "LIMIT_OPTION_DEFAULT", "op", "SETOP_NONE", "targetList", "ResTarget", "val", "ColumnRef", "fields", "A_Star",
      "whereClause", "A_Expr", "kind", "AEXPR_OP", "lexpr", "ColumnRef", "fields", "String", "str", "y",
      "name", "String", "str", "="],
		"expectedHash": "4ff39426bd074231"
  },
  {
    "input": "PREPARE a123 AS SELECT a",
    "expectedParts": ["RawStmt", "stmt", "PrepareStmt", "query", "SelectStmt",
      "limitOption", "LIMIT_OPTION_DEFAULT", "op", "SETOP_NONE",
      "targetList", "ResTarget", "val", "ColumnRef", "fields", "String", "str", "a"],
    "expectedHash": "9b5e6ead8be993e8"
  },
  {
    "input": "EXECUTE a123",
    "expectedParts": ["RawStmt", "stmt", "ExecuteStmt"],
    "expectedHash": "44ef1d2beabd53e8"
  },
  {
    "input": "DEALLOCATE a123",
    "expectedParts": ["RawStmt", "stmt", "DeallocateStmt"],
    "expectedHash": "d8a65a814fbc5f95"
  },
  {
    "input": "DEALLOCATE ALL",
    "expectedParts": ["RawStmt", "stmt", "DeallocateStmt"],
    "expectedHash": "d8a65a814fbc5f95"
  },
  {
    "input": "EXPLAIN ANALYZE SELECT a",
    "expectedParts": ["RawStmt", "stmt", "ExplainStmt", "options", "DefElem",
      "defaction", "DEFELEM_UNSPEC", "defname", "analyze", "query", "SelectStmt", "limitOption", "LIMIT_OPTION_DEFAULT", "op", "SETOP_NONE",
      "targetList", "ResTarget", "val", "ColumnRef", "fields", "String", "str", "a"],
    "expectedHash": "82845c1b5c6102e5"
  },
  {
    "input": "WITH a AS (SELECT * FROM x WHERE x.y = ? AND x.z = 1) SELECT * FROM a",
    "expectedParts": ["RawStmt", "stmt", "SelectStmt", "fromClause", "RangeVar",
      "inh", "true", "relname", "a", "relpersistence", "p", "limitOption",
      "LIMIT_OPTION_DEFAULT", "op", "SETOP_NONE", "targetList", "ResTarget",
      "val", "ColumnRef", "fields", "A_Star", "withClause",
      "ctes", "CommonTableExpr", "ctematerialized", "CTEMaterializeDefault",
      "ctename", "a", "ctequery", "SelectStmt", "fromClause", "RangeVar",
      "inh", "true", "relname", "x", "relpersistence", "p", "limitOption",
      "LIMIT_OPTION_DEFAULT", "op", "SETOP_NONE", "targetList", "ResTarget",
      "val", "ColumnRef", "fields", "A_Star", "whereClause", "BoolExpr",
      "args", "A_Expr", "kind", "AEXPR_OP", "lexpr", "ColumnRef", "fields",
      "String", "str", "x", "String", "str", "y", "name", "String", "str",
      "=", "A_Expr", "kind", "AEXPR_OP", "lexpr", "ColumnRef", "fields",
      "String", "str", "x", "String", "str", "z", "name", "String", "str",
      "=", "boolop", "AND_EXPR"],
    "expectedHash": "6831e38bbb3dd18c"
  },
  {
    "input": "CREATE TABLE types (a float(2), b float(49), c NUMERIC(2, 3), d character(4), e char(5), f varchar(6), g character varying(7))",
    "expectedParts": ["RawStmt", "stmt", "CreateStmt", "oncommit", "ONCOMMIT_NOOP", "relation", "inh", "true", "relname", "types",
      "relpersistence", "p", "tableElts", "ColumnDef", "colname", "a", "is_local", "true",
      "typeName", "names", "String", "str", "pg_catalog", "String", "str", "float4",
      "typemod", "-1", "ColumnDef", "colname", "b", "is_local", "true", "typeName",
      "names", "String", "str", "pg_catalog", "String", "str", "float8", "typemod", "-1",
      "ColumnDef", "colname", "c", "is_local", "true", "typeName", "names",
      "String", "str", "pg_catalog", "String", "str", "numeric", "typemod", "-1",
      "ColumnDef", "colname", "d", "is_local", "true", "typeName", "names", "String",
      "str", "pg_catalog", "String", "str", "bpchar", "typemod", "-1", "ColumnDef",
      "colname", "e", "is_local", "true", "typeName", "names", "String", "str",
      "pg_catalog", "String", "str", "bpchar", "typemod", "-1", "ColumnDef", "colname",
      "f", "is_local", "true", "typeName", "names", "String", "str", "pg_catalog",
      "String", "str", "varchar", "typemod", "-1", "ColumnDef", "colname", "g",
      "is_local", "true", "typeName", "names", "String", "str", "pg_catalog",
      "String", "str", "varchar", "typemod", "-1"],
    "expectedHash": "008d6ba4aa0f4c6e"
  },
  {
    "input": "CREATE VIEW view_a (a, b) AS WITH RECURSIVE view_a (a, b) AS (SELECT * FROM a(1)) SELECT \"a\", \"b\" FROM \"view_a\"",
    "expectedParts": ["RawStmt", "stmt", "ViewStmt", "aliases", "String", "str", "a",
      "String", "str", "b", "query", "SelectStmt", "fromClause", "RangeVar", "inh", "true",
      "relname", "view_a", "relpersistence", "p", "limitOption", "LIMIT_OPTION_DEFAULT", "op",
      "SETOP_NONE", "targetList", "ResTarget", "val", "ColumnRef", "fields", "String",
      "str", "b", "ResTarget", "val", "ColumnRef", "fields", "String", "str", "a",
      "withClause", "ctes", "CommonTableExpr", "aliascolnames",
      "String", "str", "a", "String", "str", "b", "ctematerialized", "CTEMaterializeDefault",
      "ctename", "view_a", "ctequery", "SelectStmt", "fromClause", "RangeFunction",
      "functions", "FuncCall", "funcname", "String", "str", "a", "limitOption", "LIMIT_OPTION_DEFAULT",
      "op", "SETOP_NONE", "targetList", "ResTarget", "val", "ColumnRef", "fields", "A_Star",
      "recursive", "true", "view", "inh", "true", "relname", "view_a",
      "relpersistence", "p", "withCheckOption", "NO_CHECK_OPTION"],
    "expectedHash": "6236405577a6cea6"
  },
  {
    "input": "VACUUM FULL my_table",
    "expectedParts": ["RawStmt", "stmt", "VacuumStmt", "is_vacuumcmd", "true", "options",
      "DefElem", "defaction", "DEFELEM_UNSPEC", "defname", "full", "rels", "VacuumRelation", "relation",
      "inh", "true", "relname", "my_table", "relpersistence", "p"],
    "expectedHash": "fdf2f4127644f4d8"
  },
  {
    "input": "SELECT * FROM x AS a, y AS b",
    "expectedParts": ["RawStmt", "stmt", "SelectStmt", "fromClause", "RangeVar", "inh", "true",
      "relname", "x", "relpersistence", "p", "RangeVar", "inh", "true", "relname", "y",
      "relpersistence", "p", "limitOption", "LIMIT_OPTION_DEFAULT", "op", "SETOP_NONE", "targetList", "ResTarget", "val", "ColumnRef", "fields", "A_Star"],
    "expectedHash": "4e9acae841dae228"
  },
  {
    "input": "SELECT * FROM y AS a, x AS b",
    "expectedParts": ["RawStmt", "stmt", "SelectStmt", "fromClause", "RangeVar", "inh", "true",
      "relname", "x", "relpersistence", "p", "RangeVar", "inh", "true", "relname", "y",
      "relpersistence", "p", "limitOption", "LIMIT_OPTION_DEFAULT", "op", "SETOP_NONE", "targetList", "ResTarget", "val", "ColumnRef", "fields", "A_Star"],
    "expectedHash": "4e9acae841dae228"
  },
  {
    "input": "SELECT x AS a, y AS b FROM x",
    "expectedParts": ["RawStmt", "stmt", "SelectStmt", "fromClause", "RangeVar", "inh", "true", "relname", "x",
      "relpersistence", "p", "limitOption", "LIMIT_OPTION_DEFAULT", "op", "SETOP_NONE", "targetList", "ResTarget", "val", "ColumnRef", "fields", "String",
      "str", "x", "ResTarget", "val", "ColumnRef", "fields", "String", "str", "y"],
    "expectedHash": "65dff5f5e9a643ad"
  },
  {
    "input": "SELECT y AS a, x AS b FROM x",
    "expectedParts": ["RawStmt", "stmt", "SelectStmt", "fromClause", "RangeVar", "inh", "true", "relname", "x",
      "relpersistence", "p", "limitOption", "LIMIT_OPTION_DEFAULT", "op", "SETOP_NONE", "targetList", "ResTarget", "val", "ColumnRef", "fields", "String",
      "str", "x", "ResTarget", "val", "ColumnRef", "fields", "String", "str", "y"],
    "expectedHash": "65dff5f5e9a643ad"
  },
  {
    "input": "SELECT x, y FROM z",
    "expectedParts": ["RawStmt", "stmt", "SelectStmt", "fromClause", "RangeVar", "inh", "true", "relname", "z",
      "relpersistence", "p", "limitOption", "LIMIT_OPTION_DEFAULT", "op", "SETOP_NONE", "targetList", "ResTarget", "val", "ColumnRef", "fields",
      "String", "str", "x", "ResTarget", "val", "ColumnRef", "fields", "String", "str", "y"],
    "expectedHash": "330267237da5535f"
  },
  {
    "input": "SELECT y, x FROM z",
    "expectedParts": ["RawStmt", "stmt", "SelectStmt", "fromClause", "RangeVar", "inh", "true", "relname", "z",
      "relpersistence", "p", "limitOption", "LIMIT_OPTION_DEFAULT", "op", "SETOP_NONE", "targetList", "ResTarget", "val", "ColumnRef", "fields",
      "String", "str", "x", "ResTarget", "val", "ColumnRef", "fields", "String", "str", "y"],
    "expectedHash": "330267237da5535f"
  },
  {
    "input": "INSERT INTO films (code, title, did) VALUES ('UA502', 'Bananas', 105), ('T_601', 'Yojimbo', DEFAULT)",
    "expectedParts": ["RawStmt", "stmt", "InsertStmt", "cols", "ResTarget", "name", "title", "ResTarget", "name", "did",
      "ResTarget", "name", "code", "override", "OVERRIDING_NOT_SET", "relation", "inh", "true", "relname", "films",
      "relpersistence", "p", "selectStmt", "SelectStmt", "limitOption", "LIMIT_OPTION_DEFAULT", "op", "SETOP_NONE"],
    "expectedHash": "459fdc70778b841e"
  },
  {
    "input": "INSERT INTO films (code, title, did) VALUES (?, ?, ?)",
    "expectedParts": ["RawStmt", "stmt", "InsertStmt", "cols", "ResTarget", "name", "title", "ResTarget", "name", "did",
      "ResTarget", "name", "code", "override", "OVERRIDING_NOT_SET", "relation", "inh", "true", "relname", "films",
      "relpersistence", "p", "selectStmt", "SelectStmt", "limitOption", "LIMIT_OPTION_DEFAULT", "op", "SETOP_NONE"],
    "expectedHash": "459fdc70778b841e"
  },
  {
    "input": "SELECT * FROM a",
    "expectedParts": ["RawStmt", "stmt", "SelectStmt", "fromClause", "RangeVar", "inh", "true", "relname", "a",
      "relpersistence", "p", "limitOption", "LIMIT_OPTION_DEFAULT", "op", "SETOP_NONE", "targetList", "ResTarget", "val", "ColumnRef", "fields", "A_Star"],
    "expectedHash": "fcf44da7b597ef43"
  },
  {
    "input": "SELECT * FROM a AS b",
    "expectedParts": ["RawStmt", "stmt", "SelectStmt", "fromClause", "RangeVar", "inh", "true", "relname", "a",
      "relpersistence", "p", "limitOption", "LIMIT_OPTION_DEFAULT", "op", "SETOP_NONE", "targetList", "ResTarget", "val", "ColumnRef", "fields", "A_Star"],
    "expectedHash": "fcf44da7b597ef43"
  },
  {
    "input": "UPDATE users SET one_thing = $1, second_thing = $2 WHERE users.id = ?",
    "expectedParts": ["RawStmt", "stmt", "UpdateStmt", "relation", "inh", "true", "relname", "users", "relpersistence", "p",
      "targetList", "ResTarget", "name", "one_thing", "ResTarget", "name", "second_thing",
      "whereClause", "A_Expr", "kind", "AEXPR_OP", "lexpr", "ColumnRef", "fields", "String",
      "str", "users", "String", "str", "id", "name", "String", "str", "="],
    "expectedHash": "a0ea386c1cfd1e69"
  },
  {
    "input": "UPDATE users SET something_else = $1 WHERE users.id = ?",
    "expectedParts": ["RawStmt", "stmt", "UpdateStmt", "relation", "inh", "true", "relname", "users", "relpersistence", "p",
      "targetList", "ResTarget", "name", "something_else", "whereClause", "A_Expr", "kind", "AEXPR_OP", "lexpr", "ColumnRef", "fields", "String",
      "str", "users", "String", "str", "id", "name", "String", "str", "="],
    "expectedHash": "3172bc3e0d631d55"
  },
  {
    "input": "UPDATE users SET something_else = (SELECT a FROM x WHERE uid = users.id LIMIT 1) WHERE users.id = ?",
    "expectedParts": ["RawStmt", "stmt", "UpdateStmt", "relation", "inh", "true", "relname", "users", "relpersistence", "p",
      "targetList", "ResTarget", "name", "something_else", "val", "SubLink", "subLinkType", "EXPR_SUBLINK", "subselect", "SelectStmt", "fromClause",
      "RangeVar", "inh", "true", "relname", "x", "relpersistence", "p", "limitOption", "LIMIT_OPTION_COUNT", "op", "SETOP_NONE", "targetList", "ResTarget", "val", "ColumnRef",
      "fields", "String", "str", "a", "whereClause", "A_Expr", "kind", "AEXPR_OP", "lexpr", "ColumnRef", "fields", "String", "str", "uid",
      "name", "String", "str", "=", "rexpr", "ColumnRef", "fields", "String", "str", "users", "String", "str", "id",
      "whereClause", "A_Expr", "kind", "AEXPR_OP", "lexpr", "ColumnRef", "fields", "String", "str", "users", "String", "str", "id", "name", "String", "str", "="],
    "expectedHash": "f1127a8b91fbecbf"
  },
  {
    "input": "SAVEPOINT some_id",
    "expectedParts": ["RawStmt", "stmt", "TransactionStmt", "kind", "TRANS_STMT_SAVEPOINT"],
    "expectedHash": "8ebd566ea1bf947b"
  },
  {
    "input": "RELEASE some_id",
    "expectedParts": ["RawStmt", "stmt", "TransactionStmt", "kind", "TRANS_STMT_RELEASE"],
    "expectedHash": "60d618658252d2af"
  },
  {
    "input": "PREPARE TRANSACTION 'some_id'",
    "expectedParts": ["RawStmt", "stmt", "TransactionStmt", "kind", "TRANS_STMT_PREPARE"],
    "expectedHash": "d993959a33d627d4"
  },
  {
    "input": "START TRANSACTION READ WRITE",
    "expectedParts": ["RawStmt", "stmt", "TransactionStmt", "kind", "TRANS_STMT_START"],
    "expectedHash": "4ca25828c835d55a"
  },
  {
    "input": "DECLARE cursor_123 CURSOR FOR SELECT * FROM test WHERE id = 123",
    "expectedParts": ["RawStmt", "stmt", "DeclareCursorStmt", "options", "32", "query", "SelectStmt",
      "fromClause", "RangeVar", "inh", "true", "relname", "test", "relpersistence",
      "p", "limitOption", "LIMIT_OPTION_DEFAULT", "op", "SETOP_NONE",
      "targetList", "ResTarget", "val", "ColumnRef", "fields", "A_Star",
      "whereClause", "A_Expr", "kind", "AEXPR_OP", "lexpr", "ColumnRef", "fields", "String", "str",
      "id", "name", "String", "str", "="],
    "expectedHash": "0119adaeb91afad0"
  },
  {
    "input": "FETCH 1000 FROM cursor_123",
    "expectedParts": ["RawStmt", "stmt", "FetchStmt", "direction", "FETCH_FORWARD", "howMany", "1000"],
    "expectedHash": "37f4d2f6a957ae48"
  },
  {
    "input": "CLOSE cursor_123",
    "expectedParts": ["RawStmt", "stmt", "ClosePortalStmt"],
    "expectedHash": "2c7963684fc2bad9"
  },
  {
    "input": "-- nothing",
    "expectedParts": [],
    "expectedHash": "d8d13f8b2da6c9ad"
  },
  {
    "input": "CREATE FOREIGN TABLE ft1 () SERVER no_server",
    "expectedParts": ["RawStmt", "stmt", "CreateForeignTableStmt", "base", "oncommit", "ONCOMMIT_NOOP", "relation", "inh", "true", "relname", "ft1", "relpersistence", "p", "servername", "no_server"],
    "expectedHash": "74481c4af7c76be1"
  },
  {
    "input": "UPDATE x SET a = 1, b = 2, c = 3",
    "expectedParts": ["RawStmt", "stmt", "UpdateStmt", "relation", "inh", "true", "relname", "x", "relpersistence", "p", "targetList", "ResTarget", "name", "b", "ResTarget", "name", "c", "ResTarget", "name", "a"],
    "expectedHash": "fd5c248c0e642ce4"
  },
  {
    "input": "UPDATE x SET z = now()",
    "expectedParts": ["RawStmt", "stmt", "UpdateStmt", "relation", "inh", "true", "relname", "x", "relpersistence", "p", "targetList", "ResTarget", "name", "z", "val", "FuncCall", "funcname", "String", "str", "now"],
    "expectedHash": "78fe872f5ec28674"
  },
  {
    "input": "CREATE TEMPORARY TABLE my_temp_table (test_id integer NOT NULL) ON COMMIT DROP",
    "expectedParts": ["RawStmt", "stmt", "CreateStmt", "oncommit", "ONCOMMIT_DROP", "relation","inh", "true", "relpersistence", "t", "tableElts", "ColumnDef", "colname", "test_id", "constraints", "Constraint", "contype", "CONSTR_NOTNULL", "is_local", "true", "typeName", "names", "String", "str", "pg_catalog", "String", "str", "int4", "typemod", "-1"],
    "expectedHash": "1407ed5c5bb00967"
  },
  {
    "input": "CREATE TEMPORARY TABLE my_temp_table AS SELECT 1",
    "expectedParts": ["RawStmt", "stmt", "CreateTableAsStmt", "into", "onCommit", "ONCOMMIT_NOOP", "rel", "inh", "true", "relpersistence", "t", "query", "SelectStmt", "limitOption", "LIMIT_OPTION_DEFAULT", "op", "SETOP_NONE", "targetList", "ResTarget", "relkind", "OBJECT_TABLE"],
    "expectedHash": "dd5fac57c3c4524c"
  },
  {
    "input": "SELECT INTERVAL (0) $2",
    "expectedParts": ["RawStmt", "stmt", "SelectStmt", "limitOption", "LIMIT_OPTION_DEFAULT", "op", "SETOP_NONE", "targetList", "ResTarget"],
    "expectedHash": "50fde20626009aba"
  },
  {
    "input": "SELECT INTERVAL (2) $2",
    "expectedParts": ["RawStmt", "stmt", "SelectStmt", "limitOption", "LIMIT_OPTION_DEFAULT", "op", "SETOP_NONE", "targetList", "ResTarget"],
    "expectedHash": "50fde20626009aba"
  },
  {
    "input": "SELECT * FROM t WHERE t.a IN (1, 2) AND t.b = 3",
    "expectedParts": ["RawStmt", "stmt", "SelectStmt", "fromClause", "RangeVar", "inh", "true", "relname", "t", "relpersistence", "p", "limitOption", "LIMIT_OPTION_DEFAULT", "op", "SETOP_NONE", "targetList", "ResTarget", "val", "ColumnRef", "fields", "A_Star", "whereClause", "BoolExpr", "args", "A_Expr", "kind", "AEXPR_OP", "lexpr", "ColumnRef", "fields", "String", "str", "t", "String", "str", "a", "name", "String", "str", "=", "A_Expr", "kind", "AEXPR_OP", "lexpr", "ColumnRef", "fields", "String", "str", "t", "String", "str", "b", "name", "String", "str", "=", "boolop", "AND_EXPR"],
    "expectedHash": "346aea01be9173b6"
  },
  {
    "input": "SELECT * FROM t WHERE t.b = 3 AND t.a IN (1, 2)",
    "expectedParts": ["RawStmt", "stmt", "SelectStmt", "fromClause", "RangeVar", "inh", "true", "relname", "t", "relpersistence", "p", "limitOption", "LIMIT_OPTION_DEFAULT", "op", "SETOP_NONE", "targetList", "ResTarget", "val", "ColumnRef", "fields", "A_Star", "whereClause", "BoolExpr", "args", "A_Expr", "kind", "AEXPR_OP", "lexpr", "ColumnRef", "fields", "String", "str", "t", "String", "str", "a", "name", "String", "str", "=", "A_Expr", "kind", "AEXPR_OP", "lexpr", "ColumnRef", "fields", "String", "str", "t", "String", "str", "b", "name", "String", "str", "=", "boolop", "AND_EXPR"],
    "expectedHash": "346aea01be9173b6"
  },
  {
    "input": "SELECT * FROM t WHERE a && '[1,2]'",
    "expectedParts": ["RawStmt", "stmt", "SelectStmt", "fromClause", "RangeVar", "inh", "true", "relname", "t", "relpersistence", "p", "limitOption", "LIMIT_OPTION_DEFAULT", "op", "SETOP_NONE", "targetList", "ResTarget", "val", "ColumnRef", "fields", "A_Star", "whereClause", "A_Expr", "kind", "AEXPR_OP", "lexpr", "ColumnRef", "fields", "String", "str", "a", "name", "String", "str", "&&"],
    "expectedHash": "673f199f13dfe665"
  },
  {
    "input": "SELECT * FROM t WHERE a && '[1,2]'::int4range",
    "expectedParts": ["RawStmt", "stmt", "SelectStmt", "fromClause", "RangeVar", "inh", "true", "relname", "t", "relpersistence", "p", "limitOption", "LIMIT_OPTION_DEFAULT", "op", "SETOP_NONE", "targetList", "ResTarget", "val", "ColumnRef", "fields", "A_Star", "whereClause", "A_Expr", "kind", "AEXPR_OP", "lexpr", "ColumnRef", "fields", "String", "str", "a", "name", "String", "str", "&&"],
    "expectedHash": "673f199f13dfe665"
  },
  {
    "input": "SELECT * FROM t_20210301_x",
    "expectedParts": ["RawStmt", "stmt", "SelectStmt", "fromClause", "RangeVar", "inh", "true", "relname", "t__x", "relpersistence", "p", "limitOption", "LIMIT_OPTION_DEFAULT", "op", "SETOP_NONE", "targetList", "ResTarget", "val", "ColumnRef", "fields", "A_Star"],
    "expectedHash": "6f8169980cd70a25"
  },
  {
    "input": "SELECT * FROM t_20210302_x",
    "expectedParts": ["RawStmt", "stmt", "SelectStmt", "fromClause", "RangeVar", "inh", "true", "relname", "t__x", "relpersistence", "p", "limitOption", "LIMIT_OPTION_DEFAULT", "op", "SETOP_NONE", "targetList", "ResTarget", "val", "ColumnRef", "fields", "A_Star"],
    "expectedHash": "6f8169980cd70a25"
  },
  {
    "input": "SELECT * FROM t_20210302_y",
    "expectedParts": ["RawStmt", "stmt", "SelectStmt", "fromClause", "RangeVar", "inh", "true", "relname", "t__y", "relpersistence", "p", "limitOption", "LIMIT_OPTION_DEFAULT", "op", "SETOP_NONE", "targetList", "ResTarget", "val", "ColumnRef", "fields", "A_Star"],
    "expectedHash": "d357dac4a24fcf1b"
  },
  {
    "input": "SELECT * FROM t_1",
    "expectedParts": ["RawStmt", "stmt", "SelectStmt", "fromClause", "RangeVar", "inh", "true", "relname", "t_1", "relpersistence", "p", "limitOption", "LIMIT_OPTION_DEFAULT", "op", "SETOP_NONE", "targetList", "ResTarget", "val", "ColumnRef", "fields", "A_Star"],
    "expectedHash": "018bd9230646143e"
  },
  {
    "input": "SELECT * FROM t_2",
    "expectedParts": ["RawStmt", "stmt", "SelectStmt", "fromClause", "RangeVar", "inh", "true", "relname", "t_2", "relpersistence", "p", "limitOption", "LIMIT_OPTION_DEFAULT", "op", "SETOP_NONE", "targetList", "ResTarget", "val", "ColumnRef", "fields", "A_Star"],
    "expectedHash": "3f1444da570c1a66"
  }
]