pg_query 2.1.4 → 2.2.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 (85) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +29 -0
  3. data/README.md +32 -0
  4. data/Rakefile +2 -2
  5. data/ext/pg_query/include/access/twophase.h +2 -0
  6. data/ext/pg_query/include/access/xact.h +6 -0
  7. data/ext/pg_query/include/access/xlog_internal.h +10 -1
  8. data/ext/pg_query/include/access/xlogreader.h +10 -0
  9. data/ext/pg_query/include/catalog/dependency.h +2 -0
  10. data/ext/pg_query/include/catalog/pg_class.h +1 -1
  11. data/ext/pg_query/include/catalog/pg_class_d.h +1 -1
  12. data/ext/pg_query/include/catalog/pg_control.h +2 -0
  13. data/ext/pg_query/include/catalog/pg_operator.h +3 -1
  14. data/ext/pg_query/include/catalog/pg_publication.h +3 -0
  15. data/ext/pg_query/include/catalog/pg_type.h +1 -0
  16. data/ext/pg_query/include/commands/async.h +1 -1
  17. data/ext/pg_query/include/commands/tablespace.h +2 -0
  18. data/ext/pg_query/include/commands/trigger.h +8 -0
  19. data/ext/pg_query/include/lib/simplehash.h +13 -13
  20. data/ext/pg_query/include/libpq/libpq.h +1 -0
  21. data/ext/pg_query/include/mb/pg_wchar.h +1 -0
  22. data/ext/pg_query/include/miscadmin.h +24 -11
  23. data/ext/pg_query/include/nodes/execnodes.h +2 -2
  24. data/ext/pg_query/include/nodes/parsenodes.h +5 -4
  25. data/ext/pg_query/include/nodes/pathnodes.h +2 -1
  26. data/ext/pg_query/include/nodes/pg_list.h +1 -0
  27. data/ext/pg_query/include/nodes/plannodes.h +18 -3
  28. data/ext/pg_query/include/optimizer/optimizer.h +0 -5
  29. data/ext/pg_query/include/parser/gram.h +2 -2
  30. data/ext/pg_query/include/parser/kwlist.h +1 -1
  31. data/ext/pg_query/include/parser/parse_coerce.h +1 -0
  32. data/ext/pg_query/include/pg_config.h +16 -13
  33. data/ext/pg_query/include/pg_query.h +2 -2
  34. data/ext/pg_query/include/pg_query_fingerprint_defs.c +286 -314
  35. data/ext/pg_query/include/pg_query_outfuncs_defs.c +1 -0
  36. data/ext/pg_query/include/pg_query_readfuncs_defs.c +1 -0
  37. data/ext/pg_query/include/pgstat.h +2 -1
  38. data/ext/pg_query/include/plpgsql.h +2 -2
  39. data/ext/pg_query/include/port/pg_bitutils.h +48 -2
  40. data/ext/pg_query/include/port.h +4 -0
  41. data/ext/pg_query/include/protobuf/pg_query.pb-c.h +4 -3
  42. data/ext/pg_query/include/replication/reorderbuffer.h +6 -5
  43. data/ext/pg_query/include/replication/slot.h +1 -1
  44. data/ext/pg_query/include/storage/block.h +1 -1
  45. data/ext/pg_query/include/storage/lock.h +6 -5
  46. data/ext/pg_query/include/storage/lwlock.h +1 -0
  47. data/ext/pg_query/include/storage/proc.h +14 -0
  48. data/ext/pg_query/include/storage/s_lock.h +24 -0
  49. data/ext/pg_query/include/tcop/pquery.h +6 -0
  50. data/ext/pg_query/include/utils/builtins.h +1 -0
  51. data/ext/pg_query/include/utils/inval.h +1 -0
  52. data/ext/pg_query/include/utils/portal.h +13 -0
  53. data/ext/pg_query/include/utils/rel.h +0 -1
  54. data/ext/pg_query/include/utils/relcache.h +1 -2
  55. data/ext/pg_query/include/utils/snapmgr.h +1 -0
  56. data/ext/pg_query/pg_query.pb-c.c +18 -5
  57. data/ext/pg_query/pg_query_deparse.c +8 -8
  58. data/ext/pg_query/pg_query_fingerprint.c +1 -0
  59. data/ext/pg_query/pg_query_json_plpgsql.c +68 -0
  60. data/ext/pg_query/pg_query_normalize.c +43 -7
  61. data/ext/pg_query/pg_query_outfuncs.h +1 -0
  62. data/ext/pg_query/pg_query_outfuncs_json.c +11 -0
  63. data/ext/pg_query/pg_query_parse_plpgsql.c +58 -15
  64. data/ext/pg_query/src_backend_catalog_namespace.c +1 -0
  65. data/ext/pg_query/src_backend_libpq_pqcomm.c +8 -0
  66. data/ext/pg_query/src_backend_nodes_copyfuncs.c +23 -33
  67. data/ext/pg_query/src_backend_nodes_equalfuncs.c +1 -0
  68. data/ext/pg_query/src_backend_nodes_list.c +12 -0
  69. data/ext/pg_query/src_backend_parser_gram.c +18 -3
  70. data/ext/pg_query/src_backend_parser_scan.c +493 -253
  71. data/ext/pg_query/src_backend_tcop_postgres.c +11 -1
  72. data/ext/pg_query/src_backend_utils_adt_ruleutils.c +38 -10
  73. data/ext/pg_query/src_backend_utils_misc_guc.c +1 -0
  74. data/ext/pg_query/src_common_wchar.c +11 -0
  75. data/ext/pg_query/src_pl_plpgsql_src_pl_comp.c +4 -2
  76. data/ext/pg_query/src_pl_plpgsql_src_pl_gram.c +1 -1
  77. data/ext/pg_query/src_port_pg_bitutils.c +1 -22
  78. data/ext/pg_query/src_port_snprintf.c +9 -7
  79. data/lib/pg_query/deparse.rb +7 -1
  80. data/lib/pg_query/fingerprint.rb +13 -2
  81. data/lib/pg_query/parse.rb +5 -3
  82. data/lib/pg_query/pg_query_pb.rb +2 -1
  83. data/lib/pg_query/treewalker.rb +6 -0
  84. data/lib/pg_query/version.rb +1 -1
  85. metadata +2 -2
