gitlab-pg_query 1.3.1 → 2.0.4

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 +217 -99
  3. data/README.md +92 -69
  4. data/Rakefile +85 -5
  5. data/ext/pg_query/extconf.rb +3 -40
  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 +1322 -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 +614 -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 +2520 -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 +249 -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 +350 -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 +2437 -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 +2878 -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 +1106 -0
  252. data/ext/pg_query/include/protobuf-c/protobuf-c.h +1106 -0
  253. data/ext/pg_query/include/protobuf/pg_query.pb-c.h +10846 -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 +458 -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 +197 -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 +37628 -0
  380. data/ext/pg_query/pg_query_deparse.c +9959 -0
  381. data/ext/pg_query/pg_query_fingerprint.c +295 -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 +439 -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 +3660 -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 +1006 -0
  432. data/ext/pg_query/src_common_encnames.c +158 -0
  433. data/ext/pg_query/src_common_keywords.c +39 -0
  434. data/ext/pg_query/src_common_kwlist_d.h +1081 -0
  435. data/ext/pg_query/src_common_kwlookup.c +91 -0
  436. data/ext/pg_query/src_common_psprintf.c +158 -0
  437. data/ext/pg_query/src_common_string.c +86 -0
  438. data/ext/pg_query/src_common_stringinfo.c +336 -0
  439. data/ext/pg_query/src_common_wchar.c +1651 -0
  440. data/ext/pg_query/src_pl_plpgsql_src_pl_comp.c +1133 -0
  441. data/ext/pg_query/src_pl_plpgsql_src_pl_funcs.c +877 -0
  442. data/ext/pg_query/src_pl_plpgsql_src_pl_gram.c +6533 -0
  443. data/ext/pg_query/src_pl_plpgsql_src_pl_handler.c +107 -0
  444. data/ext/pg_query/src_pl_plpgsql_src_pl_reserved_kwlist_d.h +123 -0
  445. data/ext/pg_query/src_pl_plpgsql_src_pl_scanner.c +671 -0
  446. data/ext/pg_query/src_pl_plpgsql_src_pl_unreserved_kwlist_d.h +255 -0
  447. data/ext/pg_query/src_port_erand48.c +127 -0
  448. data/ext/pg_query/src_port_pg_bitutils.c +246 -0
  449. data/ext/pg_query/src_port_pgsleep.c +69 -0
  450. data/ext/pg_query/src_port_pgstrcasecmp.c +83 -0
  451. data/ext/pg_query/src_port_qsort.c +240 -0
  452. data/ext/pg_query/src_port_random.c +31 -0
  453. data/ext/pg_query/src_port_snprintf.c +1449 -0
  454. data/ext/pg_query/src_port_strerror.c +324 -0
  455. data/ext/pg_query/src_port_strnlen.c +39 -0
  456. data/ext/pg_query/xxhash.c +43 -0
  457. data/lib/pg_query.rb +7 -4
  458. data/lib/pg_query/constants.rb +21 -0
  459. data/lib/pg_query/deparse.rb +15 -1581
  460. data/lib/pg_query/filter_columns.rb +88 -85
  461. data/lib/pg_query/fingerprint.rb +122 -87
  462. data/lib/pg_query/json_field_names.rb +1402 -0
  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 +220 -203
  466. data/lib/pg_query/parse_error.rb +1 -1
  467. data/lib/pg_query/pg_query_pb.rb +3211 -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 -296
