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,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,306 @@ 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
+ @functions = nil
33
+ end
38
34
 
39
- def select_tables
40
- tables_with_types.select { |t| t[:type] == :select }.map { |t| t[:table] }
41
- end
35
+ def dup_tree
36
+ ParseResult.decode(ParseResult.encode(@tree))
37
+ end
42
38
 
43
- def dml_tables
44
- tables_with_types.select { |t| t[:type] == :dml }.map { |t| t[:table] }
45
- end
39
+ def tables
40
+ tables_with_details.map { |t| t[:name] }.uniq
41
+ end
46
42
 
47
- def ddl_tables
48
- tables_with_types.select { |t| t[:type] == :ddl }.map { |t| t[:table] }
49
- end
43
+ def select_tables
44
+ tables_with_details.select { |t| t[:type] == :select }.map { |t| t[:name] }.uniq
45
+ end
50
46
 
51
- def cte_names
52
- load_tables_and_aliases! if @cte_names.nil?
53
- @cte_names
54
- end
47
+ def dml_tables
48
+ tables_with_details.select { |t| t[:type] == :dml }.map { |t| t[:name] }.uniq
49
+ end
55
50
 
56
- def aliases
57
- load_tables_and_aliases! if @aliases.nil?
58
- @aliases
59
- end
51
+ def ddl_tables
52
+ tables_with_details.select { |t| t[:type] == :ddl }.map { |t| t[:name] }.uniq
53
+ end
60
54
 
61
- def tables_with_types
62
- load_tables_and_aliases! if @tables.nil?
63
- @tables
64
- end
55
+ # Returns function names, ignoring their argument types. This may be insufficient
56
+ # if you need to disambiguate two functions with the same name but different argument
57
+ # types.
58
+ def functions
59
+ functions_with_details.map { |f| f[:function] }.uniq
60
+ end
65
61
 
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
62
+ def ddl_functions
63
+ functions_with_details.select { |f| f[:type] == :ddl }.map { |f| f[:function] }.uniq
64
+ end
65
+
66
+ def call_functions
67
+ functions_with_details.select { |f| f[:type] == :call }.map { |f| f[:function] }.uniq
68
+ end
69
+
70
+ def cte_names
71
+ load_objects! if @cte_names.nil?
72
+ @cte_names
73
+ end
74
+
75
+ def aliases
76
+ load_objects! if @aliases.nil?
77
+ @aliases
78
+ end
79
+
80
+ def tables_with_details
81
+ load_objects! if @tables.nil?
82
+ @tables
83
+ end
84
+
85
+ def functions_with_details
86
+ load_objects! if @functions.nil?
87
+ @functions
88
+ end
89
+
90
+ protected
91
+
92
+ def load_objects! # rubocop:disable Metrics/CyclomaticComplexity
93
+ @tables = [] # types: select, dml, ddl
94
+ @cte_names = []
95
+ @aliases = {}
96
+ @functions = [] # types: call, ddl
97
+
98
+ statements = @tree.stmts.dup.to_a.map(&:stmt)
99
+ from_clause_items = [] # types: select, dml, ddl
100
+ subselect_items = []
101
+
102
+ loop do
103
+ statement = statements.shift
104
+ if statement
105
+ case statement.node
106
+ when :list
107
+ statements += statement.list.items
108
+ # The following statement types do not modify tables and are added to from_clause_items
109
+ # (and subsequently @tables)
110
+ when :select_stmt
111
+ subselect_items.concat(statement.select_stmt.target_list)
112
+ subselect_items << statement.select_stmt.where_clause if statement.select_stmt.where_clause
113
+ subselect_items.concat(statement.select_stmt.sort_clause.collect { |h| h.sort_by.node })
114
+ subselect_items.concat(statement.select_stmt.group_clause)
115
+ subselect_items << statement.select_stmt.having_clause if statement.select_stmt.having_clause
116
+
117
+ case statement.select_stmt.op
118
+ when :SETOP_NONE
119
+ (statement.select_stmt.from_clause || []).each do |item|
120
+ if item.node == :range_subselect
121
+ statements << item.range_subselect.subquery
122
+ else
123
+ from_clause_items << { item: item, type: :select }
124
+ end
125
+ end
126
+ when :SETOP_UNION
127
+ statements << PgQuery::Node.new(select_stmt: statement.select_stmt.larg) if statement.select_stmt.larg
128
+ statements << PgQuery::Node.new(select_stmt: statement.select_stmt.rarg) if statement.select_stmt.rarg
129
+ end
130
+
131
+ if statement.select_stmt.with_clause
132
+ cte_statements, cte_names = statements_and_cte_names_for_with_clause(statement.select_stmt.with_clause)
133
+ @cte_names.concat(cte_names)
134
+ statements.concat(cte_statements)
135
+ end
136
+ # The following statements modify the contents of a table
137
+ when :insert_stmt, :update_stmt, :delete_stmt
138
+ value = statement.public_send(statement.node)
139
+ from_clause_items << { item: PgQuery::Node.new(range_var: value.relation), type: :dml }
140
+ statements << value.select_stmt if statement.node == :insert_stmt && value.select_stmt
141
+
142
+ if statement.node == :update_stmt
143
+ value.from_clause.each do |item|
92
144
  from_clause_items << { item: item, type: :select }
