pg_query 1.3.0 → 2.1.0

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 (480) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +237 -117
  3. data/README.md +84 -65
  4. data/Rakefile +71 -5
  5. data/ext/pg_query/extconf.rb +4 -38
  6. data/ext/pg_query/guc-file.c +0 -0
  7. data/ext/pg_query/include/access/amapi.h +246 -0
  8. data/ext/pg_query/include/access/attmap.h +52 -0
  9. data/ext/pg_query/include/access/attnum.h +64 -0
  10. data/ext/pg_query/include/access/clog.h +61 -0
  11. data/ext/pg_query/include/access/commit_ts.h +77 -0
  12. data/ext/pg_query/include/access/detoast.h +92 -0
  13. data/ext/pg_query/include/access/genam.h +228 -0
  14. data/ext/pg_query/include/access/gin.h +78 -0
  15. data/ext/pg_query/include/access/htup.h +89 -0
  16. data/ext/pg_query/include/access/htup_details.h +819 -0
  17. data/ext/pg_query/include/access/itup.h +161 -0
  18. data/ext/pg_query/include/access/parallel.h +82 -0
  19. data/ext/pg_query/include/access/printtup.h +35 -0
  20. data/ext/pg_query/include/access/relation.h +28 -0
  21. data/ext/pg_query/include/access/relscan.h +176 -0
  22. data/ext/pg_query/include/access/rmgr.h +35 -0
  23. data/ext/pg_query/include/access/rmgrlist.h +49 -0
  24. data/ext/pg_query/include/access/sdir.h +58 -0
  25. data/ext/pg_query/include/access/skey.h +151 -0
  26. data/ext/pg_query/include/access/stratnum.h +83 -0
  27. data/ext/pg_query/include/access/sysattr.h +29 -0
  28. data/ext/pg_query/include/access/table.h +27 -0
  29. data/ext/pg_query/include/access/tableam.h +1825 -0
  30. data/ext/pg_query/include/access/transam.h +265 -0
  31. data/ext/pg_query/include/access/tupconvert.h +51 -0
  32. data/ext/pg_query/include/access/tupdesc.h +154 -0
  33. data/ext/pg_query/include/access/tupmacs.h +247 -0
  34. data/ext/pg_query/include/access/twophase.h +61 -0
  35. data/ext/pg_query/include/access/xact.h +463 -0
  36. data/ext/pg_query/include/access/xlog.h +398 -0
  37. data/ext/pg_query/include/access/xlog_internal.h +330 -0
  38. data/ext/pg_query/include/access/xlogdefs.h +109 -0
  39. data/ext/pg_query/include/access/xloginsert.h +64 -0
  40. data/ext/pg_query/include/access/xlogreader.h +327 -0
  41. data/ext/pg_query/include/access/xlogrecord.h +227 -0
  42. data/ext/pg_query/include/bootstrap/bootstrap.h +62 -0
  43. data/ext/pg_query/include/c.h +1334 -0
  44. data/ext/pg_query/include/catalog/catalog.h +42 -0
  45. data/ext/pg_query/include/catalog/catversion.h +58 -0
  46. data/ext/pg_query/include/catalog/dependency.h +275 -0
  47. data/ext/pg_query/include/catalog/genbki.h +64 -0
  48. data/ext/pg_query/include/catalog/index.h +199 -0
  49. data/ext/pg_query/include/catalog/indexing.h +366 -0
  50. data/ext/pg_query/include/catalog/namespace.h +188 -0
  51. data/ext/pg_query/include/catalog/objectaccess.h +197 -0
  52. data/ext/pg_query/include/catalog/objectaddress.h +84 -0
  53. data/ext/pg_query/include/catalog/pg_aggregate.h +176 -0
  54. data/ext/pg_query/include/catalog/pg_aggregate_d.h +77 -0
  55. data/ext/pg_query/include/catalog/pg_am.h +60 -0
  56. data/ext/pg_query/include/catalog/pg_am_d.h +45 -0
  57. data/ext/pg_query/include/catalog/pg_attribute.h +204 -0
  58. data/ext/pg_query/include/catalog/pg_attribute_d.h +59 -0
  59. data/ext/pg_query/include/catalog/pg_authid.h +58 -0
  60. data/ext/pg_query/include/catalog/pg_authid_d.h +49 -0
  61. data/ext/pg_query/include/catalog/pg_class.h +200 -0
  62. data/ext/pg_query/include/catalog/pg_class_d.h +103 -0
  63. data/ext/pg_query/include/catalog/pg_collation.h +73 -0
  64. data/ext/pg_query/include/catalog/pg_collation_d.h +45 -0
  65. data/ext/pg_query/include/catalog/pg_constraint.h +247 -0
  66. data/ext/pg_query/include/catalog/pg_constraint_d.h +67 -0
  67. data/ext/pg_query/include/catalog/pg_control.h +250 -0
  68. data/ext/pg_query/include/catalog/pg_conversion.h +72 -0
  69. data/ext/pg_query/include/catalog/pg_conversion_d.h +35 -0
  70. data/ext/pg_query/include/catalog/pg_depend.h +73 -0
  71. data/ext/pg_query/include/catalog/pg_depend_d.h +34 -0
  72. data/ext/pg_query/include/catalog/pg_event_trigger.h +51 -0
  73. data/ext/pg_query/include/catalog/pg_event_trigger_d.h +34 -0
  74. data/ext/pg_query/include/catalog/pg_index.h +80 -0
  75. data/ext/pg_query/include/catalog/pg_index_d.h +56 -0
  76. data/ext/pg_query/include/catalog/pg_language.h +67 -0
  77. data/ext/pg_query/include/catalog/pg_language_d.h +39 -0
  78. data/ext/pg_query/include/catalog/pg_namespace.h +59 -0
  79. data/ext/pg_query/include/catalog/pg_namespace_d.h +34 -0
  80. data/ext/pg_query/include/catalog/pg_opclass.h +85 -0
  81. data/ext/pg_query/include/catalog/pg_opclass_d.h +49 -0
  82. data/ext/pg_query/include/catalog/pg_operator.h +102 -0
  83. data/ext/pg_query/include/catalog/pg_operator_d.h +106 -0
  84. data/ext/pg_query/include/catalog/pg_opfamily.h +60 -0
  85. data/ext/pg_query/include/catalog/pg_opfamily_d.h +47 -0
  86. data/ext/pg_query/include/catalog/pg_partitioned_table.h +63 -0
  87. data/ext/pg_query/include/catalog/pg_partitioned_table_d.h +35 -0
  88. data/ext/pg_query/include/catalog/pg_proc.h +211 -0
  89. data/ext/pg_query/include/catalog/pg_proc_d.h +99 -0
  90. data/ext/pg_query/include/catalog/pg_publication.h +115 -0
  91. data/ext/pg_query/include/catalog/pg_publication_d.h +36 -0
  92. data/ext/pg_query/include/catalog/pg_replication_origin.h +57 -0
  93. data/ext/pg_query/include/catalog/pg_replication_origin_d.h +29 -0
  94. data/ext/pg_query/include/catalog/pg_statistic.h +275 -0
  95. data/ext/pg_query/include/catalog/pg_statistic_d.h +194 -0
  96. data/ext/pg_query/include/catalog/pg_statistic_ext.h +74 -0
  97. data/ext/pg_query/include/catalog/pg_statistic_ext_d.h +40 -0
  98. data/ext/pg_query/include/catalog/pg_transform.h +45 -0
  99. data/ext/pg_query/include/catalog/pg_transform_d.h +32 -0
  100. data/ext/pg_query/include/catalog/pg_trigger.h +137 -0
  101. data/ext/pg_query/include/catalog/pg_trigger_d.h +106 -0
  102. data/ext/pg_query/include/catalog/pg_ts_config.h +50 -0
  103. data/ext/pg_query/include/catalog/pg_ts_config_d.h +32 -0
  104. data/ext/pg_query/include/catalog/pg_ts_dict.h +54 -0
  105. data/ext/pg_query/include/catalog/pg_ts_dict_d.h +33 -0
  106. data/ext/pg_query/include/catalog/pg_ts_parser.h +57 -0
  107. data/ext/pg_query/include/catalog/pg_ts_parser_d.h +35 -0
  108. data/ext/pg_query/include/catalog/pg_ts_template.h +48 -0
  109. data/ext/pg_query/include/catalog/pg_ts_template_d.h +32 -0
  110. data/ext/pg_query/include/catalog/pg_type.h +372 -0
  111. data/ext/pg_query/include/catalog/pg_type_d.h +285 -0
  112. data/ext/pg_query/include/catalog/storage.h +48 -0
  113. data/ext/pg_query/include/commands/async.h +54 -0
  114. data/ext/pg_query/include/commands/dbcommands.h +35 -0
  115. data/ext/pg_query/include/commands/defrem.h +173 -0
  116. data/ext/pg_query/include/commands/event_trigger.h +88 -0
  117. data/ext/pg_query/include/commands/explain.h +127 -0
  118. data/ext/pg_query/include/commands/prepare.h +61 -0
  119. data/ext/pg_query/include/commands/tablespace.h +67 -0
  120. data/ext/pg_query/include/commands/trigger.h +277 -0
  121. data/ext/pg_query/include/commands/user.h +37 -0
  122. data/ext/pg_query/include/commands/vacuum.h +293 -0
  123. data/ext/pg_query/include/commands/variable.h +38 -0
  124. data/ext/pg_query/include/common/file_perm.h +56 -0
  125. data/ext/pg_query/include/common/hashfn.h +104 -0
  126. data/ext/pg_query/include/common/ip.h +37 -0
  127. data/ext/pg_query/include/common/keywords.h +33 -0
  128. data/ext/pg_query/include/common/kwlookup.h +44 -0
  129. data/ext/pg_query/include/common/relpath.h +90 -0
  130. data/ext/pg_query/include/common/string.h +19 -0
  131. data/ext/pg_query/include/common/unicode_combining_table.h +196 -0
  132. data/ext/pg_query/include/datatype/timestamp.h +197 -0
  133. data/ext/pg_query/include/executor/execdesc.h +70 -0
  134. data/ext/pg_query/include/executor/executor.h +620 -0
  135. data/ext/pg_query/include/executor/functions.h +41 -0
  136. data/ext/pg_query/include/executor/instrument.h +101 -0
  137. data/ext/pg_query/include/executor/spi.h +175 -0
  138. data/ext/pg_query/include/executor/tablefunc.h +67 -0
  139. data/ext/pg_query/include/executor/tuptable.h +487 -0
  140. data/ext/pg_query/include/fmgr.h +775 -0
  141. data/ext/pg_query/include/funcapi.h +348 -0
  142. data/ext/pg_query/include/getaddrinfo.h +162 -0
  143. data/ext/pg_query/include/jit/jit.h +105 -0
  144. data/ext/pg_query/include/kwlist_d.h +1072 -0
  145. data/ext/pg_query/include/lib/ilist.h +727 -0
  146. data/ext/pg_query/include/lib/pairingheap.h +102 -0
  147. data/ext/pg_query/include/lib/simplehash.h +1059 -0
  148. data/ext/pg_query/include/lib/stringinfo.h +161 -0
  149. data/ext/pg_query/include/libpq/auth.h +29 -0
  150. data/ext/pg_query/include/libpq/crypt.h +46 -0
  151. data/ext/pg_query/include/libpq/hba.h +140 -0
  152. data/ext/pg_query/include/libpq/libpq-be.h +326 -0
  153. data/ext/pg_query/include/libpq/libpq.h +133 -0
  154. data/ext/pg_query/include/libpq/pqcomm.h +208 -0
  155. data/ext/pg_query/include/libpq/pqformat.h +210 -0
  156. data/ext/pg_query/include/libpq/pqsignal.h +42 -0
  157. data/ext/pg_query/include/mb/pg_wchar.h +672 -0
  158. data/ext/pg_query/include/mb/stringinfo_mb.h +24 -0
  159. data/ext/pg_query/include/miscadmin.h +476 -0
  160. data/ext/pg_query/include/nodes/bitmapset.h +122 -0
  161. data/ext/pg_query/include/nodes/execnodes.h +2523 -0
  162. data/ext/pg_query/include/nodes/extensible.h +160 -0
  163. data/ext/pg_query/include/nodes/lockoptions.h +61 -0
  164. data/ext/pg_query/include/nodes/makefuncs.h +108 -0
  165. data/ext/pg_query/include/nodes/memnodes.h +108 -0
  166. data/ext/pg_query/include/nodes/nodeFuncs.h +162 -0
  167. data/ext/pg_query/include/nodes/nodes.h +842 -0
  168. data/ext/pg_query/include/nodes/params.h +170 -0
  169. data/ext/pg_query/include/nodes/parsenodes.h +3579 -0
  170. data/ext/pg_query/include/nodes/pathnodes.h +2556 -0
  171. data/ext/pg_query/include/nodes/pg_list.h +605 -0
  172. data/ext/pg_query/include/nodes/plannodes.h +1251 -0
  173. data/ext/pg_query/include/nodes/primnodes.h +1541 -0
  174. data/ext/pg_query/include/nodes/print.h +34 -0
  175. data/ext/pg_query/include/nodes/tidbitmap.h +75 -0
  176. data/ext/pg_query/include/nodes/value.h +61 -0
  177. data/ext/pg_query/include/optimizer/cost.h +206 -0
  178. data/ext/pg_query/include/optimizer/geqo.h +88 -0
  179. data/ext/pg_query/include/optimizer/geqo_gene.h +45 -0
  180. data/ext/pg_query/include/optimizer/optimizer.h +199 -0
  181. data/ext/pg_query/include/optimizer/paths.h +257 -0
  182. data/ext/pg_query/include/optimizer/planmain.h +119 -0
  183. data/ext/pg_query/include/parser/analyze.h +49 -0
  184. data/ext/pg_query/include/parser/gram.h +1067 -0
  185. data/ext/pg_query/include/parser/gramparse.h +75 -0
  186. data/ext/pg_query/include/parser/kwlist.h +477 -0
  187. data/ext/pg_query/include/parser/parse_agg.h +68 -0
  188. data/ext/pg_query/include/parser/parse_clause.h +54 -0
  189. data/ext/pg_query/include/parser/parse_coerce.h +97 -0
  190. data/ext/pg_query/include/parser/parse_collate.h +27 -0
  191. data/ext/pg_query/include/parser/parse_expr.h +26 -0
  192. data/ext/pg_query/include/parser/parse_func.h +73 -0
  193. data/ext/pg_query/include/parser/parse_node.h +327 -0
  194. data/ext/pg_query/include/parser/parse_oper.h +67 -0
  195. data/ext/pg_query/include/parser/parse_relation.h +123 -0
  196. data/ext/pg_query/include/parser/parse_target.h +46 -0
  197. data/ext/pg_query/include/parser/parse_type.h +60 -0
  198. data/ext/pg_query/include/parser/parser.h +41 -0
  199. data/ext/pg_query/include/parser/parsetree.h +61 -0
  200. data/ext/pg_query/include/parser/scanner.h +152 -0
  201. data/ext/pg_query/include/parser/scansup.h +30 -0
  202. data/ext/pg_query/include/partitioning/partdefs.h +26 -0
  203. data/ext/pg_query/include/pg_config.h +989 -0
  204. data/ext/pg_query/include/pg_config_ext.h +8 -0
  205. data/ext/pg_query/include/pg_config_manual.h +357 -0
  206. data/ext/pg_query/include/pg_config_os.h +8 -0
  207. data/ext/pg_query/include/pg_getopt.h +56 -0
  208. data/ext/pg_query/include/pg_query.h +121 -0
  209. data/ext/pg_query/include/pg_query_enum_defs.c +2454 -0
  210. data/ext/pg_query/include/pg_query_fingerprint_conds.c +875 -0
  211. data/ext/pg_query/include/pg_query_fingerprint_defs.c +12413 -0
  212. data/ext/pg_query/include/pg_query_json_helper.c +61 -0
  213. data/ext/pg_query/include/pg_query_outfuncs_conds.c +686 -0
  214. data/ext/pg_query/include/pg_query_outfuncs_defs.c +2438 -0
  215. data/ext/pg_query/include/pg_query_readfuncs_conds.c +222 -0
  216. data/ext/pg_query/include/pg_query_readfuncs_defs.c +2879 -0
  217. data/ext/pg_query/include/pg_trace.h +17 -0
  218. data/ext/pg_query/include/pgstat.h +1487 -0
  219. data/ext/pg_query/include/pgtime.h +84 -0
  220. data/ext/pg_query/include/pl_gram.h +385 -0
  221. data/ext/pg_query/include/pl_reserved_kwlist.h +52 -0
  222. data/ext/pg_query/include/pl_reserved_kwlist_d.h +114 -0
  223. data/ext/pg_query/include/pl_unreserved_kwlist.h +112 -0
  224. data/ext/pg_query/include/pl_unreserved_kwlist_d.h +246 -0
  225. data/ext/pg_query/include/plerrcodes.h +990 -0
  226. data/ext/pg_query/include/plpgsql.h +1347 -0
  227. data/ext/pg_query/include/port.h +524 -0
  228. data/ext/pg_query/include/port/atomics.h +524 -0
  229. data/ext/pg_query/include/port/atomics/arch-arm.h +26 -0
  230. data/ext/pg_query/include/port/atomics/arch-ppc.h +254 -0
  231. data/ext/pg_query/include/port/atomics/arch-x86.h +252 -0
  232. data/ext/pg_query/include/port/atomics/fallback.h +170 -0
  233. data/ext/pg_query/include/port/atomics/generic-gcc.h +286 -0
  234. data/ext/pg_query/include/port/atomics/generic.h +401 -0
  235. data/ext/pg_query/include/port/pg_bitutils.h +226 -0
  236. data/ext/pg_query/include/port/pg_bswap.h +161 -0
  237. data/ext/pg_query/include/port/pg_crc32c.h +101 -0
  238. data/ext/pg_query/include/portability/instr_time.h +256 -0
  239. data/ext/pg_query/include/postgres.h +764 -0
  240. data/ext/pg_query/include/postgres_ext.h +74 -0
  241. data/ext/pg_query/include/postmaster/autovacuum.h +83 -0
  242. data/ext/pg_query/include/postmaster/bgworker.h +161 -0
  243. data/ext/pg_query/include/postmaster/bgworker_internals.h +64 -0
  244. data/ext/pg_query/include/postmaster/bgwriter.h +45 -0
  245. data/ext/pg_query/include/postmaster/fork_process.h +17 -0
  246. data/ext/pg_query/include/postmaster/interrupt.h +32 -0
  247. data/ext/pg_query/include/postmaster/pgarch.h +39 -0
  248. data/ext/pg_query/include/postmaster/postmaster.h +77 -0
  249. data/ext/pg_query/include/postmaster/syslogger.h +98 -0
  250. data/ext/pg_query/include/postmaster/walwriter.h +21 -0
  251. data/ext/pg_query/include/protobuf-c.h +1110 -0
  252. data/ext/pg_query/include/protobuf-c/protobuf-c.h +1110 -0
  253. data/ext/pg_query/include/protobuf/pg_query.pb-c.h +10851 -0
  254. data/ext/pg_query/include/protobuf/pg_query.pb.h +124718 -0
  255. data/ext/pg_query/include/regex/regex.h +184 -0
  256. data/ext/pg_query/include/replication/logicallauncher.h +31 -0
  257. data/ext/pg_query/include/replication/logicalproto.h +110 -0
  258. data/ext/pg_query/include/replication/logicalworker.h +19 -0
  259. data/ext/pg_query/include/replication/origin.h +73 -0
  260. data/ext/pg_query/include/replication/reorderbuffer.h +467 -0
  261. data/ext/pg_query/include/replication/slot.h +219 -0
  262. data/ext/pg_query/include/replication/syncrep.h +115 -0
  263. data/ext/pg_query/include/replication/walreceiver.h +340 -0
  264. data/ext/pg_query/include/replication/walsender.h +74 -0
  265. data/ext/pg_query/include/rewrite/prs2lock.h +46 -0
  266. data/ext/pg_query/include/rewrite/rewriteHandler.h +40 -0
  267. data/ext/pg_query/include/rewrite/rewriteManip.h +87 -0
  268. data/ext/pg_query/include/rewrite/rewriteSupport.h +26 -0
  269. data/ext/pg_query/include/storage/backendid.h +37 -0
  270. data/ext/pg_query/include/storage/block.h +121 -0
  271. data/ext/pg_query/include/storage/buf.h +46 -0
  272. data/ext/pg_query/include/storage/bufmgr.h +292 -0
  273. data/ext/pg_query/include/storage/bufpage.h +459 -0
  274. data/ext/pg_query/include/storage/condition_variable.h +62 -0
  275. data/ext/pg_query/include/storage/dsm.h +61 -0
  276. data/ext/pg_query/include/storage/dsm_impl.h +75 -0
  277. data/ext/pg_query/include/storage/fd.h +168 -0
  278. data/ext/pg_query/include/storage/ipc.h +81 -0
  279. data/ext/pg_query/include/storage/item.h +19 -0
  280. data/ext/pg_query/include/storage/itemid.h +184 -0
  281. data/ext/pg_query/include/storage/itemptr.h +206 -0
  282. data/ext/pg_query/include/storage/large_object.h +100 -0
  283. data/ext/pg_query/include/storage/latch.h +190 -0
  284. data/ext/pg_query/include/storage/lmgr.h +114 -0
  285. data/ext/pg_query/include/storage/lock.h +612 -0
  286. data/ext/pg_query/include/storage/lockdefs.h +59 -0
  287. data/ext/pg_query/include/storage/lwlock.h +232 -0
  288. data/ext/pg_query/include/storage/lwlocknames.h +51 -0
  289. data/ext/pg_query/include/storage/off.h +57 -0
  290. data/ext/pg_query/include/storage/pg_sema.h +61 -0
  291. data/ext/pg_query/include/storage/pg_shmem.h +90 -0
  292. data/ext/pg_query/include/storage/pmsignal.h +94 -0
  293. data/ext/pg_query/include/storage/predicate.h +87 -0
  294. data/ext/pg_query/include/storage/proc.h +333 -0
  295. data/ext/pg_query/include/storage/proclist_types.h +51 -0
  296. data/ext/pg_query/include/storage/procsignal.h +75 -0
  297. data/ext/pg_query/include/storage/relfilenode.h +99 -0
  298. data/ext/pg_query/include/storage/s_lock.h +1047 -0
  299. data/ext/pg_query/include/storage/sharedfileset.h +45 -0
  300. data/ext/pg_query/include/storage/shm_mq.h +85 -0
  301. data/ext/pg_query/include/storage/shm_toc.h +58 -0
  302. data/ext/pg_query/include/storage/shmem.h +81 -0
  303. data/ext/pg_query/include/storage/sinval.h +153 -0
  304. data/ext/pg_query/include/storage/sinvaladt.h +43 -0
  305. data/ext/pg_query/include/storage/smgr.h +109 -0
  306. data/ext/pg_query/include/storage/spin.h +77 -0
  307. data/ext/pg_query/include/storage/standby.h +91 -0
  308. data/ext/pg_query/include/storage/standbydefs.h +74 -0
  309. data/ext/pg_query/include/storage/sync.h +62 -0
  310. data/ext/pg_query/include/tcop/cmdtag.h +58 -0
  311. data/ext/pg_query/include/tcop/cmdtaglist.h +217 -0
  312. data/ext/pg_query/include/tcop/deparse_utility.h +108 -0
  313. data/ext/pg_query/include/tcop/dest.h +149 -0
  314. data/ext/pg_query/include/tcop/fastpath.h +21 -0
  315. data/ext/pg_query/include/tcop/pquery.h +45 -0
  316. data/ext/pg_query/include/tcop/tcopprot.h +89 -0
  317. data/ext/pg_query/include/tcop/utility.h +108 -0
  318. data/ext/pg_query/include/tsearch/ts_cache.h +98 -0
  319. data/ext/pg_query/include/utils/acl.h +312 -0
  320. data/ext/pg_query/include/utils/aclchk_internal.h +45 -0
  321. data/ext/pg_query/include/utils/array.h +459 -0
  322. data/ext/pg_query/include/utils/builtins.h +127 -0
  323. data/ext/pg_query/include/utils/bytea.h +27 -0
  324. data/ext/pg_query/include/utils/catcache.h +231 -0
  325. data/ext/pg_query/include/utils/date.h +90 -0
  326. data/ext/pg_query/include/utils/datetime.h +343 -0
  327. data/ext/pg_query/include/utils/datum.h +68 -0
  328. data/ext/pg_query/include/utils/dsa.h +123 -0
  329. data/ext/pg_query/include/utils/dynahash.h +19 -0
  330. data/ext/pg_query/include/utils/elog.h +439 -0
  331. data/ext/pg_query/include/utils/errcodes.h +352 -0
  332. data/ext/pg_query/include/utils/expandeddatum.h +159 -0
  333. data/ext/pg_query/include/utils/expandedrecord.h +231 -0
  334. data/ext/pg_query/include/utils/float.h +356 -0
  335. data/ext/pg_query/include/utils/fmgroids.h +2657 -0
  336. data/ext/pg_query/include/utils/fmgrprotos.h +2646 -0
  337. data/ext/pg_query/include/utils/fmgrtab.h +48 -0
  338. data/ext/pg_query/include/utils/guc.h +443 -0
  339. data/ext/pg_query/include/utils/guc_tables.h +272 -0
  340. data/ext/pg_query/include/utils/hsearch.h +149 -0
  341. data/ext/pg_query/include/utils/inval.h +64 -0
  342. data/ext/pg_query/include/utils/lsyscache.h +198 -0
  343. data/ext/pg_query/include/utils/memdebug.h +82 -0
  344. data/ext/pg_query/include/utils/memutils.h +225 -0
  345. data/ext/pg_query/include/utils/numeric.h +76 -0
  346. data/ext/pg_query/include/utils/palloc.h +136 -0
  347. data/ext/pg_query/include/utils/partcache.h +102 -0
  348. data/ext/pg_query/include/utils/pg_locale.h +119 -0
  349. data/ext/pg_query/include/utils/pg_lsn.h +29 -0
  350. data/ext/pg_query/include/utils/pidfile.h +56 -0
  351. data/ext/pg_query/include/utils/plancache.h +235 -0
  352. data/ext/pg_query/include/utils/portal.h +241 -0
  353. data/ext/pg_query/include/utils/probes.h +114 -0
  354. data/ext/pg_query/include/utils/ps_status.h +25 -0
  355. data/ext/pg_query/include/utils/queryenvironment.h +74 -0
  356. data/ext/pg_query/include/utils/regproc.h +28 -0
  357. data/ext/pg_query/include/utils/rel.h +644 -0
  358. data/ext/pg_query/include/utils/relcache.h +151 -0
  359. data/ext/pg_query/include/utils/reltrigger.h +81 -0
  360. data/ext/pg_query/include/utils/resowner.h +86 -0
  361. data/ext/pg_query/include/utils/rls.h +50 -0
  362. data/ext/pg_query/include/utils/ruleutils.h +44 -0
  363. data/ext/pg_query/include/utils/sharedtuplestore.h +61 -0
  364. data/ext/pg_query/include/utils/snapmgr.h +158 -0
  365. data/ext/pg_query/include/utils/snapshot.h +206 -0
  366. data/ext/pg_query/include/utils/sortsupport.h +276 -0
  367. data/ext/pg_query/include/utils/syscache.h +219 -0
  368. data/ext/pg_query/include/utils/timeout.h +88 -0
  369. data/ext/pg_query/include/utils/timestamp.h +116 -0
  370. data/ext/pg_query/include/utils/tuplesort.h +277 -0
  371. data/ext/pg_query/include/utils/tuplestore.h +91 -0
  372. data/ext/pg_query/include/utils/typcache.h +202 -0
  373. data/ext/pg_query/include/utils/tzparser.h +39 -0
  374. data/ext/pg_query/include/utils/varlena.h +39 -0
  375. data/ext/pg_query/include/utils/xml.h +84 -0
  376. data/ext/pg_query/include/xxhash.h +5445 -0
  377. data/ext/pg_query/include/xxhash/xxhash.h +5445 -0
  378. data/ext/pg_query/pg_query.c +104 -0
  379. data/ext/pg_query/pg_query.pb-c.c +37643 -0
  380. data/ext/pg_query/pg_query_deparse.c +9965 -0
  381. data/ext/pg_query/pg_query_fingerprint.c +367 -0
  382. data/ext/pg_query/pg_query_fingerprint.h +8 -0
  383. data/ext/pg_query/pg_query_internal.h +24 -0
  384. data/ext/pg_query/pg_query_json_plpgsql.c +738 -0
  385. data/ext/pg_query/pg_query_json_plpgsql.h +9 -0
  386. data/ext/pg_query/pg_query_normalize.c +491 -0
  387. data/ext/pg_query/pg_query_outfuncs.h +10 -0
  388. data/ext/pg_query/pg_query_outfuncs_json.c +297 -0
  389. data/ext/pg_query/pg_query_outfuncs_protobuf.c +237 -0
  390. data/ext/pg_query/pg_query_parse.c +148 -0
  391. data/ext/pg_query/pg_query_parse_plpgsql.c +460 -0
  392. data/ext/pg_query/pg_query_readfuncs.h +11 -0
  393. data/ext/pg_query/pg_query_readfuncs_protobuf.c +142 -0
  394. data/ext/pg_query/pg_query_ruby.c +108 -12
  395. data/ext/pg_query/pg_query_scan.c +173 -0
  396. data/ext/pg_query/pg_query_split.c +221 -0
  397. data/ext/pg_query/protobuf-c.c +3667 -0
  398. data/ext/pg_query/src_backend_catalog_namespace.c +1051 -0
  399. data/ext/pg_query/src_backend_catalog_pg_proc.c +142 -0
  400. data/ext/pg_query/src_backend_commands_define.c +117 -0
  401. data/ext/pg_query/src_backend_libpq_pqcomm.c +651 -0
  402. data/ext/pg_query/src_backend_nodes_bitmapset.c +513 -0
  403. data/ext/pg_query/src_backend_nodes_copyfuncs.c +6013 -0
  404. data/ext/pg_query/src_backend_nodes_equalfuncs.c +4003 -0
  405. data/ext/pg_query/src_backend_nodes_extensible.c +99 -0
  406. data/ext/pg_query/src_backend_nodes_list.c +922 -0
  407. data/ext/pg_query/src_backend_nodes_makefuncs.c +417 -0
  408. data/ext/pg_query/src_backend_nodes_nodeFuncs.c +1363 -0
  409. data/ext/pg_query/src_backend_nodes_value.c +84 -0
  410. data/ext/pg_query/src_backend_parser_gram.c +47456 -0
  411. data/ext/pg_query/src_backend_parser_parse_expr.c +313 -0
  412. data/ext/pg_query/src_backend_parser_parser.c +497 -0
  413. data/ext/pg_query/src_backend_parser_scan.c +7091 -0
  414. data/ext/pg_query/src_backend_parser_scansup.c +160 -0
  415. data/ext/pg_query/src_backend_postmaster_postmaster.c +2230 -0
  416. data/ext/pg_query/src_backend_storage_ipc_ipc.c +192 -0
  417. data/ext/pg_query/src_backend_storage_lmgr_s_lock.c +370 -0
  418. data/ext/pg_query/src_backend_tcop_postgres.c +776 -0
  419. data/ext/pg_query/src_backend_utils_adt_datum.c +326 -0
  420. data/ext/pg_query/src_backend_utils_adt_expandeddatum.c +98 -0
  421. data/ext/pg_query/src_backend_utils_adt_format_type.c +136 -0
  422. data/ext/pg_query/src_backend_utils_adt_ruleutils.c +1683 -0
  423. data/ext/pg_query/src_backend_utils_error_assert.c +74 -0
  424. data/ext/pg_query/src_backend_utils_error_elog.c +1748 -0
  425. data/ext/pg_query/src_backend_utils_fmgr_fmgr.c +570 -0
  426. data/ext/pg_query/src_backend_utils_hash_dynahash.c +1086 -0
  427. data/ext/pg_query/src_backend_utils_init_globals.c +168 -0
  428. data/ext/pg_query/src_backend_utils_mb_mbutils.c +839 -0
  429. data/ext/pg_query/src_backend_utils_misc_guc.c +1831 -0
  430. data/ext/pg_query/src_backend_utils_mmgr_aset.c +1560 -0
  431. data/ext/pg_query/src_backend_utils_mmgr_mcxt.c +1042 -0
  432. data/ext/pg_query/src_common_encnames.c +158 -0
  433. data/ext/pg_query/src_common_hashfn.c +420 -0
  434. data/ext/pg_query/src_common_keywords.c +39 -0
  435. data/ext/pg_query/src_common_kwlist_d.h +1081 -0
  436. data/ext/pg_query/src_common_kwlookup.c +91 -0
  437. data/ext/pg_query/src_common_psprintf.c +158 -0
  438. data/ext/pg_query/src_common_string.c +86 -0
  439. data/ext/pg_query/src_common_stringinfo.c +336 -0
  440. data/ext/pg_query/src_common_wchar.c +1651 -0
  441. data/ext/pg_query/src_pl_plpgsql_src_pl_comp.c +1133 -0
  442. data/ext/pg_query/src_pl_plpgsql_src_pl_funcs.c +877 -0
  443. data/ext/pg_query/src_pl_plpgsql_src_pl_gram.c +6533 -0
  444. data/ext/pg_query/src_pl_plpgsql_src_pl_handler.c +107 -0
  445. data/ext/pg_query/src_pl_plpgsql_src_pl_reserved_kwlist_d.h +123 -0
  446. data/ext/pg_query/src_pl_plpgsql_src_pl_scanner.c +671 -0
  447. data/ext/pg_query/src_pl_plpgsql_src_pl_unreserved_kwlist_d.h +255 -0
  448. data/ext/pg_query/src_port_erand48.c +127 -0
  449. data/ext/pg_query/src_port_pg_bitutils.c +246 -0
  450. data/ext/pg_query/src_port_pgsleep.c +69 -0
  451. data/ext/pg_query/src_port_pgstrcasecmp.c +83 -0
  452. data/ext/pg_query/src_port_qsort.c +240 -0
  453. data/ext/pg_query/src_port_random.c +31 -0
  454. data/ext/pg_query/src_port_snprintf.c +1449 -0
  455. data/ext/pg_query/src_port_strerror.c +324 -0
  456. data/ext/pg_query/src_port_strnlen.c +39 -0
  457. data/ext/pg_query/xxhash.c +43 -0
  458. data/lib/pg_query.rb +6 -4
  459. data/lib/pg_query/constants.rb +21 -0
  460. data/lib/pg_query/deparse.rb +15 -1673
  461. data/lib/pg_query/filter_columns.rb +88 -85
  462. data/lib/pg_query/fingerprint.rb +120 -87
  463. data/lib/pg_query/node.rb +31 -0
  464. data/lib/pg_query/param_refs.rb +42 -37
  465. data/lib/pg_query/parse.rb +274 -202
  466. data/lib/pg_query/parse_error.rb +1 -1
  467. data/lib/pg_query/pg_query_pb.rb +3213 -0
  468. data/lib/pg_query/scan.rb +23 -0
  469. data/lib/pg_query/treewalker.rb +24 -40
  470. data/lib/pg_query/truncate.rb +71 -42
  471. data/lib/pg_query/version.rb +2 -2
  472. metadata +472 -11
  473. data/ext/pg_query/pg_query_ruby.h +0 -10
  474. data/lib/pg_query/deep_dup.rb +0 -16
  475. data/lib/pg_query/deparse/alter_table.rb +0 -42
  476. data/lib/pg_query/deparse/interval.rb +0 -105
  477. data/lib/pg_query/deparse/keywords.rb +0 -159
  478. data/lib/pg_query/deparse/rename.rb +0 -41
  479. data/lib/pg_query/legacy_parsetree.rb +0 -109
  480. data/lib/pg_query/node_types.rb +0 -297