@@ -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
@@ -1,45 +1,50 @@
1
- class PgQuery
2
- def param_refs # rubocop:disable Metrics/CyclomaticComplexity
3
- results = []
4
-
5
- treewalker! @tree do |_, _, v|
6
- next unless v.is_a?(Hash)
7
-
8
- if v[PARAM_REF]
9
- results << { 'location' => v[PARAM_REF]['location'],
10
- 'length' => param_ref_length(v[PARAM_REF]) }
11
- elsif v[TYPE_CAST]
12
- next unless v[TYPE_CAST]['arg'] && v[TYPE_CAST]['typeName']
13
-
14
- p = v[TYPE_CAST]['arg'].delete(PARAM_REF)
15
- t = v[TYPE_CAST]['typeName'].delete(TYPE_NAME)
16
- next unless p && t
17
-
18
- location = p['location']
19
- typeloc = t['location']
20
- typename = t['names']
21
- length = param_ref_length(p)
22
-
23
- if typeloc < location
24
- length += location - typeloc
25
- location = typeloc
1
+ module PgQuery
2
+ class ParserResult
3
+ def param_refs # rubocop:disable Metrics/CyclomaticComplexity
4
+ results = []
5
+
6
+ treewalker! @tree do |_, _, node, location|
7
+ case node
8
+ when PgQuery::ParamRef
9
+ # Ignore param refs inside type casts, as these are already handled
10
+ next if location[-3..-1] == %i[type_cast arg param_ref]
11
+
12
+ results << { 'location' => node.location,
13
+ 'length' => param_ref_length(node) }
14
+ when PgQuery::TypeCast
15
+ next unless node.arg && node.type_name
16
+
17
+ p = node.arg.param_ref
18
+ t = node.type_name
19
+ next unless p && t
20
+
21
+ location = p.location
22
+ typeloc = t.location
23
+ length = param_ref_length(p)
24
+
25
+ if location == -1
26
+ location = typeloc
27
+ elsif typeloc < location
28
+ length += location - typeloc
29
+ location = typeloc
30
+ end
31
+
32
+ results << { 'location' => location, 'length' => length, 'typename' => t.names.map { |n| n.string.str } }
26
33
  end
27
-
28
- results << { 'location' => location, 'length' => length, 'typename' => typename }
29
34
  end
30
- end
31
35
 
32
- results.sort_by! { |r| r['location'] }
33
- results
34
- end
36
+ results.sort_by! { |r| r['location'] }
37
+ results
38
+ end
35
39
 
36
- private
40
+ private
37
41
 
38
- def param_ref_length(paramref_node)
39
- if paramref_node['number'] == 0 # rubocop:disable Style/NumericPredicate
40
- 1 # Actually a ? replacement character
41
- else
42
- ('$' + paramref_node['number'].to_s).size
42
+ def param_ref_length(paramref_node)
43
+ if paramref_node.number == 0 # rubocop:disable Style/NumericPredicate
44
+ 1 # Actually a ? replacement character
45
+ else
46
+ ('$' + paramref_node.number.to_s).size
47
+ end
43
48
  end
44
49
  end
45
50
  end
@@ -1,13 +1,11 @@
1
- require 'json'
2
-
3
- class PgQuery
1
+ module PgQuery
4
2
  def self.parse(query)
5
- tree, stderr = _raw_parse(query)
3
+ result, stderr = parse_protobuf(query)
6
4
 
7
5
  begin
8
- tree = JSON.parse(tree, max_nesting: 1000)
9
- rescue JSON::ParserError
10
- raise ParseError.new('Failed to parse JSON', __FILE__, __LINE__, -1)
6
+ result = PgQuery::ParseResult.decode(result)
7
+ rescue Google::Protobuf::ParseError => e
8
+ raise PgQuery::ParseError.new(format('Failed to parse tree: %s', e.message), __FILE__, __LINE__, -1)
11
9
  end
12
10
 
13
11
  warnings = []
@@ -16,232 +14,251 @@ class PgQuery
16
14
  warnings << line.strip
17
15
  end
18
16
 
19
- PgQuery.new(query, tree, warnings)
17
+ PgQuery::ParserResult.new(query, result, warnings)
20
18
  end
21
19
 
22
- attr_reader :query
23
- attr_reader :tree
24
- attr_reader :warnings
25
-
26
- def initialize(query, tree, warnings = [])
27
- @query = query
28
- @tree = tree
29
- @warnings = warnings
30
- @tables = nil
31
- @aliases = nil
32
- @cte_names = nil
33
- end
20
+ class ParserResult
21
+ attr_reader :query
22
+ attr_reader :tree
23
+ attr_reader :warnings
34
24
 
