pg_query 2.1.0 → 4.2.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (472) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +104 -0
  3. data/README.md +59 -31
  4. data/Rakefile +2 -2
  5. data/ext/pg_query/extconf.rb +8 -2
  6. data/ext/pg_query/include/access/amapi.h +45 -1
  7. data/ext/pg_query/include/access/attmap.h +1 -1
  8. data/ext/pg_query/include/access/attnum.h +2 -2
  9. data/ext/pg_query/include/access/clog.h +4 -2
  10. data/ext/pg_query/include/access/commit_ts.h +6 -9
  11. data/ext/pg_query/include/access/detoast.h +1 -11
  12. data/ext/pg_query/include/access/genam.h +15 -12
  13. data/ext/pg_query/include/access/gin.h +2 -2
  14. data/ext/pg_query/include/access/htup.h +1 -1
  15. data/ext/pg_query/include/access/htup_details.h +75 -87
  16. data/ext/pg_query/include/access/itup.h +7 -1
  17. data/ext/pg_query/include/access/parallel.h +2 -2
  18. data/ext/pg_query/include/access/printtup.h +1 -1
  19. data/ext/pg_query/include/access/relation.h +1 -1
  20. data/ext/pg_query/include/access/relscan.h +17 -2
  21. data/ext/pg_query/include/access/rmgr.h +30 -3
  22. data/ext/pg_query/include/access/rmgrlist.h +23 -23
  23. data/ext/pg_query/include/access/sdir.h +1 -1
  24. data/ext/pg_query/include/access/skey.h +1 -1
  25. data/ext/pg_query/include/access/stratnum.h +4 -2
  26. data/ext/pg_query/include/access/sysattr.h +1 -1
  27. data/ext/pg_query/include/access/table.h +2 -1
  28. data/ext/pg_query/include/access/tableam.h +272 -20
  29. data/ext/pg_query/include/access/toast_compression.h +73 -0
  30. data/ext/pg_query/include/access/transam.h +123 -13
  31. data/ext/pg_query/include/access/tupconvert.h +1 -1
  32. data/ext/pg_query/include/access/tupdesc.h +1 -1
  33. data/ext/pg_query/include/access/tupmacs.h +3 -3
  34. data/ext/pg_query/include/access/twophase.h +5 -1
  35. data/ext/pg_query/include/access/xact.h +79 -19
  36. data/ext/pg_query/include/access/xlog.h +60 -155
  37. data/ext/pg_query/include/access/xlog_internal.h +50 -14
  38. data/ext/pg_query/include/access/xlogdefs.h +8 -16
  39. data/ext/pg_query/include/access/xlogprefetcher.h +55 -0
  40. data/ext/pg_query/include/access/xlogreader.h +148 -32
  41. data/ext/pg_query/include/access/xlogrecord.h +18 -9
  42. data/ext/pg_query/include/access/xlogrecovery.h +157 -0
  43. data/ext/pg_query/include/c.h +101 -44
  44. data/ext/pg_query/include/catalog/catalog.h +3 -1
  45. data/ext/pg_query/include/catalog/catversion.h +2 -2
  46. data/ext/pg_query/include/catalog/dependency.h +10 -16
  47. data/ext/pg_query/include/catalog/genbki.h +83 -5
  48. data/ext/pg_query/include/catalog/index.h +18 -3
  49. data/ext/pg_query/include/catalog/indexing.h +12 -324
  50. data/ext/pg_query/include/catalog/namespace.h +4 -2
  51. data/ext/pg_query/include/catalog/objectaccess.h +70 -2
  52. data/ext/pg_query/include/catalog/objectaddress.h +11 -6
  53. data/ext/pg_query/include/catalog/pg_aggregate.h +14 -10
  54. data/ext/pg_query/include/catalog/pg_aggregate_d.h +2 -1
  55. data/ext/pg_query/include/catalog/pg_am.h +4 -1
  56. data/ext/pg_query/include/catalog/pg_am_d.h +3 -1
  57. data/ext/pg_query/include/catalog/pg_attribute.h +27 -10
  58. data/ext/pg_query/include/catalog/pg_attribute_d.h +21 -18
  59. data/ext/pg_query/include/catalog/pg_authid.h +7 -2
  60. data/ext/pg_query/include/catalog/pg_authid_d.h +17 -9
  61. data/ext/pg_query/include/catalog/pg_class.h +45 -15
  62. data/ext/pg_query/include/catalog/pg_class_d.h +31 -2
  63. data/ext/pg_query/include/catalog/pg_collation.h +33 -8
  64. data/ext/pg_query/include/catalog/pg_collation_d.h +20 -3
  65. data/ext/pg_query/include/catalog/pg_constraint.h +38 -12
  66. data/ext/pg_query/include/catalog/pg_constraint_d.h +10 -4
  67. data/ext/pg_query/include/catalog/pg_control.h +5 -5
  68. data/ext/pg_query/include/catalog/pg_conversion.h +7 -4
  69. data/ext/pg_query/include/catalog/pg_conversion_d.h +4 -1
  70. data/ext/pg_query/include/catalog/pg_depend.h +11 -7
  71. data/ext/pg_query/include/catalog/pg_depend_d.h +3 -1
  72. data/ext/pg_query/include/catalog/pg_event_trigger.h +9 -3
  73. data/ext/pg_query/include/catalog/pg_event_trigger_d.h +3 -1
  74. data/ext/pg_query/include/catalog/pg_index.h +17 -7
  75. data/ext/pg_query/include/catalog/pg_index_d.h +20 -17
  76. data/ext/pg_query/include/catalog/pg_language.h +10 -5
  77. data/ext/pg_query/include/catalog/pg_language_d.h +3 -1
  78. data/ext/pg_query/include/catalog/pg_namespace.h +7 -2
  79. data/ext/pg_query/include/catalog/pg_namespace_d.h +3 -1
  80. data/ext/pg_query/include/catalog/pg_opclass.h +8 -5
  81. data/ext/pg_query/include/catalog/pg_opclass_d.h +3 -1
  82. data/ext/pg_query/include/catalog/pg_operator.h +21 -16
  83. data/ext/pg_query/include/catalog/pg_operator_d.h +37 -1
  84. data/ext/pg_query/include/catalog/pg_opfamily.h +6 -3
  85. data/ext/pg_query/include/catalog/pg_opfamily_d.h +3 -1
  86. data/ext/pg_query/include/catalog/pg_parameter_acl.h +60 -0
  87. data/ext/pg_query/include/catalog/pg_parameter_acl_d.h +34 -0
  88. data/ext/pg_query/include/catalog/pg_partitioned_table.h +20 -9
  89. data/ext/pg_query/include/catalog/pg_partitioned_table_d.h +2 -1
  90. data/ext/pg_query/include/catalog/pg_proc.h +20 -11
  91. data/ext/pg_query/include/catalog/pg_proc_d.h +10 -8
  92. data/ext/pg_query/include/catalog/pg_publication.h +50 -4
  93. data/ext/pg_query/include/catalog/pg_publication_d.h +3 -1
  94. data/ext/pg_query/include/catalog/pg_replication_origin.h +6 -1
  95. data/ext/pg_query/include/catalog/pg_replication_origin_d.h +5 -1
  96. data/ext/pg_query/include/catalog/pg_statistic.h +19 -12
  97. data/ext/pg_query/include/catalog/pg_statistic_d.h +2 -1
  98. data/ext/pg_query/include/catalog/pg_statistic_ext.h +19 -5
  99. data/ext/pg_query/include/catalog/pg_statistic_ext_d.h +7 -2
  100. data/ext/pg_query/include/catalog/pg_transform.h +8 -5
  101. data/ext/pg_query/include/catalog/pg_transform_d.h +3 -1
  102. data/ext/pg_query/include/catalog/pg_trigger.h +24 -8
  103. data/ext/pg_query/include/catalog/pg_trigger_d.h +4 -1
  104. data/ext/pg_query/include/catalog/pg_ts_config.h +6 -3
  105. data/ext/pg_query/include/catalog/pg_ts_config_d.h +3 -1
  106. data/ext/pg_query/include/catalog/pg_ts_dict.h +8 -3
  107. data/ext/pg_query/include/catalog/pg_ts_dict_d.h +3 -1
  108. data/ext/pg_query/include/catalog/pg_ts_parser.h +6 -3
  109. data/ext/pg_query/include/catalog/pg_ts_parser_d.h +3 -1
  110. data/ext/pg_query/include/catalog/pg_ts_template.h +6 -3
  111. data/ext/pg_query/include/catalog/pg_ts_template_d.h +3 -1
  112. data/ext/pg_query/include/catalog/pg_type.h +56 -24
  113. data/ext/pg_query/include/catalog/pg_type_d.h +70 -31
  114. data/ext/pg_query/include/catalog/storage.h +5 -3
  115. data/ext/pg_query/include/commands/async.h +4 -5
  116. data/ext/pg_query/include/commands/dbcommands.h +2 -1
  117. data/ext/pg_query/include/commands/defrem.h +11 -24
  118. data/ext/pg_query/include/commands/event_trigger.h +2 -2
  119. data/ext/pg_query/include/commands/explain.h +1 -1
  120. data/ext/pg_query/include/commands/prepare.h +1 -1
  121. data/ext/pg_query/include/commands/tablespace.h +3 -1
  122. data/ext/pg_query/include/commands/trigger.h +27 -17
  123. data/ext/pg_query/include/commands/user.h +2 -2
  124. data/ext/pg_query/include/commands/vacuum.h +88 -41
  125. data/ext/pg_query/include/commands/variable.h +1 -1
  126. data/ext/pg_query/include/common/file_perm.h +4 -4
  127. data/ext/pg_query/include/common/hashfn.h +1 -1
  128. data/ext/pg_query/include/common/ip.h +1 -7
  129. data/ext/pg_query/include/common/keywords.h +2 -6
  130. data/ext/pg_query/include/common/kwlookup.h +1 -1
  131. data/ext/pg_query/include/common/pg_prng.h +60 -0
  132. data/ext/pg_query/include/common/relpath.h +2 -2
  133. data/ext/pg_query/include/common/string.h +24 -1
  134. data/ext/pg_query/include/common/unicode_combining_table.h +114 -2
  135. data/ext/pg_query/include/common/unicode_east_asian_fw_table.h +125 -0
  136. data/ext/pg_query/include/datatype/timestamp.h +40 -1
  137. data/ext/pg_query/include/executor/execdesc.h +1 -1
  138. data/ext/pg_query/include/executor/executor.h +65 -22
  139. data/ext/pg_query/include/executor/functions.h +17 -3
  140. data/ext/pg_query/include/executor/instrument.h +33 -16
  141. data/ext/pg_query/include/executor/spi.h +41 -3
  142. data/ext/pg_query/include/executor/tablefunc.h +1 -1
  143. data/ext/pg_query/include/executor/tuptable.h +1 -1
  144. data/ext/pg_query/include/fmgr.h +13 -7
  145. data/ext/pg_query/include/funcapi.h +16 -4
  146. data/ext/pg_query/include/getaddrinfo.h +1 -1
  147. data/ext/pg_query/include/jit/jit.h +11 -11
  148. data/ext/pg_query/include/kwlist_d.h +517 -494
  149. data/ext/pg_query/include/lib/dshash.h +112 -0
  150. data/ext/pg_query/include/lib/ilist.h +20 -1
  151. data/ext/pg_query/include/lib/pairingheap.h +1 -1
  152. data/ext/pg_query/include/lib/simplehash.h +150 -25
  153. data/ext/pg_query/include/lib/sort_template.h +432 -0
  154. data/ext/pg_query/include/lib/stringinfo.h +1 -1
  155. data/ext/pg_query/include/libpq/auth.h +6 -4
  156. data/ext/pg_query/include/libpq/crypt.h +5 -4
  157. data/ext/pg_query/include/libpq/hba.h +43 -4
  158. data/ext/pg_query/include/libpq/libpq-be.h +23 -6
  159. data/ext/pg_query/include/libpq/libpq.h +31 -20
  160. data/ext/pg_query/include/libpq/pqcomm.h +17 -31
  161. data/ext/pg_query/include/libpq/pqformat.h +1 -1
  162. data/ext/pg_query/include/libpq/pqsignal.h +4 -4
  163. data/ext/pg_query/include/mb/pg_wchar.h +106 -23
  164. data/ext/pg_query/include/mb/stringinfo_mb.h +1 -1
  165. data/ext/pg_query/include/miscadmin.h +71 -52
  166. data/ext/pg_query/include/nodes/bitmapset.h +1 -1
  167. data/ext/pg_query/include/nodes/execnodes.h +272 -80
  168. data/ext/pg_query/include/nodes/extensible.h +4 -2
  169. data/ext/pg_query/include/nodes/lockoptions.h +1 -1
  170. data/ext/pg_query/include/nodes/makefuncs.h +7 -6
  171. data/ext/pg_query/include/nodes/memnodes.h +5 -3
  172. data/ext/pg_query/include/nodes/nodeFuncs.h +1 -1
  173. data/ext/pg_query/include/nodes/nodes.h +30 -11
  174. data/ext/pg_query/include/nodes/params.h +1 -1
  175. data/ext/pg_query/include/nodes/parsenodes.h +327 -94
  176. data/ext/pg_query/include/nodes/pathnodes.h +245 -67
  177. data/ext/pg_query/include/nodes/pg_list.h +75 -68
  178. data/ext/pg_query/include/nodes/plannodes.h +128 -30
  179. data/ext/pg_query/include/nodes/primnodes.h +99 -47
  180. data/ext/pg_query/include/nodes/print.h +1 -1
  181. data/ext/pg_query/include/nodes/tidbitmap.h +1 -1
  182. data/ext/pg_query/include/nodes/value.h +58 -39
  183. data/ext/pg_query/include/optimizer/cost.h +9 -2
  184. data/ext/pg_query/include/optimizer/geqo.h +9 -7
  185. data/ext/pg_query/include/optimizer/geqo_gene.h +1 -1
  186. data/ext/pg_query/include/optimizer/optimizer.h +25 -22
  187. data/ext/pg_query/include/optimizer/paths.h +6 -6
  188. data/ext/pg_query/include/optimizer/planmain.h +15 -14
  189. data/ext/pg_query/include/parser/analyze.h +19 -5
  190. data/ext/pg_query/include/parser/gram.h +947 -913
  191. data/ext/pg_query/include/parser/gramparse.h +1 -1
  192. data/ext/pg_query/include/parser/kwlist.h +463 -453
  193. data/ext/pg_query/include/parser/parse_agg.h +2 -7
  194. data/ext/pg_query/include/parser/parse_coerce.h +4 -1
  195. data/ext/pg_query/include/parser/parse_expr.h +2 -3
  196. data/ext/pg_query/include/parser/parse_func.h +2 -1
  197. data/ext/pg_query/include/parser/parse_node.h +21 -9
  198. data/ext/pg_query/include/parser/parse_oper.h +1 -3
  199. data/ext/pg_query/include/parser/parse_relation.h +5 -4
  200. data/ext/pg_query/include/parser/parse_type.h +1 -1
  201. data/ext/pg_query/include/parser/parser.h +31 -4
  202. data/ext/pg_query/include/parser/parsetree.h +1 -1
  203. data/ext/pg_query/include/parser/scanner.h +1 -1
  204. data/ext/pg_query/include/parser/scansup.h +2 -5
  205. data/ext/pg_query/include/partitioning/partdefs.h +1 -1
  206. data/ext/pg_query/include/pg_config.h +94 -46
  207. data/ext/pg_query/include/pg_config_manual.h +74 -21
  208. data/ext/pg_query/include/pg_getopt.h +6 -6
  209. data/ext/pg_query/include/pg_query.h +5 -4
  210. data/ext/pg_query/include/pg_query_enum_defs.c +358 -241
  211. data/ext/pg_query/include/pg_query_fingerprint_conds.c +44 -7
  212. data/ext/pg_query/include/pg_query_fingerprint_defs.c +1220 -422
  213. data/ext/pg_query/include/pg_query_outfuncs_conds.c +43 -13
  214. data/ext/pg_query/include/pg_query_outfuncs_defs.c +152 -26
  215. data/ext/pg_query/include/pg_query_readfuncs_conds.c +11 -2
  216. data/ext/pg_query/include/pg_query_readfuncs_defs.c +174 -30
  217. data/ext/pg_query/include/pg_trace.h +1 -1
  218. data/ext/pg_query/include/pgstat.h +449 -1237
  219. data/ext/pg_query/include/pgtime.h +14 -4
  220. data/ext/pg_query/include/pl_gram.h +126 -128
  221. data/ext/pg_query/include/pl_reserved_kwlist.h +1 -1
  222. data/ext/pg_query/include/pl_reserved_kwlist_d.h +10 -10
  223. data/ext/pg_query/include/pl_unreserved_kwlist.h +2 -3
  224. data/ext/pg_query/include/pl_unreserved_kwlist_d.h +54 -56
  225. data/ext/pg_query/include/plerrcodes.h +9 -1
  226. data/ext/pg_query/include/plpgsql.h +52 -54
  227. data/ext/pg_query/include/port/atomics/arch-arm.h +7 -1
  228. data/ext/pg_query/include/port/atomics/arch-ppc.h +1 -1
  229. data/ext/pg_query/include/port/atomics/arch-x86.h +1 -1
  230. data/ext/pg_query/include/port/atomics/fallback.h +1 -1
  231. data/ext/pg_query/include/port/atomics/generic-gcc.h +3 -3
  232. data/ext/pg_query/include/port/atomics/generic.h +1 -1
  233. data/ext/pg_query/include/port/atomics.h +1 -1
  234. data/ext/pg_query/include/port/pg_bitutils.h +88 -12
  235. data/ext/pg_query/include/port/pg_bswap.h +1 -1
  236. data/ext/pg_query/include/port/pg_crc32c.h +1 -1
  237. data/ext/pg_query/include/port.h +72 -43
  238. data/ext/pg_query/include/portability/instr_time.h +1 -1
  239. data/ext/pg_query/include/postgres.h +60 -16
  240. data/ext/pg_query/include/postmaster/autovacuum.h +17 -17
  241. data/ext/pg_query/include/postmaster/auxprocess.h +20 -0
  242. data/ext/pg_query/include/postmaster/bgworker.h +2 -1
  243. data/ext/pg_query/include/postmaster/bgworker_internals.h +2 -2
  244. data/ext/pg_query/include/postmaster/bgwriter.h +5 -5
  245. data/ext/pg_query/include/postmaster/fork_process.h +1 -1
  246. data/ext/pg_query/include/postmaster/interrupt.h +1 -1
  247. data/ext/pg_query/include/postmaster/pgarch.h +42 -8
  248. data/ext/pg_query/include/postmaster/postmaster.h +18 -17
  249. data/ext/pg_query/include/postmaster/startup.h +39 -0
  250. data/ext/pg_query/include/postmaster/syslogger.h +15 -10
  251. data/ext/pg_query/include/postmaster/walwriter.h +3 -3
  252. data/ext/pg_query/include/protobuf/pg_query.pb-c.h +1422 -916
  253. data/ext/pg_query/include/protobuf/pg_query.pb.h +43678 -32769
  254. data/ext/pg_query/include/regex/regex.h +18 -16
  255. data/ext/pg_query/include/replication/logicallauncher.h +3 -5
  256. data/ext/pg_query/include/replication/logicalproto.h +161 -17
  257. data/ext/pg_query/include/replication/logicalworker.h +1 -1
  258. data/ext/pg_query/include/replication/origin.h +7 -7
  259. data/ext/pg_query/include/replication/reorderbuffer.h +262 -44
  260. data/ext/pg_query/include/replication/slot.h +23 -12
  261. data/ext/pg_query/include/replication/syncrep.h +5 -5
  262. data/ext/pg_query/include/replication/walreceiver.h +145 -13
  263. data/ext/pg_query/include/replication/walsender.h +8 -8
  264. data/ext/pg_query/include/rewrite/prs2lock.h +1 -1
  265. data/ext/pg_query/include/rewrite/rewriteHandler.h +1 -3
  266. data/ext/pg_query/include/rewrite/rewriteManip.h +1 -1
  267. data/ext/pg_query/include/rewrite/rewriteSupport.h +1 -1
  268. data/ext/pg_query/include/storage/backendid.h +3 -3
  269. data/ext/pg_query/include/storage/block.h +4 -10
  270. data/ext/pg_query/include/storage/buf.h +1 -1
  271. data/ext/pg_query/include/storage/bufmgr.h +19 -14
  272. data/ext/pg_query/include/storage/bufpage.h +6 -8
  273. data/ext/pg_query/include/storage/condition_variable.h +13 -2
  274. data/ext/pg_query/include/storage/dsm.h +4 -1
  275. data/ext/pg_query/include/storage/dsm_impl.h +3 -2
  276. data/ext/pg_query/include/storage/fd.h +33 -3
  277. data/ext/pg_query/include/storage/fileset.h +40 -0
  278. data/ext/pg_query/include/storage/ipc.h +4 -1
  279. data/ext/pg_query/include/storage/item.h +1 -1
  280. data/ext/pg_query/include/storage/itemid.h +1 -1
  281. data/ext/pg_query/include/storage/itemptr.h +3 -1
  282. data/ext/pg_query/include/storage/large_object.h +2 -2
  283. data/ext/pg_query/include/storage/latch.h +9 -13
  284. data/ext/pg_query/include/storage/lmgr.h +2 -1
  285. data/ext/pg_query/include/storage/lock.h +17 -13
  286. data/ext/pg_query/include/storage/lockdefs.h +2 -2
  287. data/ext/pg_query/include/storage/lwlock.h +6 -32
  288. data/ext/pg_query/include/storage/lwlocknames.h +0 -1
  289. data/ext/pg_query/include/storage/off.h +1 -1
  290. data/ext/pg_query/include/storage/pg_sema.h +1 -1
  291. data/ext/pg_query/include/storage/pg_shmem.h +9 -7
  292. data/ext/pg_query/include/storage/pmsignal.h +15 -4
  293. data/ext/pg_query/include/storage/predicate.h +4 -4
  294. data/ext/pg_query/include/storage/proc.h +183 -55
  295. data/ext/pg_query/include/storage/procarray.h +98 -0
  296. data/ext/pg_query/include/storage/proclist_types.h +1 -1
  297. data/ext/pg_query/include/storage/procsignal.h +3 -7
  298. data/ext/pg_query/include/storage/relfilenode.h +1 -1
  299. data/ext/pg_query/include/storage/s_lock.h +67 -4
  300. data/ext/pg_query/include/storage/sharedfileset.h +3 -11
  301. data/ext/pg_query/include/storage/shm_mq.h +5 -4
  302. data/ext/pg_query/include/storage/shm_toc.h +1 -1
  303. data/ext/pg_query/include/storage/shmem.h +1 -1
  304. data/ext/pg_query/include/storage/sinval.h +3 -3
  305. data/ext/pg_query/include/storage/sinvaladt.h +1 -1
  306. data/ext/pg_query/include/storage/smgr.h +10 -8
  307. data/ext/pg_query/include/storage/spin.h +2 -2
  308. data/ext/pg_query/include/storage/standby.h +13 -6
  309. data/ext/pg_query/include/storage/standbydefs.h +2 -2
  310. data/ext/pg_query/include/storage/sync.h +7 -3
  311. data/ext/pg_query/include/tcop/cmdtag.h +1 -1
  312. data/ext/pg_query/include/tcop/cmdtaglist.h +3 -2
  313. data/ext/pg_query/include/tcop/deparse_utility.h +1 -1
  314. data/ext/pg_query/include/tcop/dest.h +1 -1
  315. data/ext/pg_query/include/tcop/fastpath.h +1 -2
  316. data/ext/pg_query/include/tcop/pquery.h +7 -1
  317. data/ext/pg_query/include/tcop/tcopprot.h +19 -11
  318. data/ext/pg_query/include/tcop/utility.h +7 -3
  319. data/ext/pg_query/include/tsearch/ts_cache.h +2 -2
  320. data/ext/pg_query/include/utils/acl.h +24 -3
  321. data/ext/pg_query/include/utils/aclchk_internal.h +1 -1
  322. data/ext/pg_query/include/utils/array.h +7 -2
  323. data/ext/pg_query/include/utils/backend_progress.h +44 -0
  324. data/ext/pg_query/include/utils/backend_status.h +321 -0
  325. data/ext/pg_query/include/utils/builtins.h +11 -11
  326. data/ext/pg_query/include/utils/bytea.h +3 -2
  327. data/ext/pg_query/include/utils/catcache.h +1 -1
  328. data/ext/pg_query/include/utils/date.h +1 -1
  329. data/ext/pg_query/include/utils/datetime.h +8 -7
  330. data/ext/pg_query/include/utils/datum.h +9 -1
  331. data/ext/pg_query/include/utils/dsa.h +1 -1
  332. data/ext/pg_query/include/utils/dynahash.h +4 -3
  333. data/ext/pg_query/include/utils/elog.h +52 -21
  334. data/ext/pg_query/include/utils/errcodes.h +2 -0
  335. data/ext/pg_query/include/utils/expandeddatum.h +1 -1
  336. data/ext/pg_query/include/utils/expandedrecord.h +1 -1
  337. data/ext/pg_query/include/utils/float.h +7 -7
  338. data/ext/pg_query/include/utils/fmgroids.h +1300 -696
  339. data/ext/pg_query/include/utils/fmgrprotos.h +199 -16
  340. data/ext/pg_query/include/utils/fmgrtab.h +6 -5
  341. data/ext/pg_query/include/utils/guc.h +69 -43
  342. data/ext/pg_query/include/utils/guc_tables.h +23 -19
  343. data/ext/pg_query/include/utils/hsearch.h +15 -11
  344. data/ext/pg_query/include/utils/inval.h +5 -1
  345. data/ext/pg_query/include/utils/lsyscache.h +11 -1
  346. data/ext/pg_query/include/utils/memdebug.h +1 -1
  347. data/ext/pg_query/include/utils/memutils.h +8 -3
  348. data/ext/pg_query/include/utils/numeric.h +19 -5
  349. data/ext/pg_query/include/utils/palloc.h +25 -3
  350. data/ext/pg_query/include/utils/partcache.h +1 -1
  351. data/ext/pg_query/include/utils/pg_locale.h +17 -9
  352. data/ext/pg_query/include/utils/pg_lsn.h +1 -1
  353. data/ext/pg_query/include/utils/pgstat_internal.h +784 -0
  354. data/ext/pg_query/include/utils/pidfile.h +1 -1
  355. data/ext/pg_query/include/utils/plancache.h +6 -5
  356. data/ext/pg_query/include/utils/portal.h +12 -1
  357. data/ext/pg_query/include/utils/ps_status.h +1 -1
  358. data/ext/pg_query/include/utils/queryenvironment.h +1 -1
  359. data/ext/pg_query/include/utils/queryjumble.h +88 -0
  360. data/ext/pg_query/include/utils/regproc.h +14 -3
  361. data/ext/pg_query/include/utils/rel.h +71 -20
  362. data/ext/pg_query/include/utils/relcache.h +9 -7
  363. data/ext/pg_query/include/utils/reltrigger.h +1 -1
  364. data/ext/pg_query/include/utils/resowner.h +1 -1
  365. data/ext/pg_query/include/utils/rls.h +2 -2
  366. data/ext/pg_query/include/utils/ruleutils.h +4 -1
  367. data/ext/pg_query/include/utils/sharedtuplestore.h +1 -1
  368. data/ext/pg_query/include/utils/snapmgr.h +35 -14
  369. data/ext/pg_query/include/utils/snapshot.h +14 -1
  370. data/ext/pg_query/include/utils/sortsupport.h +117 -2
  371. data/ext/pg_query/include/utils/syscache.h +6 -1
  372. data/ext/pg_query/include/utils/timeout.h +11 -4
  373. data/ext/pg_query/include/utils/timestamp.h +6 -5
  374. data/ext/pg_query/include/utils/tuplesort.h +25 -11
  375. data/ext/pg_query/include/utils/tuplestore.h +2 -2
  376. data/ext/pg_query/include/utils/typcache.h +24 -17
  377. data/ext/pg_query/include/utils/tzparser.h +1 -1
  378. data/ext/pg_query/include/utils/varlena.h +5 -3
  379. data/ext/pg_query/include/utils/wait_event.h +289 -0
  380. data/ext/pg_query/include/utils/xml.h +4 -4
  381. data/ext/pg_query/pg_query.pb-c.c +4318 -2307
  382. data/ext/pg_query/pg_query_deparse.c +1114 -381
  383. data/ext/pg_query/pg_query_fingerprint.c +46 -10
  384. data/ext/pg_query/pg_query_fingerprint.h +3 -1
  385. data/ext/pg_query/pg_query_json_plpgsql.c +55 -12
  386. data/ext/pg_query/pg_query_normalize.c +163 -20
  387. data/ext/pg_query/pg_query_outfuncs.h +1 -0
  388. data/ext/pg_query/pg_query_outfuncs_json.c +65 -16
  389. data/ext/pg_query/pg_query_outfuncs_protobuf.c +70 -10
  390. data/ext/pg_query/pg_query_parse.c +1 -1
  391. data/ext/pg_query/pg_query_parse_plpgsql.c +79 -16
  392. data/ext/pg_query/pg_query_readfuncs_protobuf.c +42 -8
  393. data/ext/pg_query/pg_query_ruby.c +1 -1
  394. data/ext/pg_query/pg_query_scan.c +2 -1
  395. data/ext/pg_query/pg_query_split.c +3 -2
  396. data/ext/pg_query/src_backend_catalog_namespace.c +21 -9
  397. data/ext/pg_query/src_backend_catalog_pg_proc.c +4 -1
  398. data/ext/pg_query/src_backend_commands_define.c +11 -1
  399. data/ext/pg_query/src_backend_nodes_bitmapset.c +3 -1
  400. data/ext/pg_query/src_backend_nodes_copyfuncs.c +424 -109
  401. data/ext/pg_query/src_backend_nodes_equalfuncs.c +291 -46
  402. data/ext/pg_query/src_backend_nodes_extensible.c +1 -1
  403. data/ext/pg_query/src_backend_nodes_list.c +86 -11
  404. data/ext/pg_query/src_backend_nodes_makefuncs.c +5 -4
  405. data/ext/pg_query/src_backend_nodes_nodeFuncs.c +55 -12
  406. data/ext/pg_query/src_backend_nodes_value.c +28 -19
  407. data/ext/pg_query/src_backend_parser_gram.c +33890 -31262
  408. data/ext/pg_query/src_backend_parser_parser.c +26 -7
  409. data/ext/pg_query/src_backend_parser_scan.c +644 -441
  410. data/ext/pg_query/src_backend_parser_scansup.c +4 -28
  411. data/ext/pg_query/src_backend_postmaster_postmaster.c +77 -106
  412. data/ext/pg_query/src_backend_storage_ipc_ipc.c +13 -4
  413. data/ext/pg_query/src_backend_storage_lmgr_s_lock.c +5 -4
  414. data/ext/pg_query/src_backend_tcop_postgres.c +73 -24
  415. data/ext/pg_query/src_backend_utils_activity_pgstat_database.c +140 -0
  416. data/ext/pg_query/src_backend_utils_adt_datum.c +13 -1
  417. data/ext/pg_query/src_backend_utils_adt_expandeddatum.c +1 -1
  418. data/ext/pg_query/src_backend_utils_adt_format_type.c +6 -2
  419. data/ext/pg_query/src_backend_utils_adt_ruleutils.c +109 -15
  420. data/ext/pg_query/src_backend_utils_error_assert.c +16 -14
  421. data/ext/pg_query/src_backend_utils_error_elog.c +172 -99
  422. data/ext/pg_query/src_backend_utils_fmgr_fmgr.c +12 -17
  423. data/ext/pg_query/src_backend_utils_hash_dynahash.c +40 -10
  424. data/ext/pg_query/src_backend_utils_init_globals.c +5 -5
  425. data/ext/pg_query/src_backend_utils_mb_mbutils.c +55 -66
  426. data/ext/pg_query/src_backend_utils_misc_guc.c +207 -45
  427. data/ext/pg_query/src_backend_utils_mmgr_aset.c +7 -5
  428. data/ext/pg_query/src_backend_utils_mmgr_mcxt.c +123 -35
  429. data/ext/pg_query/src_common_encnames.c +1 -1
  430. data/ext/pg_query/src_common_hashfn.c +3 -3
  431. data/ext/pg_query/src_common_keywords.c +15 -2
  432. data/ext/pg_query/src_common_kwlist_d.h +517 -494
  433. data/ext/pg_query/src_common_kwlookup.c +1 -1
  434. data/ext/pg_query/src_common_pg_prng.c +152 -0
  435. data/ext/pg_query/src_common_psprintf.c +1 -1
  436. data/ext/pg_query/src_common_string.c +7 -1
  437. data/ext/pg_query/src_common_stringinfo.c +1 -1
  438. data/ext/pg_query/src_common_wchar.c +712 -109
  439. data/ext/pg_query/src_pl_plpgsql_src_pl_comp.c +49 -22
  440. data/ext/pg_query/src_pl_plpgsql_src_pl_funcs.c +1 -18
  441. data/ext/pg_query/src_pl_plpgsql_src_pl_gram.c +1235 -1261
  442. data/ext/pg_query/src_pl_plpgsql_src_pl_handler.c +1 -1
  443. data/ext/pg_query/src_pl_plpgsql_src_pl_reserved_kwlist_d.h +10 -10
  444. data/ext/pg_query/src_pl_plpgsql_src_pl_scanner.c +2 -2
  445. data/ext/pg_query/src_pl_plpgsql_src_pl_unreserved_kwlist_d.h +54 -56
  446. data/ext/pg_query/src_port_pg_bitutils.c +41 -52
  447. data/ext/pg_query/src_port_pgsleep.c +1 -1
  448. data/ext/pg_query/src_port_pgstrcasecmp.c +1 -1
  449. data/ext/pg_query/src_port_qsort.c +12 -224
  450. data/ext/pg_query/src_port_snprintf.c +46 -20
  451. data/ext/pg_query/src_port_strerror.c +9 -19
  452. data/ext/pg_query/src_port_strnlen.c +1 -1
  453. data/lib/pg_query/deparse.rb +7 -1
  454. data/lib/pg_query/filter_columns.rb +6 -4
  455. data/lib/pg_query/fingerprint.rb +18 -3
  456. data/lib/pg_query/node.rb +2 -2
  457. data/lib/pg_query/param_refs.rb +1 -1
  458. data/lib/pg_query/parse.rb +87 -51
  459. data/lib/pg_query/pg_query_pb.rb +1109 -942
  460. data/lib/pg_query/treewalker.rb +6 -0
  461. data/lib/pg_query/truncate.rb +54 -8
  462. data/lib/pg_query/version.rb +1 -1
  463. metadata +29 -18
  464. data/ext/pg_query/include/access/xloginsert.h +0 -64
  465. data/ext/pg_query/include/bootstrap/bootstrap.h +0 -62
  466. data/ext/pg_query/include/parser/parse_clause.h +0 -54
  467. data/ext/pg_query/include/parser/parse_collate.h +0 -27
  468. data/ext/pg_query/include/parser/parse_target.h +0 -46
  469. data/ext/pg_query/src_backend_libpq_pqcomm.c +0 -651
  470. data/ext/pg_query/src_backend_parser_parse_expr.c +0 -313
  471. data/ext/pg_query/src_port_erand48.c +0 -127
  472. data/ext/pg_query/src_port_random.c +0 -31