@@ -1,107 +1,110 @@
1
- class PgQuery
2
- # Returns a list of columns that the query filters by - this excludes the
3
- # target list, but includes things like JOIN condition and WHERE clause.
4
- #
5
- # Note: This also traverses into sub-selects.
6
- def filter_columns # rubocop:disable Metrics/CyclomaticComplexity
7
- load_tables_and_aliases! if @aliases.nil?
1
+ module PgQuery
2
+ class ParserResult
3
+ # Returns a list of columns that the query filters by - this excludes the
4
+ # target list, but includes things like JOIN condition and WHERE clause.
5
+ #
6
+ # Note: This also traverses into sub-selects.
7
+ def filter_columns # rubocop:disable Metrics/CyclomaticComplexity
8
+ load_objects! if @aliases.nil?
8
9
 
9
- # Get condition items from the parsetree
10
- statements = @tree.dup
11
- condition_items = []
12
- filter_columns = []
13
- loop do
14
- statement = statements.shift
15
- if statement
16
- if statement[RAW_STMT]
17
- statements << statement[RAW_STMT][STMT_FIELD]
18
- elsif statement[SELECT_STMT]
19
- case statement[SELECT_STMT]['op']
20
- when 0
21
- if statement[SELECT_STMT][FROM_CLAUSE_FIELD]
22
- # FROM subselects
23
- statement[SELECT_STMT][FROM_CLAUSE_FIELD].each do |item|
24
- next unless item['RangeSubselect']
25
- statements << item['RangeSubselect']['subquery']
26
- end
10
+ # Get condition items from the parsetree
11
+ statements = @tree.stmts.dup.to_a.map(&:stmt)
12
+ condition_items = []
13
+ filter_columns = []
14
+ loop do
15
+ statement = statements.shift
16
+ if statement
17
+ case statement.node
18
+ when :list
19
+ statements += statement.list.items
20
+ when :raw_stmt
21
+ statements << statement.raw_stmt.stmt
22
+ when :select_stmt
23
+ case statement.select_stmt.op
24
+ when :SETOP_NONE
25
+ if statement.select_stmt.from_clause
26
+ # FROM subselects
27
+ statement.select_stmt.from_clause.each do |item|
28
+ next unless item['RangeSubselect']
29
+ statements << item['RangeSubselect']['subquery']
30
+ end
27
31
 