35
- def tables
36
- tables_with_types.map { |t| t[:table] }
37
- end
25
+ def initialize(query, tree, warnings = [])
26
+ @query = query
27
+ @tree = tree
28
+ @warnings = warnings
29
+ @tables = nil
30
+ @aliases = nil
31
+ @cte_names = nil
32
+ end
38
33
 
39
- def select_tables
40
- tables_with_types.select { |t| t[:type] == :select }.map { |t| t[:table] }
41
- end
34
+ def dup_tree
35
+ ParseResult.decode(ParseResult.encode(@tree))
36
+ end
42
37
 
43
- def dml_tables
44
- tables_with_types.select { |t| t[:type] == :dml }.map { |t| t[:table] }
45
- end
38
+ def tables
39
+ tables_with_details.map { |t| t[:name] }.uniq
40
+ end
46
41
 
47
- def ddl_tables
48
- tables_with_types.select { |t| t[:type] == :ddl }.map { |t| t[:table] }
49
- end
42
+ def select_tables
43
+ tables_with_details.select { |t| t[:type] == :select }.map { |t| t[:name] }.uniq
44
+ end
50
45
 
51
- def cte_names
52
- load_tables_and_aliases! if @cte_names.nil?
53
- @cte_names
54
- end
46
+ def dml_tables
47
+ tables_with_details.select { |t| t[:type] == :dml }.map { |t| t[:name] }.uniq
48
+ end
55
49
 
56
- def aliases
57
- load_tables_and_aliases! if @aliases.nil?
58
- @aliases
59
- end
50
+ def ddl_tables
51
+ tables_with_details.select { |t| t[:type] == :ddl }.map { |t| t[:name] }.uniq
52
+ end
60
53
 
61
- def tables_with_types
62
- load_tables_and_aliases! if @tables.nil?
63
- @tables
64
- end
54
+ def cte_names
55
+ load_tables_and_aliases! if @cte_names.nil?
56
+ @cte_names
57
+ end
65
58
 
66
- protected
67
-
68
- def load_tables_and_aliases! # rubocop:disable Metrics/CyclomaticComplexity
69
- @tables = [] # types: select, dml, ddl
70
- @cte_names = []
71
- @aliases = {}
72
-
73
- statements = @tree.dup
74
- from_clause_items = [] # types: select, dml, ddl
75
- subselect_items = []
76
-
77
- loop do
78
- statement = statements.shift
79
- if statement
80
- case statement.keys[0]
81
- when RAW_STMT
82
- statements << statement[RAW_STMT][STMT_FIELD]
83
- # The following statement types do not modify tables and are added to from_clause_items
84
- # (and subsequently @tables)
85
- when SELECT_STMT
86
- case statement[SELECT_STMT]['op']
87
- when 0
88
- (statement[SELECT_STMT][FROM_CLAUSE_FIELD] || []).each do |item|
89
- if item[RANGE_SUBSELECT]
90
- statements << item[RANGE_SUBSELECT]['subquery']
91
- else
92
- from_clause_items << { item: item, type: :select }
59
+ def aliases
60
+ load_tables_and_aliases! if @aliases.nil?
61
+ @aliases
62
+ end
63
+
64
+ def tables_with_details
65
+ load_tables_and_aliases! if @tables.nil?
66
+ @tables
67
+ end
68
+
69
+ protected
70
+
71
+ def load_tables_and_aliases! # rubocop:disable Metrics/CyclomaticComplexity
72
+ @tables = [] # types: select, dml, ddl
73
+ @cte_names = []
74
+ @aliases = {}
75
+
76
+ statements = @tree.stmts.dup.to_a.map(&:stmt)
77
+ from_clause_items = [] # types: select, dml, ddl
78
+ subselect_items = []
79
+
80
+ loop do
81
+ statement = statements.shift
82
+ if statement
83
+ case statement.node
84
+ when :list
85
+ statements += statement.list.items
86
+ # The following statement types do not modify tables and are added to from_clause_items
87
+ # (and subsequently @tables)
88
+ when :select_stmt
89
+ subselect_items.concat(statement.select_stmt.target_list)
90
+ subselect_items << statement.select_stmt.where_clause if statement.select_stmt.where_clause
91
+ subselect_items.concat(statement.select_stmt.sort_clause.collect { |h| h.sort_by.node })
92
+ subselect_items.concat(statement.select_stmt.group_clause)
93
+ subselect_items << statement.select_stmt.having_clause if statement.select_stmt.having_clause
94
+
95
+ case statement.select_stmt.op
96
+ when :SETOP_NONE
97
+ (statement.select_stmt.from_clause || []).each do |item|
98
+ if item.node == :range_subselect
99
+ statements << item.range_subselect.subquery
100
+ else
101
+ from_clause_items << { item: item, type: :select }
102
+ end
93
103
  end