@@ -55,7 +55,6 @@
55
55
  #include "catalog/pg_type.h"
56
56
  #include "commands/async.h"
57
57
  #include "commands/prepare.h"
58
- #include "executor/spi.h"
59
58
  #include "jit/jit.h"
60
59
  #include "libpq/libpq.h"
61
60
  #include "libpq/pqformat.h"
@@ -520,6 +519,12 @@ static void disable_statement_timeout(void);
520
519
  * If an interrupt condition is pending, and it's safe to service it,
521
520
  * then clear the flag and accept the interrupt. Called only when
522
521
  * InterruptPending is true.
522
+ *
523
+ * Note: if INTERRUPTS_CAN_BE_PROCESSED() is true, then ProcessInterrupts
524
+ * is guaranteed to clear the InterruptPending flag before returning.
525
+ * (This is not the same as guaranteeing that it's still clear when we
526
+ * return; another interrupt could have arrived. But we promise that
527
+ * any pre-existing one will have been serviced.)
523
528
  */
524
529
  void ProcessInterrupts(void) {}
525
530
 
@@ -568,9 +573,14 @@ ia64_get_bsp(void)
568
573
  *
569
574
  * Returns the old reference point, if any.
570
575
  */
576
+ #ifndef HAVE__BUILTIN_FRAME_ADDRESS
577
+ #endif
571
578
  #if defined(__ia64__) || defined(__ia64)
572
579
  #else
573
580
  #endif
581
+ #ifdef HAVE__BUILTIN_FRAME_ADDRESS
582
+ #else
583
+ #endif
574
584
  #if defined(__ia64__) || defined(__ia64)