28
- # JOIN ON conditions
29
- condition_items += conditions_from_join_clauses(statement[SELECT_STMT][FROM_CLAUSE_FIELD])
30
- end
32
+ # JOIN ON conditions
33
+ condition_items += conditions_from_join_clauses(statement.select_stmt.from_clause)
34
+ end
31
35
 
32
- # WHERE clause
33
- condition_items << statement[SELECT_STMT]['whereClause'] if statement[SELECT_STMT]['whereClause']
36
+ # WHERE clause
37
+ condition_items << statement.select_stmt.where_clause if statement.select_stmt.where_clause
34
38
 
35
- # CTEs
36
- if statement[SELECT_STMT]['withClause']
37
- statement[SELECT_STMT]['withClause']['WithClause']['ctes'].each do |item|
38
- statements << item['CommonTableExpr']['ctequery'] if item['CommonTableExpr']
39
+ # CTEs
40
+ if statement.select_stmt.with_clause
41
+ statement.select_stmt.with_clause.ctes.each do |item|
42
+ statements << item.common_table_expr.ctequery if item.node == :common_table_expr
43
+ end
39
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
40
48
  end
41
- when 1
42
- statements << statement[SELECT_STMT]['larg'] if statement[SELECT_STMT]['larg']
43
- statements << statement[SELECT_STMT]['rarg'] if statement[SELECT_STMT]['rarg']
49
+ when :update_stmt
50
+ condition_items << statement.update_stmt.where_clause if statement.update_stmt.where_clause
51
+ when :delete_stmt
52
+ condition_items << statement.delete_stmt.where_clause if statement.delete_stmt.where_clause
44
53
  end