@@ -30,7 +30,7 @@
30
30
  * Copyright (c) 1983, 1995, 1996 Eric P. Allman
31
31
  * Copyright (c) 1988, 1993
32
32
  * The Regents of the University of California. All rights reserved.
33
- * Portions Copyright (c) 1996-2020, PostgreSQL Global Development Group
33
+ * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
34
34
  *
35
35
  * Redistribution and use in source and binary forms, with or without
36
36
  * modification, are permitted provided that the following conditions
@@ -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,13 +1021,13 @@ 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];
1026
1028
 
1027
- /* we rely on regular C library's sprintf to do the basic conversion */
1028
- vallen = sprintf(convert, "%p", value);
1029
+ /* we rely on regular C library's snprintf to do the basic conversion */
1030
+ vallen = snprintf(convert, sizeof(convert), "%p", value);
1029
1031
  if (vallen < 0)
1030
1032
  target->failed = true;
1031
1033
  else
@@ -1037,8 +1039,8 @@ fmtint(long long value, char type, int forcesign, int leftjust,
1037
1039
  int minlen, int zpad, int precision, int pointflag,
1038
1040
  PrintfTarget *target)
1039
1041
  {
1040
- unsigned long long base;
1041
1042
  unsigned long long uvalue;
1043
+ int base;
1042
1044
  int dosign;
1043
1045
  const char *cvt = "0123456789abcdef";
1044
1046
  int signvalue = 0;
@@ -1097,12 +1099,36 @@ fmtint(long long value, char type, int forcesign, int leftjust,
1097
1099
  vallen = 0;
1098
1100
  else
1099
1101
  {
1100
- /* make integer string */
1101
- do
1102
+ /*
1103
+ * Convert integer to string. We special-case each of the possible
1104
+ * base values so as to avoid general-purpose divisions. On most
1105
+ * machines, division by a fixed constant can be done much more
1106
+ * cheaply than a general divide.
1107
+ */
1108
+ if (base == 10)
1109
+ {
1110
+ do
1111
+ {
1112
+ convert[sizeof(convert) - (++vallen)] = cvt[uvalue % 10];
1113
+ uvalue = uvalue / 10;
1114
+ } while (uvalue);
1115
+ }
1116
+ else if (base == 16)
1102
1117
  {
1103
- convert[sizeof(convert) - (++vallen)] = cvt[uvalue % base];
1104
- uvalue = uvalue / base;
1105
- } while (uvalue);
1118
+ do
1119
+ {
1120
+ convert[sizeof(convert) - (++vallen)] = cvt[uvalue % 16];
1121
+ uvalue = uvalue / 16;
1122
+ } while (uvalue);
1123
+ }
1124
+ else /* base == 8 */
1125
+ {
1126
+ do
1127
+ {
1128
+ convert[sizeof(convert) - (++vallen)] = cvt[uvalue % 8];
1129
+ uvalue = uvalue / 8;
1130
+ } while (uvalue);
1131
+ }
1106
1132
  }
1107
1133
 
1108
1134
  zeropad = Max(0, precision - vallen);
@@ -1151,11 +1177,11 @@ fmtfloat(double value, char type, int forcesign, int leftjust,
1151
1177
  int padlen; /* amount to pad with spaces */
1152
1178
 
1153
1179
  /*
1154
- * We rely on the regular C library's sprintf to do the basic conversion,
1180
+ * We rely on the regular C library's snprintf to do the basic conversion,
1155
1181
  * then handle padding considerations here.
1156
1182
  *
1157
1183
  * The dynamic range of "double" is about 1E+-308 for IEEE math, and not
1158
- * too wildly more than that with other hardware. In "f" format, sprintf
1184
+ * too wildly more than that with other hardware. In "f" format, snprintf
1159
1185
  * could therefore generate at most 308 characters to the left of the
1160
1186
  * decimal point; while we need to allow the precision to get as high as
1161
1187
  * 308+17 to ensure that we don't truncate significant digits from very
@@ -1207,14 +1233,14 @@ fmtfloat(double value, char type, int forcesign, int leftjust,
1207
1233
  fmt[2] = '*';
1208
1234
  fmt[3] = type;
1209
1235
  fmt[4] = '\0';
1210
- vallen = sprintf(convert, fmt, prec, value);
1236
+ vallen = snprintf(convert, sizeof(convert), fmt, prec, value);
1211
1237
  }
1212
1238
  else
1213
1239
  {
1214
1240
  fmt[0] = '%';
1215
1241
  fmt[1] = type;
1216
1242
  fmt[2] = '\0';
1217
- vallen = sprintf(convert, fmt, value);
1243
+ vallen = snprintf(convert, sizeof(convert), fmt, value);
1218
1244
  }
1219
1245
  if (vallen < 0)
1220
1246
  goto fail;
@@ -11,7 +11,7 @@
11
11
  * strerror.c
12
12
  * Replacements for standard strerror() and strerror_r() functions
13
13
  *
14
- * Portions Copyright (c) 1996-2020, PostgreSQL Global Development Group
14
+ * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
15
15
  * Portions Copyright (c) 1994, Regents of the University of California
16
16
  *
17
17
  *
@@ -120,14 +120,10 @@ get_errno_symbol(int errnum)
120
120
  return "E2BIG";
121
121
  case EACCES:
122
122
  return "EACCES";
123
- #ifdef EADDRINUSE
124
123
  case EADDRINUSE:
125
124
  return "EADDRINUSE";
126
- #endif
127
- #ifdef EADDRNOTAVAIL
128
125
  case EADDRNOTAVAIL:
129
126
  return "EADDRNOTAVAIL";
130
- #endif
131
127
  case EAFNOSUPPORT:
132
128
  return "EAFNOSUPPORT";
133
129
  #ifdef EAGAIN
@@ -148,16 +144,12 @@ get_errno_symbol(int errnum)
148
144
  return "EBUSY";
149
145
  case ECHILD:
150
146
  return "ECHILD";
151
- #ifdef ECONNABORTED
152
147
  case ECONNABORTED:
153
148
  return "ECONNABORTED";
154
- #endif
155
149
  case ECONNREFUSED:
156
150
  return "ECONNREFUSED";
157
- #ifdef ECONNRESET
158
151
  case ECONNRESET:
159
152
  return "ECONNRESET";
160
- #endif
161
153
  case EDEADLK:
162
154
  return "EDEADLK";
163
155
  case EDOM:
@@ -168,10 +160,10 @@ get_errno_symbol(int errnum)
168
160
  return "EFAULT";
169
161
  case EFBIG:
170
162
  return "EFBIG";
171
- #ifdef EHOSTUNREACH
163
+ case EHOSTDOWN:
164
+ return "EHOSTDOWN";
172
165
  case EHOSTUNREACH:
173
166
  return "EHOSTUNREACH";
174
- #endif
175
167
  case EIDRM:
176
168
  return "EIDRM";
177
169
  case EINPROGRESS:
@@ -182,10 +174,8 @@ get_errno_symbol(int errnum)
182
174
  return "EINVAL";
183
175
  case EIO:
184
176
  return "EIO";
185
- #ifdef EISCONN
186
177
  case EISCONN:
187
178
  return "EISCONN";
188
- #endif
189
179
  case EISDIR:
190
180
  return "EISDIR";
191
181
  #ifdef ELOOP
@@ -200,6 +190,12 @@ get_errno_symbol(int errnum)
200
190
  return "EMSGSIZE";
201
191
  case ENAMETOOLONG:
202
192
  return "ENAMETOOLONG";
193
+ case ENETDOWN:
194
+ return "ENETDOWN";
195
+ case ENETRESET:
196
+ return "ENETRESET";
197
+ case ENETUNREACH:
198
+ return "ENETUNREACH";
203
199
  case ENFILE:
204
200
  return "ENFILE";
205
201
  case ENOBUFS:
@@ -216,20 +212,16 @@ get_errno_symbol(int errnum)
216
212
  return "ENOSPC";
217
213
  case ENOSYS:
218
214
  return "ENOSYS";
219
- #ifdef ENOTCONN
220
215
  case ENOTCONN:
221
216
  return "ENOTCONN";
222
- #endif
223
217
  case ENOTDIR:
224
218
  return "ENOTDIR";
225
219
  #if defined(ENOTEMPTY) && (ENOTEMPTY != EEXIST) /* same code on AIX */
226
220
  case ENOTEMPTY:
227
221
  return "ENOTEMPTY";
228
222
  #endif
229
- #ifdef ENOTSOCK
230
223
  case ENOTSOCK:
231
224
  return "ENOTSOCK";
232
- #endif
233
225
  #ifdef ENOTSUP
234
226
  case ENOTSUP:
235
227
  return "ENOTSUP";
@@ -260,10 +252,8 @@ get_errno_symbol(int errnum)
260
252
  #endif
261
253
  case ESRCH:
262
254
  return "ESRCH";
263
- #ifdef ETIMEDOUT
264
255
  case ETIMEDOUT:
265
256
  return "ETIMEDOUT";
266
- #endif
267
257
  #ifdef ETXTBSY
268
258
  case ETXTBSY:
269
259
  return "ETXTBSY";
@@ -10,7 +10,7 @@
10
10
  * Fallback implementation of strnlen().
11
11
  *
12
12
  *
13
- * Portions Copyright (c) 1996-2020, PostgreSQL Global Development Group
13
+ * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
14
14
  * Portions Copyright (c) 1994, Regents of the University of California
15
15
  *
16
16
  * IDENTIFICATION
@@ -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
@@ -42,14 +42,16 @@ module PgQuery
42
42
  statements << item.common_table_expr.ctequery if item.node == :common_table_expr
43
43
  end
44
44
  end
45
- when :SETOP_UNION
46
- statements << statement.select_stmt.larg if statement.select_stmt.larg
47
- statements << statement.select_stmt.rarg if statement.select_stmt.rarg
45
+ when :SETOP_UNION, :SETOP_EXCEPT, :SETOP_INTERSECT
46
+ statements << PgQuery::Node.new(select_stmt: statement.select_stmt.larg) if statement.select_stmt.larg
47
+ statements << PgQuery::Node.new(select_stmt: statement.select_stmt.rarg) if statement.select_stmt.rarg
48
48
  end
49
49
  when :update_stmt
50
50
  condition_items << statement.update_stmt.where_clause if statement.update_stmt.where_clause
51
51
  when :delete_stmt
52
52
  condition_items << statement.delete_stmt.where_clause if statement.delete_stmt.where_clause
53
+ when :index_stmt
54
+ condition_items << statement.index_stmt.where_clause if statement.index_stmt.where_clause
53
55
  end
54
56
  end
55
57
 
@@ -67,7 +69,7 @@ module PgQuery
67
69
  when :row_expr
68
70
  condition_items += next_item.row_expr.args
69
71
  when :column_ref
70
- column, table = next_item.column_ref.fields.map { |f| f.string.str }.reverse
72
+ column, table = next_item.column_ref.fields.map { |f| f.string.sval }.reverse
71
73
  filter_columns << [@aliases[table] || table, column]
72
74
  when :null_test
73
75
  condition_items << next_item.null_test.arg
@@ -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)
@@ -55,7 +60,7 @@ module PgQuery
55
60
  end
56
61
 
57
62
  def ignored_node_type?(node)
58
- [A_Const, Alias, ParamRef, SetToDefault, IntList, OidList, Null].include?(node.class) ||
63
+ [A_Const, Alias, ParamRef, SetToDefault, IntList, OidList].include?(node.class) ||
59
64
  node.is_a?(TypeCast) && (node.arg.node == :a_const || node.arg.node == :param_ref)
60
65
  end
61
66
 
@@ -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)
@@ -111,6 +122,10 @@ module PgQuery
111
122
  fingerprint_value(:AEXPR_OP, hash, postgres_node_name, postgres_field_name, true)