93
145
  end
146
+ subselect_items.concat(statement.update_stmt.target_list)
94
147
  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
148
 
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']
149
+ subselect_items << statement.update_stmt.where_clause if statement.node == :update_stmt && statement.update_stmt.where_clause
150
+ subselect_items << statement.delete_stmt.where_clause if statement.node == :delete_stmt && statement.delete_stmt.where_clause
151
+
152
+ if value.with_clause
153
+ cte_statements, cte_names = statements_and_cte_names_for_with_clause(value.with_clause)
154
+ @cte_names.concat(cte_names)
155
+ statements.concat(cte_statements)
156
+ end
157
+ when :copy_stmt
158
+ from_clause_items << { item: PgQuery::Node.new(range_var: statement.copy_stmt.relation), type: :dml } if statement.copy_stmt.relation
159
+ statements << statement.copy_stmt.query
160
+ # The following statement types are DDL (changing table structure)
161
+ when :alter_table_stmt
162
+ from_clause_items << { item: PgQuery::Node.new(range_var: statement.alter_table_stmt.relation), type: :ddl }
163
+ when :create_stmt
164
+ from_clause_items << { item: PgQuery::Node.new(range_var: statement.create_stmt.relation), type: :ddl }
165
+ when :create_table_as_stmt
166
+ if statement.create_table_as_stmt.into && statement.create_table_as_stmt.into.rel
167
+ from_clause_items << { item: PgQuery::Node.new(range_var: statement.create_table_as_stmt.into.rel), type: :ddl }
168
+ end
169
+ statements << statement.create_table_as_stmt.query if statement.create_table_as_stmt.query
170
+ when :truncate_stmt
171
+ from_clause_items += statement.truncate_stmt.relations.map { |r| { item: r, type: :ddl } }
172
+ when :view_stmt
173
+ from_clause_items << { item: PgQuery::Node.new(range_var: statement.view_stmt.view), type: :ddl }
174
+ statements << statement.view_stmt.query
175
+ when :index_stmt
176
+ from_clause_items << { item: PgQuery::Node.new(range_var: statement.index_stmt.relation), type: :ddl }
177
+ when :create_trig_stmt
178
+ from_clause_items << { item: PgQuery::Node.new(range_var: statement.create_trig_stmt.relation), type: :ddl }
179
+ when :rule_stmt
180
+ from_clause_items << { item: PgQuery::Node.new(range_var: statement.rule_stmt.relation), type: :ddl }
181
+ when :vacuum_stmt
182
+ 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 }
183
+ when :refresh_mat_view_stmt
184
+ from_clause_items << { item: PgQuery::Node.new(range_var: statement.refresh_mat_view_stmt.relation), type: :ddl }
185
+ when :drop_stmt
186
+ objects = statement.drop_stmt.objects.map do |obj|
187
+ case obj.node
188
+ when :list
189
+ obj.list.items.map { |obj2| obj2.string.str if obj2.node == :string }
190
+ when :string
191
+ obj.string.str
192
+ end
193
+ end
194
+ case statement.drop_stmt.remove_type
195
+ when :OBJECT_TABLE
196
+ @tables += objects.map { |r| { name: r.join('.'), type: :ddl } }
197
+ when :OBJECT_RULE, :OBJECT_TRIGGER
198
+ @tables += objects.map { |r| { name: r[0..-2].join('.'), type: :ddl } }
199
+ when :OBJECT_FUNCTION
200
+ # Only one function can be dropped in a statement
201
+ obj = statement.drop_stmt.objects[0].object_with_args
202
+ @functions << { function: obj.objname[0].string.str, type: :ddl }
203
+ end
204
+ when :grant_stmt
205
+ objects = statement.grant_stmt.objects
206
+ case statement.grant_stmt.objtype
207
+ when :OBJECT_COLUMN # Column # rubocop:disable Lint/EmptyWhen
208
+ # FIXME
209
+ when :OBJECT_TABLE # Table
210
+ from_clause_items += objects.map { |o| { item: o, type: :ddl } }
211
+ when :OBJECT_SEQUENCE # Sequence # rubocop:disable Lint/EmptyWhen
212
+ # FIXME
213
+ end
214
+ when :lock_stmt
215
+ from_clause_items += statement.lock_stmt.relations.map { |r| { item: r, type: :ddl } }
216
+ # The following are other statements that don't fit into query/DML/DDL
217
+ when :explain_stmt
218
+ statements << statement.explain_stmt.query
219
+ when :create_function_stmt
220
+ @functions << {
221
+ function: statement.create_function_stmt.funcname[0].string.str,
222
+ type: :ddl
223
+ }
224
+ when :rename_stmt
225
+ if statement.rename_stmt.rename_type == :OBJECT_FUNCTION
226
+ original_name = statement.rename_stmt.object.object_with_args.objname[0].string.str
227
+ new_name = statement.rename_stmt.newname
228
+ @functions += [
229
+ { function: original_name, type: :ddl },
230
+ { function: new_name, type: :ddl }
231
+ ]
145
232
  end