45
- elsif statement['UpdateStmt']
46
- condition_items << statement['UpdateStmt']['whereClause'] if statement['UpdateStmt']['whereClause']
47
- elsif statement['DeleteStmt']
48
- condition_items << statement['DeleteStmt']['whereClause'] if statement['DeleteStmt']['whereClause']
49
54
  end
50
- end
51
55
 
52
- # Process both JOIN and WHERE conditions here
53
- next_item = condition_items.shift
54
- if next_item
55
- if next_item[A_EXPR]
56
- %w[lexpr rexpr].each do |side|
57
- expr = next_item.values[0][side]
58
- next unless expr && expr.is_a?(Hash)
59
- condition_items << expr
56
+ # Process both JOIN and WHERE conditions here
57
+ next_item = condition_items.shift
58
+ if next_item
59
+ case next_item.node
60
+ when :a_expr
61
+ condition_items << next_item.a_expr.lexpr if next_item.a_expr.lexpr
62
+ condition_items << next_item.a_expr.rexpr if next_item.a_expr.rexpr
63
+ when :bool_expr
64
+ condition_items += next_item.bool_expr.args
65
+ when :coalesce_expr
66
+ condition_items += next_item.coalesce_expr.args
67
+ when :row_expr
68
+ condition_items += next_item.row_expr.args
69
+ when :column_ref
70
+ column, table = next_item.column_ref.fields.map { |f| f.string.str }.reverse
71
+ filter_columns << [@aliases[table] || table, column]
72
+ when :null_test
73
+ condition_items << next_item.null_test.arg
74
+ when :boolean_test
75
+ condition_items << next_item.boolean_test.arg
76
+ when :func_call
77
+ # FIXME: This should actually be extracted as a funccall and be compared with those indices
78
+ condition_items += next_item.func_call.args if next_item.func_call.args
79
+ when :sub_link
80
+ condition_items << next_item.sub_link.testexpr
81
+ statements << next_item.sub_link.subselect
60
82
  end