575
585
  #endif
576
586
 
@@ -62,6 +62,7 @@
62
62
  #include "parser/parse_func.h"
63
63
  #include "parser/parse_node.h"
64
64
  #include "parser/parse_oper.h"
65
+ #include "parser/parse_relation.h"
65
66
  #include "parser/parser.h"
66
67
  #include "parser/parsetree.h"
67
68
  #include "rewrite/rewriteHandler.h"
@@ -392,26 +393,29 @@ static void make_ruledef(StringInfo buf, HeapTuple ruletup, TupleDesc rulettc,
392
393
  static void make_viewdef(StringInfo buf, HeapTuple ruletup, TupleDesc rulettc,
393
394
  int prettyFlags, int wrapColumn);
394
395
  static void get_query_def(Query *query, StringInfo buf, List *parentnamespace,
395
- TupleDesc resultDesc,
396
+ TupleDesc resultDesc, bool colNamesVisible,
396
397
  int prettyFlags, int wrapColumn, int startIndent);
397
398
  static void get_values_def(List *values_lists, deparse_context *context);
398
399
  static void get_with_clause(Query *query, deparse_context *context);
399
400
  static void get_select_query_def(Query *query, deparse_context *context,
400
- TupleDesc resultDesc);
401
- static void get_insert_query_def(Query *query, deparse_context *context);
402
- static void get_update_query_def(Query *query, deparse_context *context);
401
+ TupleDesc resultDesc, bool colNamesVisible);
402
+ static void get_insert_query_def(Query *query, deparse_context *context,
403
+ bool colNamesVisible);
404
+ static void get_update_query_def(Query *query, deparse_context *context,
405
+ bool colNamesVisible);
403
406
  static void get_update_query_targetlist_def(Query *query, List *targetList,
404
407
  deparse_context *context,
405
408
  RangeTblEntry *rte);
406
- static void get_delete_query_def(Query *query, deparse_context *context);
409
+ static void get_delete_query_def(Query *query, deparse_context *context,
410
+ bool colNamesVisible);
407
411
  static void get_utility_query_def(Query *query, deparse_context *context);
408
412
  static void get_basic_select_query(Query *query, deparse_context *context,
409
- TupleDesc resultDesc);
413
+ TupleDesc resultDesc, bool colNamesVisible);
410
414
  static void get_target_list(List *targetList, deparse_context *context,
411
- TupleDesc resultDesc);
415
+ TupleDesc resultDesc, bool colNamesVisible);
412
416
  static void get_setop_query(Node *setOp, Query *query,
413
417
  deparse_context *context,
414
- TupleDesc resultDesc);
418
+ TupleDesc resultDesc, bool colNamesVisible);
415
419
  static Node *get_rule_sortgroupclause(Index ref, List *tlist,
416
420
  bool force_colno,
417
421
  deparse_context *context);
@@ -440,6 +444,8 @@ static void get_rule_expr(Node *node, deparse_context *context,
440
444
  bool showimplicit);
441
445
  static void get_rule_expr_toplevel(Node *node, deparse_context *context,
442
446
  bool showimplicit);
447
+ static void get_rule_list_toplevel(List *lst, deparse_context *context,
448
+ bool showimplicit);
443
449
  static void get_rule_expr_funccall(Node *node, deparse_context *context,
444
450
  bool showimplicit);
445
451
  static bool looks_like_function(Node *node);