104
+ when :SETOP_UNION
105
+ statements << PgQuery::Node.new(select_stmt: statement.select_stmt.larg) if statement.select_stmt.larg
106
+ statements << PgQuery::Node.new(select_stmt: statement.select_stmt.rarg) if statement.select_stmt.rarg
94
107
  end
95
- when 1
96
- statements << statement[SELECT_STMT]['larg'] if statement[SELECT_STMT]['larg']
97
- statements << statement[SELECT_STMT]['rarg'] if statement[SELECT_STMT]['rarg']
98
- end
99
108
 
100
- if (with_clause = statement[SELECT_STMT]['withClause'])
101
- cte_statements, cte_names = statements_and_cte_names_for_with_clause(with_clause)
102
- @cte_names.concat(cte_names)
103
- statements.concat(cte_statements)
104
- end
105
- # The following statements modify the contents of a table
106
- when INSERT_STMT, UPDATE_STMT, DELETE_STMT
107
- value = statement.values[0]
108
- from_clause_items << { item: value['relation'], type: :dml }
109
- statements << value['selectStmt'] if value.key?('selectStmt')
110
- statements << value['withClause'] if value.key?('withClause')
111
-
112
- if (with_clause = value['withClause'])
113
- cte_statements, cte_names = statements_and_cte_names_for_with_clause(with_clause)
114
- @cte_names.concat(cte_names)
115
- statements.concat(cte_statements)
116
- end
117
- when COPY_STMT
118
- from_clause_items << { item: statement.values[0]['relation'], type: :dml } if statement.values[0]['relation']
119
- statements << statement.values[0]['query']
120
- # The following statement types are DDL (changing table structure)
121
- when ALTER_TABLE_STMT, CREATE_STMT
122
- from_clause_items << { item: statement.values[0]['relation'], type: :ddl }
123
- when CREATE_TABLE_AS_STMT
124
- if statement[CREATE_TABLE_AS_STMT]['into'] && statement[CREATE_TABLE_AS_STMT]['into'][INTO_CLAUSE]['rel']
125
- from_clause_items << { item: statement[CREATE_TABLE_AS_STMT]['into'][INTO_CLAUSE]['rel'], type: :ddl }
126
- end
127
- if statement[CREATE_TABLE_AS_STMT]['query']
128
- statements << statement[CREATE_TABLE_AS_STMT]['query']
129
- end
130
- when TRUNCATE_STMT
131
- from_clause_items += statement.values[0]['relations'].map { |r| { item: r, type: :ddl } }
132
- when VIEW_STMT
133
- from_clause_items << { item: statement[VIEW_STMT]['view'], type: :ddl }
134
- statements << statement[VIEW_STMT]['query']
135
- when VACUUM_STMT, INDEX_STMT, CREATE_TRIG_STMT, RULE_STMT
136
- from_clause_items << { item: statement.values[0]['relation'], type: :ddl }
137
- when REFRESH_MAT_VIEW_STMT
138
- from_clause_items << { item: statement[REFRESH_MAT_VIEW_STMT]['relation'], type: :ddl }
139
- when DROP_STMT
140
- objects = statement[DROP_STMT]['objects'].map do |obj|
141
- if obj.is_a?(Array)
142
- obj.map { |obj2| obj2['String'] && obj2['String']['str'] }
143
- else
144
- obj['String'] && obj['String']['str']
109
+ if statement.select_stmt.with_clause
110
+ cte_statements, cte_names = statements_and_cte_names_for_with_clause(statement.select_stmt.with_clause)
111
+ @cte_names.concat(cte_names)
112
+ statements.concat(cte_statements)
145
113
  end