112
123
  next
113
124
  end
125
+ # libpg_query still outputs `str` parts when print a string node. Here we override that to
126
+ # the expected field name of `sval`.
127
+ when 'sval', 'fval', 'bsval'
128
+ postgres_field_name = 'str' if node.is_a?(String) || node.is_a?(BitString) || node.is_a?(Float)
114
129
  end
115
130
 
116
131
  fingerprint_value(val, hash, postgres_node_name, postgres_field_name, true)
data/lib/pg_query/node.rb CHANGED
@@ -20,8 +20,8 @@ module PgQuery
20
20
  end
21
21
 
22
22
  # Make it easier to initialize value nodes
23
- def self.from_string(str)
24
- PgQuery::Node.new(string: PgQuery::String.new(str: str))
23
+ def self.from_string(sval)
24
+ PgQuery::Node.new(string: PgQuery::String.new(sval: sval))
25
25
  end
26
26
 
27
27
  def self.from_integer(ival)
@@ -29,7 +29,7 @@ module PgQuery
29
29
  location = typeloc
30
30
  end
31
31
 
32
- results << { 'location' => location, 'length' => length, 'typename' => t.names.map { |n| n.string.str } }
32
+ results << { 'location' => location, 'length' => length, 'typename' => t.names.map { |n| n.string.sval } }
33
33
  end