@@ -1037,8 +1043,18 @@ static void get_reloptions(StringInfo buf, Datum reloptions);
1037
1043
  /* ----------
1038
1044
  * get_query_def - Parse back one query parsetree
1039
1045
  *
1040
- * If resultDesc is not NULL, then it is the output tuple descriptor for
1041
- * the view represented by a SELECT query.
1046
+ * query: parsetree to be displayed
1047
+ * buf: output text is appended to buf
1048
+ * parentnamespace: list (initially empty) of outer-level deparse_namespace's
1049
+ * resultDesc: if not NULL, the output tuple descriptor for the view
1050
+ * represented by a SELECT query. We use the column names from it
1051
+ * to label SELECT output columns, in preference to names in the query
1052
+ * colNamesVisible: true if the surrounding context cares about the output
1053
+ * column names at all (as, for example, an EXISTS() context does not);
1054
+ * when false, we can suppress dummy column labels such as "?column?"
1055
+ * prettyFlags: bitmask of PRETTYFLAG_XXX options
1056
+ * wrapColumn: maximum line length, or -1 to disable wrapping
1057
+ * startIndent: initial indentation amount
1042
1058
  * ----------
1043
1059
  */
1044
1060
 
@@ -1074,6 +1090,8 @@ static void get_reloptions(StringInfo buf, Datum reloptions);
1074
1090
  * get_target_list - Parse back a SELECT target list
1075
1091
  *
1076
1092
  * This is also used for RETURNING lists in INSERT/UPDATE/DELETE.
1093
+ *
1094
+ * resultDesc and colNamesVisible are as for get_query_def()
1077
1095
  * ----------
1078
1096
  */
1079
1097
 
@@ -1291,6 +1309,16 @@ static void get_reloptions(StringInfo buf, Datum reloptions);
1291
1309
  */
1292
1310
 
1293
1311
 
1312
+ /*
1313
+ * get_rule_list_toplevel - Parse back a list of toplevel expressions
1314
+ *
1315
+ * Apply get_rule_expr_toplevel() to each element of a List.
1316
+ *
1317
+ * This adds commas between the expressions, but caller is responsible
1318
+ * for printing surrounding decoration.
1319
+ */
1320
+
1321
+
1294
1322
  /*
1295
1323
  * get_rule_expr_funccall - Parse back a function-call expression
1296
1324
  *
@@ -49,6 +49,7 @@
49
49
  #include "catalog/storage.h"
50
50
  #include "commands/async.h"
51
51
  #include "commands/prepare.h"
52
+ #include "commands/tablespace.h"
52
53
  #include "commands/trigger.h"
53
54
  #include "commands/user.h"
54
55
  #include "commands/vacuum.h"
@@ -1618,6 +1618,11 @@ const pg_wchar_tbl pg_wchar_table[] = {
1618
1618
 
1619
1619
  /*
1620
1620
  * Returns the byte length of a multibyte character.
1621
+ *
1622
+ * Caution: when dealing with text that is not certainly valid in the
1623
+ * specified encoding, the result may exceed the actual remaining
1624
+ * string length. Callers that are not prepared to deal with that
1625
+ * should use pg_encoding_mblen_bounded() instead.
1621
1626
  */
1622
1627
  int
1623
1628
  pg_encoding_mblen(int encoding, const char *mbstr)
@@ -1627,6 +1632,12 @@ pg_encoding_mblen(int encoding, const char *mbstr)
1627
1632
  pg_wchar_table[PG_SQL_ASCII].mblen((const unsigned char *) mbstr));
1628
1633
  }
1629
1634
 
1635
+ /*
1636
+ * Returns the byte length of a multibyte character; but not more than
1637
+ * the distance to end of string.
1638
+ */
1639
+
1640
+
1630
1641
  /*
1631
1642
  * Returns the display length of a multibyte character.
1632
1643
  */
@@ -385,9 +385,11 @@ add_dummy_return(PLpgSQL_function *function)
385
385
  /*
386
386
  * If the outer block has an EXCEPTION clause, we need to make a new outer
387
387
  * block, since the added RETURN shouldn't act like it is inside the
388
- * EXCEPTION clause.
388
+ * EXCEPTION clause. Likewise, if it has a label, wrap it in a new outer
389
+ * block so that EXIT doesn't skip the RETURN.
389
390
  */