146
- end
147
- case statement[DROP_STMT]['removeType']
148
- when OBJECT_TYPE_TABLE
149
- @tables += objects.map { |r| { table: r.join('.'), type: :ddl } }
150
- when OBJECT_TYPE_RULE, OBJECT_TYPE_TRIGGER
151
- @tables += objects.map { |r| { table: r[0..-2].join('.'), type: :ddl } }
152
- end
153
- when GRANT_STMT
154
- objects = statement[GRANT_STMT]['objects']
155
- case statement[GRANT_STMT]['objtype']
156
- when 0 # Column # rubocop:disable Lint/EmptyWhen
157
- # FIXME
158
- when 1 # Table
159
- from_clause_items += objects.map { |o| { item: o, type: :ddl } }
160
- when 2 # Sequence # rubocop:disable Lint/EmptyWhen
161
- # FIXME
162
- end
163
- when LOCK_STMT
164
- from_clause_items += statement.values[0]['relations'].map { |r| { item: r, type: :ddl } }
165
- # The following are other statements that don't fit into query/DML/DDL
166
- when EXPLAIN_STMT
167
- statements << statement[EXPLAIN_STMT]['query']
168
- end
114
+ # The following statements modify the contents of a table
115
+ when :insert_stmt, :update_stmt, :delete_stmt
116
+ value = statement.public_send(statement.node)
117
+ from_clause_items << { item: PgQuery::Node.new(range_var: value.relation), type: :dml }
118
+ statements << value.select_stmt if statement.node == :insert_stmt && value.select_stmt
119
+
120
+ subselect_items.concat(statement.update_stmt.target_list) if statement.node == :update_stmt
121
+ subselect_items << statement.update_stmt.where_clause if statement.node == :update_stmt && statement.update_stmt.where_clause
122
+ subselect_items << statement.delete_stmt.where_clause if statement.node == :delete_stmt && statement.delete_stmt.where_clause
169
123
 