34
34
  end
35
35
 
@@ -3,7 +3,13 @@ module PgQuery
3
3
  result, stderr = parse_protobuf(query)
4
4
 
5
5
  begin
6
- result = PgQuery::ParseResult.decode(result)
6
+ result = if PgQuery::ParseResult.method(:decode).arity == 1
7
+ PgQuery::ParseResult.decode(result)
8
+ elsif PgQuery::ParseResult.method(:decode).arity == -1
9
+ PgQuery::ParseResult.decode(result, recursion_limit: 1_000)
10
+ else
11
+ raise ArgumentError, 'Unsupported protobuf Ruby API'
12
+ end
7
13
  rescue Google::Protobuf::ParseError => e
8
14
  raise PgQuery::ParseError.new(format('Failed to parse tree: %s', e.message), __FILE__, __LINE__, -1)
9
15
  end
@@ -89,6 +95,10 @@ module PgQuery
89
95
 
90
96
  protected
91
97
 
98
+ # Parses the query and finds table and function references
99
+ #
100
+ # Note we use ".to_ary" on arrays from the Protobuf library before
101
+ # passing them to concat, because of https://bugs.ruby-lang.org/issues/18140
92
102
  def load_objects! # rubocop:disable Metrics/CyclomaticComplexity
93
103
  @tables = [] # types: select, dml, ddl