61
- elsif next_item[BOOL_EXPR]
62
- condition_items += next_item[BOOL_EXPR]['args']
63
- elsif next_item[ROW_EXPR]
64
- condition_items += next_item[ROW_EXPR]['args']
65
- elsif next_item[COLUMN_REF]
66
- column, table = next_item[COLUMN_REF]['fields'].map { |f| f['String']['str'] }.reverse
67
- filter_columns << [@aliases[table] || table, column]
68
- elsif next_item[NULL_TEST]
69
- condition_items << next_item[NULL_TEST]['arg']
70
- elsif next_item[BOOLEAN_TEST]
71
- condition_items << next_item[BOOLEAN_TEST]['arg']
72
- elsif next_item[FUNC_CALL]
73
- # FIXME: This should actually be extracted as a funccall and be compared with those indices
74
- condition_items += next_item[FUNC_CALL]['args'] if next_item[FUNC_CALL]['args']
75
- elsif next_item[SUB_LINK]
76
- condition_items << next_item[SUB_LINK]['testexpr']
77
- statements << next_item[SUB_LINK]['subselect']
78
83
  end
84
+
85
+ break if statements.empty? && condition_items.empty?
79
86
  end
80
87
 
81
- break if statements.empty? && condition_items.empty?
88
+ filter_columns.uniq
82
89
  end