170
- statement_value = statement.values[0]
171
- unless statement.empty?
172
- subselect_items.concat(statement_value['targetList']) if statement_value['targetList']
173
- subselect_items << statement_value['whereClause'] if statement_value['whereClause']
174
- subselect_items.concat(statement_value['sortClause'].collect { |h| h[SORT_BY]['node'] }) if statement_value['sortClause']
175
- subselect_items.concat(statement_value['groupClause']) if statement_value['groupClause']
176
- subselect_items << statement_value['havingClause'] if statement_value['havingClause']
124
+ if value.with_clause
125
+ cte_statements, cte_names = statements_and_cte_names_for_with_clause(value.with_clause)
126
+ @cte_names.concat(cte_names)
127
+ statements.concat(cte_statements)
128
+ end
129
+ when :copy_stmt
130
+ from_clause_items << { item: PgQuery::Node.new(range_var: statement.copy_stmt.relation), type: :dml } if statement.copy_stmt.relation
131
+ statements << statement.copy_stmt.query
132
+ # The following statement types are DDL (changing table structure)
133
+ when :alter_table_stmt
134
+ from_clause_items << { item: PgQuery::Node.new(range_var: statement.alter_table_stmt.relation), type: :ddl }
135
+ when :create_stmt
136
+ from_clause_items << { item: PgQuery::Node.new(range_var: statement.create_stmt.relation), type: :ddl }
137
+ when :create_table_as_stmt
138
+ if statement.create_table_as_stmt.into && statement.create_table_as_stmt.into.rel
139
+ from_clause_items << { item: PgQuery::Node.new(range_var: statement.create_table_as_stmt.into.rel), type: :ddl }
140
+ end
141
+ statements << statement.create_table_as_stmt.query if statement.create_table_as_stmt.query
142
+ when :truncate_stmt
143
+ from_clause_items += statement.truncate_stmt.relations.map { |r| { item: r, type: :ddl } }
144
+ when :view_stmt
145
+ from_clause_items << { item: PgQuery::Node.new(range_var: statement.view_stmt.view), type: :ddl }
146
+ statements << statement.view_stmt.query
147
+ when :index_stmt
148
+ from_clause_items << { item: PgQuery::Node.new(range_var: statement.index_stmt.relation), type: :ddl }
149
+ when :create_trig_stmt
150
+ from_clause_items << { item: PgQuery::Node.new(range_var: statement.create_trig_stmt.relation), type: :ddl }
151
+ when :rule_stmt
152
+ from_clause_items << { item: PgQuery::Node.new(range_var: statement.rule_stmt.relation), type: :ddl }
153
+ when :vacuum_stmt
154
+ from_clause_items += statement.vacuum_stmt.rels.map { |r| { item: PgQuery::Node.new(range_var: r.vacuum_relation.relation), type: :ddl } if r.node == :vacuum_relation }
155
+ when :refresh_mat_view_stmt
156
+ from_clause_items << { item: PgQuery::Node.new(range_var: statement.refresh_mat_view_stmt.relation), type: :ddl }
157
+ when :drop_stmt
158
+ objects = statement.drop_stmt.objects.map do |obj|
159
+ case obj.node
160
+ when :list
161
+ obj.list.items.map { |obj2| obj2.string.str if obj2.node == :string }
162
+ when :string
163
+ obj.string.str
164
+ end
165
+ end
166
+ case statement.drop_stmt.remove_type
167
+ when :OBJECT_TABLE
168
+ @tables += objects.map { |r| { name: r.join('.'), type: :ddl } }
169
+ when :OBJECT_RULE, :OBJECT_TRIGGER
170
+ @tables += objects.map { |r| { name: r[0..-2].join('.'), type: :ddl } }
171
+ end
172
+ when :grant_stmt
173
+ objects = statement.grant_stmt.objects
174
+ case statement.grant_stmt.objtype
175
+ when :OBJECT_COLUMN # Column # rubocop:disable Lint/EmptyWhen
176
+ # FIXME
177
+ when :OBJECT_TABLE # Table
178
+ from_clause_items += objects.map { |o| { item: o, type: :ddl } }
179
+ when :OBJECT_SEQUENCE # Sequence # rubocop:disable Lint/EmptyWhen
180
+ # FIXME
181
+ end
182
+ when :lock_stmt
183
+ from_clause_items += statement.lock_stmt.relations.map { |r| { item: r, type: :ddl } }
184
+ # The following are other statements that don't fit into query/DML/DDL
185
+ when :explain_stmt
186
+ statements << statement.explain_stmt.query
187
+ end
177
188
  end
178
- end
179
189
 
180
- next_item = subselect_items.shift
181
- if next_item
182
- case next_item.keys[0]
183
- when A_EXPR
184
- %w[lexpr rexpr].each do |side|
185
- elem = next_item.values[0][side]
186
- next unless elem
187
- if elem.is_a?(Array)
188
- subselect_items += elem
189
- else
190
- subselect_items << elem
190
+ next_item = subselect_items.shift
191
+ if next_item
192
+ case next_item.node
193
+ when :a_expr
194
+ %w[lexpr rexpr].each do |side|
195
+ elem = next_item.a_expr.public_send(side)
196
+ next unless elem
197
+ if elem.is_a?(Array) # FIXME: this needs to traverse a list
198
+ subselect_items += elem
199
+ else
200
+ subselect_items << elem
201
+ end
191
202
  end
203
+ when :bool_expr
204
+ subselect_items.concat(next_item.bool_expr.args)
205
+ when :res_target
206
+ subselect_items << next_item.res_target.val
207
+ when :sub_link
208
+ statements << next_item.sub_link.subselect
192
209
  end
193
- when BOOL_EXPR
194
- subselect_items.concat(next_item.values[0]['args'])
195
- when RES_TARGET
196
- subselect_items << next_item[RES_TARGET]['val']
197
- when SUB_LINK
198
- statements << next_item[SUB_LINK]['subselect']
199
210
  end
211
+
212
+ break if subselect_items.empty? && statements.empty?
200
213
  end
201
214
 