94
104
  @cte_names = []
@@ -108,22 +118,18 @@ module PgQuery
108
118
  # The following statement types do not modify tables and are added to from_clause_items
109
119
  # (and subsequently @tables)
110
120
  when :select_stmt
111
- subselect_items.concat(statement.select_stmt.target_list)
121
+ subselect_items.concat(statement.select_stmt.target_list.to_ary)
112
122
  subselect_items << statement.select_stmt.where_clause if statement.select_stmt.where_clause
113
123
  subselect_items.concat(statement.select_stmt.sort_clause.collect { |h| h.sort_by.node })
114
- subselect_items.concat(statement.select_stmt.group_clause)
124
+ subselect_items.concat(statement.select_stmt.group_clause.to_ary)
115
125
  subselect_items << statement.select_stmt.having_clause if statement.select_stmt.having_clause
116
126
 
117
127
  case statement.select_stmt.op
118
128
  when :SETOP_NONE
119
129
  (statement.select_stmt.from_clause || []).each do |item|
120
- if item.node == :range_subselect
121
- statements << item.range_subselect.subquery
122
- else
123
- from_clause_items << { item: item, type: :select }
124
- end
130
+ from_clause_items << { item: item, type: :select }
125
131
  end
126
- when :SETOP_UNION
132
+ when :SETOP_UNION, :SETOP_EXCEPT, :SETOP_INTERSECT
127
133
  statements << PgQuery::Node.new(select_stmt: statement.select_stmt.larg) if statement.select_stmt.larg