83
90
 
84
- filter_columns.uniq
85
- end
86
-
87
- protected
91
+ protected
88
92
 
89
- def conditions_from_join_clauses(from_clause)
90
- condition_items = []
91
- from_clause.each do |item|
92
- next unless item[JOIN_EXPR]
93
+ def conditions_from_join_clauses(from_clause)
94
+ condition_items = []
95
+ from_clause.each do |item|
96
+ next unless item.node == :join_expr
93
97
 
94
- joinexpr_items = [item[JOIN_EXPR]]
95
- loop do
96
- next_item = joinexpr_items.shift
97
- break unless next_item
98
- condition_items << next_item['quals'] if next_item['quals']
99
- %w[larg rarg].each do |side|
100
- next unless next_item[side][JOIN_EXPR]
101
- joinexpr_items << next_item[side][JOIN_EXPR]
98
+ joinexpr_items = [item.join_expr]
99
+ loop do
100
+ next_item = joinexpr_items.shift
101
+ break unless next_item
102
+ condition_items << next_item.quals if next_item.quals
103
+ joinexpr_items << next_item.larg.join_expr if next_item.larg.node == :join_expr
104
+ joinexpr_items << next_item.rarg.join_expr if next_item.rarg.node == :join_expr
102
105
  end
103
106
  end