202
- break if subselect_items.empty? && statements.empty?
203
- end
215
+ loop do
216
+ next_item = from_clause_items.shift
217
+ break unless next_item && next_item[:item]
204
218
 
205
- loop do
206
- next_item = from_clause_items.shift
207
- break unless next_item && next_item[:item]
219
+ case next_item[:item].node
220
+ when :join_expr
221
+ from_clause_items << { item: next_item[:item].join_expr.larg, type: next_item[:type] }
222
+ from_clause_items << { item: next_item[:item].join_expr.rarg, type: next_item[:type] }
223
+ when :row_expr
224
+ from_clause_items += next_item[:item].row_expr.args.map { |a| { item: a, type: next_item[:type] } }
225
+ when :range_var
226
+ rangevar = next_item[:item].range_var
227
+ next if rangevar.schemaname.empty? && @cte_names.include?(rangevar.relname)
208
228
 
209
- case next_item[:item].keys[0]
210
- when JOIN_EXPR
211
- %w[larg rarg].each do |side|
212
- from_clause_items << { item: next_item[:item][JOIN_EXPR][side], type: next_item[:type] }
229
+ table = [rangevar.schemaname, rangevar.relname].reject { |s| s.nil? || s.empty? }.join('.')
230
+ @tables << {
231
+ name: table,
232
+ type: next_item[:type],
233
+ location: rangevar.location,
234
+ schemaname: (rangevar.schemaname unless rangevar.schemaname.empty?),
235
+ relname: rangevar.relname,
236
+ inh: rangevar.inh
237
+ }
238
+ @aliases[rangevar.alias.aliasname] = table if rangevar.alias
239
+ when :range_subselect
240
+ from_clause_items << { item: next_item[:item].range_subselect.subquery, type: next_item[:type] }
241
+ when :select_stmt
242
+ from_clause = next_item[:item].select_stmt.from_clause
243
+ from_clause_items += from_clause.map { |r| { item: r, type: next_item[:type] } } if from_clause
213
244
  end
214
- when ROW_EXPR
215
- from_clause_items += next_item[:item][ROW_EXPR]['args'].map { |a| { item: a, type: next_item[:type] } }
216
- when RANGE_VAR
217
- rangevar = next_item[:item][RANGE_VAR]
218
- next if !rangevar['schemaname'] && @cte_names.include?(rangevar['relname'])
219
-
220
- table = [rangevar['schemaname'], rangevar['relname']].compact.join('.')
221
- @tables << { table: table, type: next_item[:type] }
222
- @aliases[rangevar['alias'][ALIAS]['aliasname']] = table if rangevar['alias']
223
- when RANGE_SUBSELECT
224
- from_clause_items << { item: next_item[:item][RANGE_SUBSELECT]['subquery'], type: next_item[:type] }
225
- when SELECT_STMT
226
- from_clause = next_item[:item][SELECT_STMT][FROM_CLAUSE_FIELD]
227
- from_clause_items += from_clause.map { |r| { item: r, type: next_item[:type] } } if from_clause
228
245
  end
246
+
247
+ @tables.uniq!
248
+ @cte_names.uniq!
229
249
  end
230
250
 
231
- @tables.uniq!
232
- @cte_names.uniq!
233
- end
251
+ def statements_and_cte_names_for_with_clause(with_clause) # FIXME
252
+ statements = []
253
+ cte_names = []
234
254
 
235
- def statements_and_cte_names_for_with_clause(with_clause)
236
- statements = []
237
- cte_names = []
255
+ with_clause.ctes.each do |item|
256
+ next unless item.node == :common_table_expr
257
+ cte_names << item.common_table_expr.ctename
258
+ statements << item.common_table_expr.ctequery
259
+ end
238
260
 
239
- with_clause[WITH_CLAUSE]['ctes'].each do |item|
240
- next unless item[COMMON_TABLE_EXPR]
241
- cte_names << item[COMMON_TABLE_EXPR]['ctename']
242
- statements << item[COMMON_TABLE_EXPR]['ctequery']
261
+ [statements, cte_names]
243
262
  end
244
-
245
- [statements, cte_names]
246
263
  end
247
264
  end