390
- if (function->action->exceptions != NULL)
391
+ if (function->action->exceptions != NULL ||
392
+ function->action->label != NULL)
391
393
  {
392
394
  PLpgSQL_stmt_block *new;
393
395
 
@@ -5535,7 +5535,7 @@ make_execsql_stmt(int firsttoken, int location)
5535
5535
 
5536
5536
  check_sql_expr(expr->query, location, 0);
5537
5537
 
5538
- execsql = palloc(sizeof(PLpgSQL_stmt_execsql));
5538
+ execsql = palloc0(sizeof(PLpgSQL_stmt_execsql));
5539
5539
  execsql->cmd_type = PLPGSQL_STMT_EXECSQL;
5540
5540
  execsql->lineno = plpgsql_location_to_lineno(location);
5541
5541
  execsql->stmtid = ++plpgsql_curr_compile->nstatements;
@@ -1,13 +1,6 @@
1
1
  /*--------------------------------------------------------------------
2
2
  * Symbols referenced in this file:
3
3
  * - pg_popcount64
4
- * - pg_popcount64_choose
5
- * - pg_popcount32
6
- * - pg_popcount32_choose
7
- * - pg_popcount_available
8
- * - pg_popcount32_asm
9
- * - pg_popcount64_asm
10
- * - pg_popcount32_slow
11
4
  * - pg_popcount64_slow
12
5
  *--------------------------------------------------------------------
13
6
  */
@@ -92,7 +85,7 @@ static int pg_popcount64_asm(uint64 word);
92
85
  int (*pg_popcount32) (uint32 word) = pg_popcount32_choose;
93
86
  int (*pg_popcount64) (uint64 word) = pg_popcount64_choose;
94
87
  #else
95
- int (*pg_popcount32) (uint32 word) = pg_popcount32_slow;
88
+
96
89
  int (*pg_popcount64) (uint64 word) = pg_popcount64_slow;
97
90
  #endif /* USE_POPCNT_ASM */
98
91
 
@@ -190,23 +183,9 @@ __asm__ __volatile__(" popcntq %1,%0\n":"=q"(res):"rm"(word):"cc");
190
183
  * pg_popcount32_slow
191
184
  * Return the number of 1 bits set in word
192
185
  */
193
- static int
194
- pg_popcount32_slow(uint32 word)
195
- {
196
186
  #ifdef HAVE__BUILTIN_POPCOUNT
197
- return __builtin_popcount(word);
198
187
  #else /* !HAVE__BUILTIN_POPCOUNT */
199
- int result = 0;
200
-
201
- while (word != 0)
202
- {
203
- result += pg_number_of_ones[word & 255];
204
- word >>= 8;
205
- }
206
-
207
- return result;
208
188
  #endif /* HAVE__BUILTIN_POPCOUNT */
209
- }
210
189
 
211
190
  /*
212
191
  * pg_popcount64_slow
@@ -344,7 +344,7 @@ static bool find_arguments(const char *format, va_list args,
344
344
  PrintfArgValue *argvalues);
345
345
  static void fmtstr(const char *value, int leftjust, int minlen, int maxwidth,
346
346
  int pointflag, PrintfTarget *target);
347
- static void fmtptr(void *value, PrintfTarget *target);
347
+ static void fmtptr(const void *value, PrintfTarget *target);
348
348
  static void fmtint(long long value, char type, int forcesign,
349
349
  int leftjust, int minlen, int zpad, int precision, int pointflag,
350
350
  PrintfTarget *target);
@@ -418,7 +418,7 @@ dopr(PrintfTarget *target, const char *format, va_list args)
418
418
  int cvalue;
419
419
  long long numvalue;
420
420
  double fvalue;
421
- char *strvalue;
421
+ const char *strvalue;
422
422
  PrintfArgValue argvalues[PG_NL_ARGMAX + 1];
423
423
 
424
424
  /*
@@ -463,7 +463,8 @@ dopr(PrintfTarget *target, const char *format, va_list args)
463
463
  {
464
464
  format++;
465
465
  strvalue = va_arg(args, char *);
466
- Assert(strvalue != NULL);
466
+ if (strvalue == NULL)
467
+ strvalue = "(null)";
467
468
  dostr(strvalue, strlen(strvalue), target);
468
469
  if (target->failed)
469
470
  break;
@@ -694,8 +695,9 @@ nextch2:
694
695
  strvalue = argvalues[fmtpos].cptr;
695
696
  else
696
697
  strvalue = va_arg(args, char *);
697
- /* Whine if someone tries to print a NULL string */
698
- Assert(strvalue != NULL);
698
+ /* If string is NULL, silently substitute "(null)" */
699
+ if (strvalue == NULL)
700
+ strvalue = "(null)";
699
701
  fmtstr(strvalue, leftjust, fieldwidth, precision, pointflag,
700
702
  target);
701
703
  break;
@@ -705,7 +707,7 @@ nextch2:
705
707
  strvalue = argvalues[fmtpos].cptr;
706
708
  else
707
709
  strvalue = va_arg(args, char *);
708
- fmtptr((void *) strvalue, target);
710
+ fmtptr((const void *) strvalue, target);
709
711
  break;
710
712
  case 'e':
711
713
  case 'E':
@@ -1019,7 +1021,7 @@ fmtstr(const char *value, int leftjust, int minlen, int maxwidth,
1019
1021
  }
1020
1022
 
1021
1023
  static void
1022
- fmtptr(void *value, PrintfTarget *target)
1024
+ fmtptr(const void *value, PrintfTarget *target)
1023
1025
  {
1024
1026
  int vallen;
1025
1027
  char convert[64];
@@ -7,7 +7,13 @@ module PgQuery
7
7
 
8
8
  # Reconstruct all of the parsed queries into their original form
9
9
  def self.deparse(tree)
10
- PgQuery.deparse_protobuf(PgQuery::ParseResult.encode(tree)).force_encoding('UTF-8')
10
+ if PgQuery::ParseResult.method(:encode).arity == 1
11
+ PgQuery.deparse_protobuf(PgQuery::ParseResult.encode(tree)).force_encoding('UTF-8')
12
+ elsif PgQuery::ParseResult.method(:encode).arity == -1
13
+ PgQuery.deparse_protobuf(PgQuery::ParseResult.encode(tree, recursion_limit: 1_000)).force_encoding('UTF-8')
14
+ else
15
+ raise ArgumentError, 'Unsupported protobuf Ruby API'
16
+ end
11
17
  end
12
18
 
13
19
  # Convenience method for deparsing a statement of a specific type
@@ -39,6 +39,11 @@ module PgQuery
39
39
  subhash = FingerprintSubHash.new
40
40
 
41
41
  if val.is_a?(Google::Protobuf::RepeatedField)
42
+ # For lists that have exactly one untyped node, just output the parent field (if needed) and return
43
+ if val.length == 1 && val[0].is_a?(Node) && val[0].node.nil?
44
+ hash.update(parent_field_name) if need_to_write_name
45
+ return
46
+ end
42
47
  fingerprint_list(val, subhash, parent_node_name, parent_field_name)
43
48
  elsif val.is_a?(List)
44
49
  fingerprint_list(val.items, subhash, parent_node_name, parent_field_name)
@@ -90,12 +95,18 @@ module PgQuery
90
95
  when 'location'
91
96
  next
92
97
  when 'name'
93
- next if [PrepareStmt, ExecuteStmt, DeallocateStmt].include?(node.class)
98
+ next if [PrepareStmt, ExecuteStmt, DeallocateStmt, FunctionParameter].include?(node.class)
94
99
  next if node.is_a?(ResTarget) && parent_node_name == 'SelectStmt' && parent_field_name == 'targetList'
95
- when 'gid', 'options', 'savepoint_name'
100
+ when 'gid', 'savepoint_name'
96
101
  next if node.is_a?(TransactionStmt)
102
+ when 'options'
103
+ next if [TransactionStmt, CreateFunctionStmt].include?(node.class)
97
104
  when 'portalname'
98
105
  next if [DeclareCursorStmt, FetchStmt, ClosePortalStmt].include?(node.class)
106
+ when 'conditionname'
107
+ next if [ListenStmt, UnlistenStmt, NotifyStmt].include?(node.class)
108
+ when 'args'
109
+ next if node.is_a?(DoStmt)
99
110
  when 'relname'
100
111
  next if node.is_a?(RangeVar) && node.relpersistence == 't'
101
112
  if node.is_a?(RangeVar)
@@ -216,7 +216,7 @@ module PgQuery
216
216
  when :OBJECT_FUNCTION
217
217
  # Only one function can be dropped in a statement
218
218
  obj = statement.drop_stmt.objects[0].object_with_args
219
- @functions << { function: obj.objname[0].string.str, type: :ddl }
219
+ @functions << { function: obj.objname.map { |f| f.string.str }.join('.'), type: :ddl }
220
220
  end
221
221
  when :grant_stmt
222
222
  objects = statement.grant_stmt.objects
@@ -235,18 +235,20 @@ module PgQuery
235
235
  statements << statement.explain_stmt.query
236
236
  when :create_function_stmt
237
237
  @functions << {
238
- function: statement.create_function_stmt.funcname[0].string.str,
238
+ function: statement.create_function_stmt.funcname.map { |f| f.string.str }.join('.'),
239
239
  type: :ddl
240
240
  }
241
241
  when :rename_stmt
242
242
  if statement.rename_stmt.rename_type == :OBJECT_FUNCTION
243
- original_name = statement.rename_stmt.object.object_with_args.objname[0].string.str
243
+ original_name = statement.rename_stmt.object.object_with_args.objname.map { |f| f.string.str }.join('.')
244
244
  new_name = statement.rename_stmt.newname
245
245
  @functions += [
246
246
  { function: original_name, type: :ddl },
247
247
  { function: new_name, type: :ddl }
248
248
  ]
249
249
  end
250
+ when :prepare_stmt
251
+ statements << statement.prepare_stmt.query
250
252
  end
251
253
  end
252
254
 
@@ -809,6 +809,7 @@ Google::Protobuf::DescriptorPool.generated_pool.build do
809
809
  optional :def, :message, 5, "pg_query.Node", json_name: "def"
810
810
  optional :behavior, :enum, 6, "pg_query.DropBehavior", json_name: "behavior"
811
811
  optional :missing_ok, :bool, 7, json_name: "missing_ok"
812
+ optional :recurse, :bool, 8, json_name: "recurse"
812
813
  end
813
814
  add_message "pg_query.AlterDomainStmt" do
814
815
  optional :subtype, :string, 1, json_name: "subtype"
@@ -2766,7 +2767,7 @@ Google::Protobuf::DescriptorPool.generated_pool.build do
2766
2767
  value :REASSIGN, 579
2767
2768
  value :RECHECK, 580
2768
2769
  value :RECURSIVE, 581
2769
- value :REF, 582
2770
+ value :REF_P, 582
2770
2771
  value :REFERENCES, 583
2771
2772
  value :REFERENCING, 584
2772
2773
  value :REFRESH, 585
@@ -1,5 +1,11 @@
1
1
  module PgQuery
2
2
  class ParserResult
3
+ def walk!
4
+ treewalker!(@tree) do |parent_node, parent_field, node, location|
5
+ yield(parent_node, parent_field, node, location)
6
+ end
7
+ end
8
+
3
9
  private
4
10
 
5
11
  def treewalker!(tree) # rubocop:disable Metrics/CyclomaticComplexity
@@ -1,3 +1,3 @@
1
1
  module PgQuery
2
- VERSION = '2.1.4'.freeze
2
+ VERSION = '2.2.1'.freeze
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: pg_query
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.1.4
4
+ version: 2.2.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Lukas Fittl
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2022-09-17 00:00:00.000000000 Z
11
+ date: 2023-01-24 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rake-compiler