128
134
  statements << PgQuery::Node.new(select_stmt: statement.select_stmt.rarg) if statement.select_stmt.rarg
129
135
  end
@@ -133,6 +139,10 @@ module PgQuery
133
139
  @cte_names.concat(cte_names)
134
140
  statements.concat(cte_statements)
135
141
  end
142
+
143
+ if statement.select_stmt.into_clause
144
+ from_clause_items << { item: PgQuery::Node.new(range_var: statement.select_stmt.into_clause.rel), type: :ddl }
145
+ end
136
146
  # The following statements modify the contents of a table
137
147
  when :insert_stmt, :update_stmt, :delete_stmt
138
148
  value = statement.public_send(statement.node)
@@ -143,12 +153,18 @@ module PgQuery
143
153
  value.from_clause.each do |item|
144
154
  from_clause_items << { item: item, type: :select }
145
155
  end
146
- subselect_items.concat(statement.update_stmt.target_list)
156
+ subselect_items.concat(statement.update_stmt.target_list.to_ary)
147
157
  end
148
158
 
149
159
  subselect_items << statement.update_stmt.where_clause if statement.node == :update_stmt && statement.update_stmt.where_clause
150
160
  subselect_items << statement.delete_stmt.where_clause if statement.node == :delete_stmt && statement.delete_stmt.where_clause