107
+ condition_items
104
108
  end
105
- condition_items
106
109
  end
107
110
  end
@@ -1,115 +1,148 @@
1
1
  require 'digest'
2
2
 
3
- class PgQuery
4
- def fingerprint
5
- hash = Digest::SHA1.new
6
- fingerprint_tree(hash)
7
- format('%02x', FINGERPRINT_VERSION) + hash.hexdigest
8
- end
3
+ module PgQuery
4
+ class ParserResult
5
+ def fingerprint
6
+ hash = FingerprintSubHash.new
7
+ fingerprint_tree(hash)
8
+ fp = PgQuery.hash_xxh3_64(hash.parts.join, FINGERPRINT_VERSION)
9
+ format('%016x', fp)
10
+ end
9
11
 
10
- private
12
+ private
11
13
 
12
- FINGERPRINT_VERSION = 2
14
+ FINGERPRINT_VERSION = 3
13
15
 
14
- class FingerprintSubHash
15
- attr_reader :parts
16
+ class FingerprintSubHash
17
+ attr_reader :parts
16
18
 
17
- def initialize
18
- @parts = []
19
- end
19
+ def initialize
20
+ @parts = []
21
+ end
20
22
 
21
- def update(part)
22
- @parts << part
23
- end
23
+ def update(part)
24
+ @parts << part
25
+ end
24
26
 
25
- def flush_to(hash)
26
- parts.each do |part|
27
- hash.update part
27
+ def flush_to(hash)
28
+ parts.each do |part|
29
+ hash.update part
30
+ end
28
31
  end
29
32
  end
30
- end
31
33
 
32
- def ignored_fingerprint_value?(val)
33
- [nil, 0, false, [], ''].include?(val)
34
- end
34
+ def ignored_fingerprint_value?(val)
35
+ [nil, 0, false, [], ''].include?(val)
36
+ end
35
37
 
36
- def fingerprint_value(val, hash, parent_node_name, parent_field_name, need_to_write_name)
37
- return if ignored_fingerprint_value?(val)
38
+ def fingerprint_value(val, hash, parent_node_name, parent_field_name, need_to_write_name) # rubocop:disable Metrics/CyclomaticComplexity
39
+ subhash = FingerprintSubHash.new
40
+
41
+ if val.is_a?(Google::Protobuf::RepeatedField)
42
+ fingerprint_list(val, subhash, parent_node_name, parent_field_name)
43
+ elsif val.is_a?(List)
44
+ fingerprint_list(val.items, subhash, parent_node_name, parent_field_name)
45
+ elsif val.is_a?(Google::Protobuf::MessageExts)
46
+ fingerprint_node(val, subhash, parent_node_name, parent_field_name)
47
+ elsif !ignored_fingerprint_value?(val)
48
+ subhash.update val.to_s
49
+ end
38
50
 
39
- subhash = FingerprintSubHash.new
51
+ return if subhash.parts.empty?
40
52
 
41
- if val.is_a?(Hash)
42
- fingerprint_node(val, subhash, parent_node_name, parent_field_name)
43
- elsif val.is_a?(Array)
44
- fingerprint_list(val, subhash, parent_node_name, parent_field_name)
45
- else
46
- subhash.update val.to_s
53
+ hash.update(parent_field_name) if need_to_write_name
54
+ subhash.flush_to(hash)
47
55
  end
48
56
 
49
- return if subhash.parts.empty?
50
-
51
- hash.update(parent_field_name) if need_to_write_name
52
- subhash.flush_to(hash)
53
- end
54
-
55
- def fingerprint_node(node, hash, parent_node_name = nil, parent_field_name = nil) # rubocop:disable Metrics/CyclomaticComplexity
56
- node_name = node.keys.first
57
- return if [A_CONST, ALIAS, PARAM_REF, SET_TO_DEFAULT, INT_LIST, OID_LIST, NULL].include?(node_name)
58
-
59
- hash.update node_name
60
-
61
- fields = node.values.first
62
- fields.sort_by { |k, _| k }.each do |field_name, val|
63
- next if ignored_fingerprint_value?(val)
64
-
65
- case field_name
66
- when 'location'
67
- next
68
- when 'name'
69
- next if node_name == RES_TARGET && parent_node_name == SELECT_STMT && parent_field_name == TARGET_LIST_FIELD
70
- next if [PREPARE_STMT, EXECUTE_STMT, DEALLOCATE_STMT].include?(node_name)
71
- when 'gid'
72
- next if node_name == TRANSACTION_STMT
73
- when 'options'
74
- next if node_name == TRANSACTION_STMT
75
- when 'portalname'
76
- next if [DECLARE_CURSOR_STMT, FETCH_STMT, CLOSE_PORTAL_STMT].include?(node_name)
77
- when 'relname'
78
- next if node_name == RANGE_VAR && fields[RELPERSISTENCE_FIELD] == 't'
79
- when 'stmt_len'
80
- next if node_name == RAW_STMT
81
- when 'stmt_location'
82
- next if node_name == RAW_STMT
83
- end
57
+ def ignored_node_type?(node)
58
+ [A_Const, Alias, ParamRef, SetToDefault, IntList, OidList, Null].include?(node.class) ||
59
+ node.is_a?(TypeCast) && (node.arg.node == :a_const || node.arg.node == :param_ref)
60
+ end
84
61
 