146
233
  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
234
  end
169
235
 
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']
177
- end
178
- end
179
-
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
236
+ next_item = subselect_items.shift
237
+ if next_item
238
+ case next_item.node
239
+ when :a_expr
240
+ %w[lexpr rexpr].each do |side|
241
+ elem = next_item.a_expr.public_send(side)
242
+ next unless elem
243
+ if elem.is_a?(Array) # FIXME: this needs to traverse a list
244
+ subselect_items += elem
245
+ else
246
+ subselect_items << elem
247
+ end
191
248
  end
249
+ when :bool_expr
250
+ subselect_items.concat(next_item.bool_expr.args)
251
+ when :coalesce_expr
252
+ subselect_items.concat(next_item.coalesce_expr.args)
253
+ when :min_max_expr
254
+ subselect_items.concat(next_item.min_max_expr.args)
255
+ when :res_target
256
+ subselect_items << next_item.res_target.val
257
+ when :sub_link
258
+ statements << next_item.sub_link.subselect
259
+ when :func_call
260
+ @functions << {
261
+ function: next_item.func_call.funcname[0].string.str,
262
+ type: :call
263
+ }
192
264
  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
265
  end
266
+
267
+ break if subselect_items.empty? && statements.empty?
200
268
  end
201
269
 
202
- break if subselect_items.empty? && statements.empty?
203
- end
270
+ loop do
271
+ next_item = from_clause_items.shift
272
+ break unless next_item && next_item[:item]
204
273
 
205
- loop do
206
- next_item = from_clause_items.shift
207
- break unless next_item && next_item[:item]
274
+ case next_item[:item].node
275
+ when :join_expr
276
+ from_clause_items << { item: next_item[:item].join_expr.larg, type: next_item[:type] }
277
+ from_clause_items << { item: next_item[:item].join_expr.rarg, type: next_item[:type] }
278
+ when :row_expr
279
+ from_clause_items += next_item[:item].row_expr.args.map { |a| { item: a, type: next_item[:type] } }
280
+ when :range_var
281
+ rangevar = next_item[:item].range_var
282
+ next if rangevar.schemaname.empty? && @cte_names.include?(rangevar.relname)
208
283
 
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] }
284
+ table = [rangevar.schemaname, rangevar.relname].reject { |s| s.nil? || s.empty? }.join('.')
285
+ @tables << {
286
+ name: table,
287
+ type: next_item[:type],
288
+ location: rangevar.location,
289
+ schemaname: (rangevar.schemaname unless rangevar.schemaname.empty?),
290
+ relname: rangevar.relname,
291
+ inh: rangevar.inh
292
+ }
293
+ @aliases[rangevar.alias.aliasname] = table if rangevar.alias
294
+ when :range_subselect
295
+ from_clause_items << { item: next_item[:item].range_subselect.subquery, type: next_item[:type] }
296
+ when :select_stmt
297
+ from_clause = next_item[:item].select_stmt.from_clause
298
+ from_clause_items += from_clause.map { |r| { item: r, type: next_item[:type] } } if from_clause
213
299
  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
300
  end
301
+
302
+ @tables.uniq!
303
+ @cte_names.uniq!
229
304
  end
230
305
 
231
- @tables.uniq!
232
- @cte_names.uniq!
233
- end
306
+ def statements_and_cte_names_for_with_clause(with_clause) # FIXME
307
+ statements = []
308
+ cte_names = []
234
309
 
235
- def statements_and_cte_names_for_with_clause(with_clause)
236
- statements = []
237
- cte_names = []
310
+ with_clause.ctes.each do |item|
311
+ next unless item.node == :common_table_expr
312
+ cte_names << item.common_table_expr.ctename
313
+ statements << item.common_table_expr.ctequery
314
+ end
238
315
 
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']
316
+ [statements, cte_names]
243
317
  end
244
-
245
- [statements, cte_names]
246
318
  end
247
319
  end