151
161
 
162
+ if statement.node == :delete_stmt
163
+ statement.delete_stmt.using_clause.each do |using_clause|
164
+ from_clause_items << { item: using_clause, type: :select }
165
+ end
166
+ end
167
+
152
168
  if value.with_clause
153
169
  cte_statements, cte_names = statements_and_cte_names_for_with_clause(value.with_clause)
154
170
  @cte_names.concat(cte_names)
@@ -159,7 +175,12 @@ module PgQuery
159
175
  statements << statement.copy_stmt.query
160
176
  # The following statement types are DDL (changing table structure)
161
177
  when :alter_table_stmt
162
- from_clause_items << { item: PgQuery::Node.new(range_var: statement.alter_table_stmt.relation), type: :ddl }
178
+ case statement.alter_table_stmt.objtype
179
+ when :OBJECT_INDEX # Index # rubocop:disable Lint/EmptyWhen
180
+ # ignore `ALTER INDEX index_name`
181
+ else
182
+ from_clause_items << { item: PgQuery::Node.new(range_var: statement.alter_table_stmt.relation), type: :ddl }
183
+ end
163
184
  when :create_stmt
164
185
  from_clause_items << { item: PgQuery::Node.new(range_var: statement.create_stmt.relation), type: :ddl }
165
186
  when :create_table_as_stmt