85
- fingerprint_value(val, hash, node_name, field_name, true)
62
+ def node_protobuf_field_name_to_json_name(node_class, field)
63
+ node_class.descriptor.find { |d| d.name == field.to_s }.json_name
86
64
  end
87
- end
88
65
 
89
- def fingerprint_list(values, hash, parent_node_name, parent_field_name)
90
- if [FROM_CLAUSE_FIELD, TARGET_LIST_FIELD, COLS_FIELD, REXPR_FIELD, VALUES_LISTS_FIELD].include?(parent_field_name)
91
- values_subhashes = values.map do |val|
92
- subhash = FingerprintSubHash.new
93
- fingerprint_value(val, subhash, parent_node_name, parent_field_name, false)
94
- subhash
66
+ def fingerprint_node(node, hash, parent_node_name = nil, parent_field_name = nil) # rubocop:disable Metrics/CyclomaticComplexity
67
+ return if ignored_node_type?(node)
68
+
69
+ if node.is_a?(Node)
70
+ return if node.node.nil?
71
+ node_val = node[node.node.to_s]
72
+ unless ignored_node_type?(node_val)
73
+ unless node_val.is_a?(List)
74
+ postgres_node_name = node_protobuf_field_name_to_json_name(node.class, node.node)
75
+ hash.update(postgres_node_name)
76
+ end
77
+ fingerprint_value(node_val, hash, parent_node_name, parent_field_name, false)
78
+ end
79
+ return
95
80
  end
96
81
 
97
- values_subhashes.uniq!(&:parts)
98
- values_subhashes.sort_by!(&:parts)
99
-
100
- values_subhashes.each do |subhash|
101
- subhash.flush_to(hash)
82
+ postgres_node_name = node.class.name.split('::').last
83
+
84
+ node.to_h.keys.sort.each do |field_name|
85
+ val = node[field_name.to_s]
86
+
87
+ postgres_field_name = node_protobuf_field_name_to_json_name(node.class, field_name)
88
+
89
+ case postgres_field_name
90
+ when 'location'
91
+ next
92
+ when 'name'
93
+ next if [PrepareStmt, ExecuteStmt, DeallocateStmt].include?(node.class)
94
+ next if node.is_a?(ResTarget) && parent_node_name == 'SelectStmt' && parent_field_name == 'targetList'
95
+ when 'gid', 'options', 'savepoint_name'
96
+ next if node.is_a?(TransactionStmt)
97
+ when 'portalname'
98
+ next if [DeclareCursorStmt, FetchStmt, ClosePortalStmt].include?(node.class)
99
+ when 'relname'
100
+ next if node.is_a?(RangeVar) && node.relpersistence == 't'
101
+ if node.is_a?(RangeVar)
102
+ fingerprint_value(val.gsub(/\d{2,}/, ''), hash, postgres_node_name, postgres_field_name, true)
103
+ next
104
+ end
105
+ when 'stmt_len'
106
+ next if node.is_a?(RawStmt)
107
+ when 'stmt_location'
108
+ next if node.is_a?(RawStmt)
109
+ when 'kind'
110
+ if node.is_a?(A_Expr) && (val == :AEXPR_OP_ANY || val == :AEXPR_IN)
111
+ fingerprint_value(:AEXPR_OP, hash, postgres_node_name, postgres_field_name, true)
112
+ next
113
+ end
114
+ end
115
+
116
+ fingerprint_value(val, hash, postgres_node_name, postgres_field_name, true)
102
117
  end
103
- else
104
- values.each do |val|
105
- fingerprint_value(val, hash, parent_node_name, parent_field_name, false)
118
+ end
119
+
120
+ def fingerprint_list(values, hash, parent_node_name, parent_field_name)
121
+ if %w[fromClause targetList cols rexpr valuesLists args].include?(parent_field_name)
122
+ values_subhashes = values.map do |val|
123
+ subhash = FingerprintSubHash.new
124
+ fingerprint_value(val, subhash, parent_node_name, parent_field_name, false)
125
+ subhash
126
+ end
127
+
128
+ values_subhashes.uniq!(&:parts)
129
+ values_subhashes.sort_by! { |s| PgQuery.hash_xxh3_64(s.parts.join, FINGERPRINT_VERSION) }
130
+
131
+ values_subhashes.each do |subhash|
132
+ subhash.flush_to(hash)
133
+ end
134
+ else
135
+ values.each do |val|
136
+ fingerprint_value(val, hash, parent_node_name, parent_field_name, false)
137
+ end
106
138
  end
107
139
  end
108
- end
109
140
 
110
- def fingerprint_tree(hash)
111
- @tree.each do |node|
112
- fingerprint_node(node, hash)
141
+ def fingerprint_tree(hash)
142
+ @tree.stmts.each do |node|
143
+ hash.update 'RawStmt'
144
+ fingerprint_node(node, hash)
145
+ end
113
146
  end
114
147
  end
115
148
  end
@@ -0,0 +1,31 @@
1
+ module PgQuery
2
+ # Patch the auto-generated generic node type with additional convenience functions
3
+ class Node
4
+ def inspect
5
+ node ? format('<PgQuery::Node: %s: %s>', node, public_send(node).inspect) : '<PgQuery::Node>'
6
+ end
7
+
8
+ # Make it easier to initialize nodes from a given node child object
9
+ def self.from(node_field_val)
10
+ # This needs to match libpg_query naming for the Node message field names
11
+ # (see "underscore" method in libpg_query's scripts/generate_protobuf_and_funcs.rb)
12
+ node_field_name = node_field_val.class.name.split('::').last
13
+ node_field_name.gsub!(/^([A-Z\d])([A-Z][a-z])/, '\1__\2')
14
+ node_field_name.gsub!(/([A-Z\d]+[a-z]+)([A-Z][a-z])/, '\1_\2')
15
+ node_field_name.gsub!(/([a-z\d])([A-Z])/, '\1_\2')
16
+ node_field_name.tr!('-', '_')
17
+ node_field_name.downcase!
18
+
19
+ PgQuery::Node.new(node_field_name => node_field_val)
20
+ end
21
+
22
+ # Make it easier to initialize value nodes
23
+ def self.from_string(str)
24
+ PgQuery::Node.new(string: PgQuery::String.new(str: str))
25
+ end
26
+
27
+ def self.from_integer(ival)
28
+ PgQuery::Node.new(integer: PgQuery::Integer.new(ival: ival))
29
+ end
30
+ end
31
+ end