@@ -174,6 +195,11 @@ module PgQuery
174
195
  statements << statement.view_stmt.query
175
196
  when :index_stmt
176
197
  from_clause_items << { item: PgQuery::Node.new(range_var: statement.index_stmt.relation), type: :ddl }
198
+ statement.index_stmt.index_params.each do |p|
199
+ next if p.index_elem.expr.nil?
200
+ subselect_items << p.index_elem.expr
201
+ end
202
+ subselect_items << statement.index_stmt.where_clause if statement.index_stmt.where_clause
177
203
  when :create_trig_stmt
178
204
  from_clause_items << { item: PgQuery::Node.new(range_var: statement.create_trig_stmt.relation), type: :ddl }
179
205
  when :rule_stmt
@@ -186,9 +212,9 @@ module PgQuery
186
212
  objects = statement.drop_stmt.objects.map do |obj|
187
213
  case obj.node
188
214
  when :list
189
- obj.list.items.map { |obj2| obj2.string.str if obj2.node == :string }
215
+ obj.list.items.map { |obj2| obj2.string.sval if obj2.node == :string }
190
216
  when :string
191
- obj.string.str
217
+ obj.string.sval
192
218
  end
193
219
  end
194
220
  case statement.drop_stmt.remove_type
@@ -199,7 +225,7 @@ module PgQuery
199
225
  when :OBJECT_FUNCTION
200
226
  # Only one function can be dropped in a statement
201
227
  obj = statement.drop_stmt.objects[0].object_with_args
202
- @functions << { function: obj.objname[0].string.str, type: :ddl }
228
+ @functions << { function: obj.objname.map { |f| f.string.sval }.join('.'), type: :ddl }
203
229
  end
204
230
  when :grant_stmt
205
231
  objects = statement.grant_stmt.objects
@@ -218,24 +244,28 @@ module PgQuery
218
244
  statements << statement.explain_stmt.query
219
245
  when :create_function_stmt
220
246
  @functions << {
221
- function: statement.create_function_stmt.funcname[0].string.str,
247
+ function: statement.create_function_stmt.funcname.map { |f| f.string.sval }.join('.'),
222
248
  type: :ddl
223
249
  }
224
250
  when :rename_stmt
225
251
  if statement.rename_stmt.rename_type == :OBJECT_FUNCTION
226
- original_name = statement.rename_stmt.object.object_with_args.objname[0].string.str
252
+ original_name = statement.rename_stmt.object.object_with_args.objname.map { |f| f.string.sval }.join('.')
227
253
  new_name = statement.rename_stmt.newname
228
254
  @functions += [
229
255
  { function: original_name, type: :ddl },
230
256
  { function: new_name, type: :ddl }
231
257
  ]
232
258
  end
259
+ when :prepare_stmt
260
+ statements << statement.prepare_stmt.query
233
261
  end
234
262
  end
235
263
 
236
264
  next_item = subselect_items.shift
237
265
  if next_item
238
266
  case next_item.node
267
+ when :list
268
+ subselect_items += next_item.list.items.to_ary
239
269
  when :a_expr
240
270
  %w[lexpr rexpr].each do |side|
241
271
  elem = next_item.a_expr.public_send(side)
@@ -247,56 +277,62 @@ module PgQuery
247
277
  end
248
278
  end
249
279
  when :bool_expr
250
- subselect_items.concat(next_item.bool_expr.args)
280
+ subselect_items.concat(next_item.bool_expr.args.to_ary)
251
281
  when :coalesce_expr
252
- subselect_items.concat(next_item.coalesce_expr.args)
282
+ subselect_items.concat(next_item.coalesce_expr.args.to_ary)
253
283
  when :min_max_expr
254
- subselect_items.concat(next_item.min_max_expr.args)
284
+ subselect_items.concat(next_item.min_max_expr.args.to_ary)
255
285
  when :res_target
256
286
  subselect_items << next_item.res_target.val
257
287
  when :sub_link
258
288
  statements << next_item.sub_link.subselect
259
289
  when :func_call
290
+ subselect_items.concat(next_item.func_call.args.to_ary)
260
291
  @functions << {
261
- function: next_item.func_call.funcname[0].string.str,
292
+ function: next_item.func_call.funcname.map { |f| f.string.sval }.join('.'),
262
293
  type: :call
263
294
  }
295
+ when :case_expr
296
+ subselect_items.concat(next_item.case_expr.args.map { |arg| arg.case_when.expr })
297
+ subselect_items.concat(next_item.case_expr.args.map { |arg| arg.case_when.result })
298
+ subselect_items << next_item.case_expr.defresult
299
+ when :type_cast
300
+ subselect_items << next_item.type_cast.arg
264
301
  end
265
302
  end
266
303
 
267
- break if subselect_items.empty? && statements.empty?
268
- end
269
-
270
- loop do
271
304
  next_item = from_clause_items.shift
272
- break unless next_item && next_item[:item]
273
-
274
- case next_item[:item].node
275
- when :join_expr
276
- from_clause_items << { item: next_item[:item].join_expr.larg, type: next_item[:type] }
277
- from_clause_items << { item: next_item[:item].join_expr.rarg, type: next_item[:type] }
278
- when :row_expr
279
- from_clause_items += next_item[:item].row_expr.args.map { |a| { item: a, type: next_item[:type] } }
280
- when :range_var
281
- rangevar = next_item[:item].range_var
282
- next if rangevar.schemaname.empty? && @cte_names.include?(rangevar.relname)
283
-
284
- table = [rangevar.schemaname, rangevar.relname].reject { |s| s.nil? || s.empty? }.join('.')
285
- @tables << {
286
- name: table,
287
- type: next_item[:type],
288
- location: rangevar.location,
289
- schemaname: (rangevar.schemaname unless rangevar.schemaname.empty?),
290
- relname: rangevar.relname,
291
- inh: rangevar.inh
292
- }
293
- @aliases[rangevar.alias.aliasname] = table if rangevar.alias
294
- when :range_subselect
295
- from_clause_items << { item: next_item[:item].range_subselect.subquery, type: next_item[:type] }
296
- when :select_stmt
297
- from_clause = next_item[:item].select_stmt.from_clause
298
- from_clause_items += from_clause.map { |r| { item: r, type: next_item[:type] } } if from_clause
305
+ if next_item && next_item[:item]
306
+ case next_item[:item].node
307
+ when :join_expr
308
+ from_clause_items << { item: next_item[:item].join_expr.larg, type: next_item[:type] }
309
+ from_clause_items << { item: next_item[:item].join_expr.rarg, type: next_item[:type] }
310
+ subselect_items << next_item[:item].join_expr.quals
311
+ when :row_expr
312
+ from_clause_items += next_item[:item].row_expr.args.map { |a| { item: a, type: next_item[:type] } }
313
+ when :range_var
314
+ rangevar = next_item[:item].range_var
315
+ next if rangevar.schemaname.empty? && @cte_names.include?(rangevar.relname)
316
+
317
+ table = [rangevar.schemaname, rangevar.relname].reject { |s| s.nil? || s.empty? }.join('.')
318
+ @tables << {
319
+ name: table,
320
+ type: next_item[:type],
321
+ location: rangevar.location,
322
+ schemaname: (rangevar.schemaname unless rangevar.schemaname.empty?),
323
+ relname: rangevar.relname,
324
+ inh: rangevar.inh,
325
+ relpersistence: rangevar.relpersistence
326
+ }
327
+ @aliases[rangevar.alias.aliasname] = table if rangevar.alias
328
+ when :range_subselect
329
+ statements << next_item[:item].range_subselect.subquery
330
+ when :range_function
331
+ subselect_items += next_item[:item].range_function.functions
332
+ end
299
333
  end
334
+
335
+ break if subselect_items.empty? && statements.empty? && from_clause_items.empty?
300
336
  end
301
337
 
302
338
  @tables.uniq!