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,11 @@
1
+ #ifndef PG_QUERY_READFUNCS_H
2
+ #define PG_QUERY_READFUNCS_H
3
+
4
+ #include "pg_query.h"
5
+
6
+ #include "postgres.h"
7
+ #include "nodes/pg_list.h"
8
+
9
+ List * pg_query_protobuf_to_nodes(PgQueryProtobuf protobuf);
10
+
11
+ #endif
@@ -0,0 +1,142 @@
1
+ #include "pg_query_readfuncs.h"
2
+
3
+ #include "nodes/nodes.h"
4
+ #include "nodes/parsenodes.h"
5
+ #include "nodes/pg_list.h"
6
+
7
+ #include "protobuf/pg_query.pb-c.h"
8
+
9
+ #define OUT_TYPE(typename, typename_c) PgQuery__##typename_c*
10
+
11
+ #define READ_COND(typename, typename_c, typename_underscore, typename_underscore_upcase, typename_cast, outname) \
12
+ case PG_QUERY__NODE__NODE_##typename_underscore_upcase: \
13
+ return (Node *) _read##typename_c(msg->outname);
14
+
15
+ #define READ_INT_FIELD(outname, outname_json, fldname) node->fldname = msg->outname;
16
+ #define READ_UINT_FIELD(outname, outname_json, fldname) node->fldname = msg->outname;
17
+ #define READ_LONG_FIELD(outname, outname_json, fldname) node->fldname = msg->outname;
18
+ #define READ_FLOAT_FIELD(outname, outname_json, fldname) node->fldname = msg->outname;
19
+ #define READ_BOOL_FIELD(outname, outname_json, fldname) node->fldname = msg->outname;
20
+
21
+ #define READ_CHAR_FIELD(outname, outname_json, fldname) \
22
+ if (msg->outname != NULL && strlen(msg->outname) > 0) { \
23
+ node->fldname = msg->outname[0]; \
24
+ }
25
+
26
+ #define READ_STRING_FIELD(outname, outname_json, fldname) \
27
+ if (msg->outname != NULL && strlen(msg->outname) > 0) { \
28
+ node->fldname = pstrdup(msg->outname); \
29
+ }
30
+
31
+ #define READ_ENUM_FIELD(typename, outname, outname_json, fldname) \
32
+ node->fldname = _intToEnum##typename(msg->outname);
33
+
34
+ #define READ_LIST_FIELD(outname, outname_json, fldname) \
35
+ { \
36
+ if (msg->n_##outname > 0) \
37
+ node->fldname = list_make1(_readNode(msg->outname[0])); \
38
+ for (int i = 1; i < msg->n_##outname; i++) \
39
+ node->fldname = lappend(node->fldname, _readNode(msg->outname[i])); \
40
+ }
41
+
42
+ #define READ_BITMAPSET_FIELD(outname, outname_json, fldname) // FIXME
43
+
44
+ #define READ_NODE_FIELD(outname, outname_json, fldname) \
45
+ node->fldname = *_readNode(msg->outname);
46
+
47
+ #define READ_NODE_PTR_FIELD(outname, outname_json, fldname) \
48
+ if (msg->outname != NULL) { \
49
+ node->fldname = _readNode(msg->outname); \
50
+ }
51
+
52
+ #define READ_EXPR_PTR_FIELD(outname, outname_json, fldname) \
53
+ if (msg->outname != NULL) { \
54
+ node->fldname = (Expr *) _readNode(msg->outname); \
55
+ }
56
+
57
+ #define READ_VALUE_FIELD(outname, outname_json, fldname) \
58
+ if (msg->outname != NULL) { \
59
+ node->fldname = *((Value *) _readNode(msg->outname)); \
60
+ }
61
+
62
+ #define READ_VALUE_PTR_FIELD(outname, outname_json, fldname) \
63
+ if (msg->outname != NULL) { \
64
+ node->fldname = (Value *) _readNode(msg->outname); \
65
+ }
66
+
67
+ #define READ_SPECIFIC_NODE_FIELD(typename, typename_underscore, outname, outname_json, fldname) \
68
+ node->fldname = *_read##typename(msg->outname);
69
+
70
+ #define READ_SPECIFIC_NODE_PTR_FIELD(typename, typename_underscore, outname, outname_json, fldname) \
71
+ if (msg->outname != NULL) { \
72
+ node->fldname = _read##typename(msg->outname); \
73
+ }
74
+
75
+ static Node * _readNode(PgQuery__Node *msg);
76
+
77
+ #include "pg_query_enum_defs.c"
78
+ #include "pg_query_readfuncs_defs.c"
79
+
80
+ static List * _readList(PgQuery__List *msg)
81
+ {
82
+ List *node = NULL;
83
+ if (msg->n_items > 0)
84
+ node = list_make1(_readNode(msg->items[0]));
85
+ for (int i = 1; i < msg->n_items; i++)
86
+ node = lappend(node, _readNode(msg->items[i]));
87
+ return node;
88
+ }
89
+
90
+ static Node * _readNode(PgQuery__Node *msg)
91
+ {
92
+ switch (msg->node_case)
93
+ {
94
+ #include "pg_query_readfuncs_conds.c"
95
+
96
+ case PG_QUERY__NODE__NODE_INTEGER:
97
+ return (Node *) makeInteger(msg->integer->ival);
98
+ case PG_QUERY__NODE__NODE_FLOAT:
99
+ return (Node *) makeFloat(pstrdup(msg->float_->str));
100
+ case PG_QUERY__NODE__NODE_STRING:
101
+ return (Node *) makeString(pstrdup(msg->string->str));
102
+ case PG_QUERY__NODE__NODE_BIT_STRING:
103
+ return (Node *) makeBitString(pstrdup(msg->bit_string->str));
104
+ case PG_QUERY__NODE__NODE_NULL:
105
+ {
106
+ Value *v = makeNode(Value);
107
+ v->type = T_Null;
108
+ return (Node *) v;
109
+ }
110
+ case PG_QUERY__NODE__NODE_LIST:
111
+ return (Node *) _readList(msg->list);
112
+ case PG_QUERY__NODE__NODE__NOT_SET:
113
+ return NULL;
114
+ default:
115
+ elog(ERROR, "unsupported protobuf node type: %d",
116
+ (int) msg->node_case);
117
+ }
118
+ }
119
+
120
+ List * pg_query_protobuf_to_nodes(PgQueryProtobuf protobuf)
121
+ {
122
+ PgQuery__ParseResult *result = NULL;
123
+ List * list = NULL;
124
+ size_t i = 0;
125
+
126
+ result = pg_query__parse_result__unpack(NULL, protobuf.len, (const uint8_t *) protobuf.data);
127
+
128
+ // TODO: Handle this by returning an error instead
129
+ Assert(result != NULL);
130
+
131
+ // TODO: Handle this by returning an error instead
132
+ Assert(result->version == PG_VERSION_NUM);
133
+
134
+ if (result->n_stmts > 0)
135
+ list = list_make1(_readRawStmt(result->stmts[0]));
136
+ for (i = 1; i < result->n_stmts; i++)
137
+ list = lappend(list, _readRawStmt(result->stmts[i]));
138
+
139
+ pg_query__parse_result__free_unpacked(result, NULL);
140
+
141
+ return list;
142
+ }
@@ -1,12 +1,18 @@
1
- #include "pg_query_ruby.h"
1
+ #include "pg_query.h"
2
+ #include "xxhash/xxhash.h"
3
+ #include <ruby.h>
2
4
 
3
- void raise_ruby_parse_error(PgQueryParseResult result);
5
+ void raise_ruby_parse_error(PgQueryProtobufParseResult result);
4
6
  void raise_ruby_normalize_error(PgQueryNormalizeResult result);
5
7
  void raise_ruby_fingerprint_error(PgQueryFingerprintResult result);
8
+ void raise_ruby_scan_error(PgQueryScanResult result);
6
9
 
7
- VALUE pg_query_ruby_parse(VALUE self, VALUE input);
10
+ VALUE pg_query_ruby_parse_protobuf(VALUE self, VALUE input);
11
+ VALUE pg_query_ruby_deparse_protobuf(VALUE self, VALUE input);
8
12
  VALUE pg_query_ruby_normalize(VALUE self, VALUE input);
9
13
  VALUE pg_query_ruby_fingerprint(VALUE self, VALUE input);
14
+ VALUE pg_query_ruby_scan(VALUE self, VALUE input);
15
+ VALUE pg_query_ruby_hash_xxh3_64(VALUE self, VALUE input, VALUE seed);
10
16
 
11
17
  void Init_pg_query(void)
12
18
  {
@@ -14,12 +20,18 @@ void Init_pg_query(void)
14
20
 
15
21
  cPgQuery = rb_const_get(rb_cObject, rb_intern("PgQuery"));
16
22
 
17
- rb_define_singleton_method(cPgQuery, "_raw_parse", pg_query_ruby_parse, 1);
23
+ rb_define_singleton_method(cPgQuery, "parse_protobuf", pg_query_ruby_parse_protobuf, 1);
24
+ rb_define_singleton_method(cPgQuery, "deparse_protobuf", pg_query_ruby_deparse_protobuf, 1);
18
25
  rb_define_singleton_method(cPgQuery, "normalize", pg_query_ruby_normalize, 1);
19
26
  rb_define_singleton_method(cPgQuery, "fingerprint", pg_query_ruby_fingerprint, 1);
27
+ rb_define_singleton_method(cPgQuery, "_raw_scan", pg_query_ruby_scan, 1);
28
+ rb_define_singleton_method(cPgQuery, "hash_xxh3_64", pg_query_ruby_hash_xxh3_64, 2);
29
+ rb_define_const(cPgQuery, "PG_VERSION", rb_str_new2(PG_VERSION));
30
+ rb_define_const(cPgQuery, "PG_MAJORVERSION", rb_str_new2(PG_MAJORVERSION));
31
+ rb_define_const(cPgQuery, "PG_VERSION_NUM", INT2NUM(PG_VERSION_NUM));
20
32
  }
21
33
 
22
- void raise_ruby_parse_error(PgQueryParseResult result)
34
+ void raise_ruby_parse_error(PgQueryProtobufParseResult result)
23
35
  {
24
36
  VALUE cPgQuery, cParseError;
25
37
  VALUE args[4];
@@ -32,7 +44,25 @@ void raise_ruby_parse_error(PgQueryParseResult result)
32
44
  args[2] = INT2NUM(result.error->lineno);
33
45
  args[3] = INT2NUM(result.error->cursorpos);
34
46
 
35
- pg_query_free_parse_result(result);
47
+ pg_query_free_protobuf_parse_result(result);
48
+
49
+ rb_exc_raise(rb_class_new_instance(4, args, cParseError));
50
+ }
51
+
52
+ void raise_ruby_deparse_error(PgQueryDeparseResult result)
53
+ {
54
+ VALUE cPgQuery, cParseError;
55
+ VALUE args[4];
56
+
57
+ cPgQuery = rb_const_get(rb_cObject, rb_intern("PgQuery"));
58
+ cParseError = rb_const_get_at(cPgQuery, rb_intern("ParseError"));
59
+
60
+ args[0] = rb_str_new2(result.error->message);
61
+ args[1] = rb_str_new2(result.error->filename);
62
+ args[2] = INT2NUM(result.error->lineno);
63
+ args[3] = INT2NUM(result.error->cursorpos);
64
+
65
+ pg_query_free_deparse_result(result);
36
66
 
37
67
  rb_exc_raise(rb_class_new_instance(4, args, cParseError));
38
68
  }
@@ -73,21 +103,60 @@ void raise_ruby_fingerprint_error(PgQueryFingerprintResult result)
73
103
  rb_exc_raise(rb_class_new_instance(4, args, cParseError));
74
104
  }
75
105
 
76
- VALUE pg_query_ruby_parse(VALUE self, VALUE input)
106
+ void raise_ruby_scan_error(PgQueryScanResult result)
107
+ {
108
+ VALUE cPgQuery, cScanError;
109
+ VALUE args[4];
110
+
111
+ cPgQuery = rb_const_get(rb_cObject, rb_intern("PgQuery"));
112
+ cScanError = rb_const_get_at(cPgQuery, rb_intern("ScanError"));
113
+
114
+ args[0] = rb_str_new2(result.error->message);
115
+ args[1] = rb_str_new2(result.error->filename);
116
+ args[2] = INT2NUM(result.error->lineno);
117
+ args[3] = INT2NUM(result.error->cursorpos);
118
+
119
+ pg_query_free_scan_result(result);
120
+
121
+ rb_exc_raise(rb_class_new_instance(4, args, cScanError));
122
+ }
123
+
124
+ VALUE pg_query_ruby_parse_protobuf(VALUE self, VALUE input)
77
125
  {
78
126
  Check_Type(input, T_STRING);
79
127
 
80
128
  VALUE output;
81
- PgQueryParseResult result = pg_query_parse(StringValueCStr(input));
129
+ PgQueryProtobufParseResult result = pg_query_parse_protobuf(StringValueCStr(input));
82
130
 
83
131
  if (result.error) raise_ruby_parse_error(result);
84
132
 
85
133
  output = rb_ary_new();
86
134
 
87
- rb_ary_push(output, rb_str_new2(result.parse_tree));
135
+ rb_ary_push(output, rb_str_new(result.parse_tree.data, result.parse_tree.len));
88
136
  rb_ary_push(output, rb_str_new2(result.stderr_buffer));
89
137
 
90
- pg_query_free_parse_result(result);
138
+ pg_query_free_protobuf_parse_result(result);
139
+
140
+ return output;
141
+ }
142
+
143
+ VALUE pg_query_ruby_deparse_protobuf(VALUE self, VALUE input)
144
+ {
145
+ Check_Type(input, T_STRING);
146
+
147
+ VALUE output;
148
+ PgQueryProtobuf pbuf = {0};
149
+ PgQueryDeparseResult result = {0};
150
+
151
+ pbuf.data = StringValuePtr(input);
152
+ pbuf.len = RSTRING_LEN(input);
153
+ result = pg_query_deparse_protobuf(pbuf);
154
+
155
+ if (result.error) raise_ruby_deparse_error(result);
156
+
157
+ output = rb_str_new2(result.query);
158
+
159
+ pg_query_free_deparse_result(result);
91
160
 
92
161
  return output;
93
162
  }
@@ -117,8 +186,8 @@ VALUE pg_query_ruby_fingerprint(VALUE self, VALUE input)
117
186
 
118
187
  if (result.error) raise_ruby_fingerprint_error(result);
119
188
 
120
- if (result.hexdigest) {
121
- output = rb_str_new2(result.hexdigest);
189
+ if (result.fingerprint_str) {
190
+ output = rb_str_new2(result.fingerprint_str);
122
191
  } else {
123
192
  output = Qnil;
124
193
  }
@@ -127,3 +196,30 @@ VALUE pg_query_ruby_fingerprint(VALUE self, VALUE input)
127
196
 
128
197
  return output;
129
198
  }
199
+
200
+ VALUE pg_query_ruby_scan(VALUE self, VALUE input)
201
+ {
202
+ Check_Type(input, T_STRING);
203
+
204
+ VALUE output;
205
+ PgQueryScanResult result = pg_query_scan(StringValueCStr(input));
206
+
207
+ if (result.error) raise_ruby_scan_error(result);
208
+
209
+ output = rb_ary_new();
210
+
211
+ rb_ary_push(output, rb_str_new(result.pbuf.data, result.pbuf.len));
212
+ rb_ary_push(output, rb_str_new2(result.stderr_buffer));
213
+
214
+ pg_query_free_scan_result(result);
215
+
216
+ return output;
217
+ }
218
+
219
+ VALUE pg_query_ruby_hash_xxh3_64(VALUE self, VALUE input, VALUE seed)
220
+ {
221
+ Check_Type(input, T_STRING);
222
+ Check_Type(seed, T_FIXNUM);
223
+
224
+ return ULONG2NUM(XXH3_64bits_withSeed(StringValuePtr(input), RSTRING_LEN(input), NUM2ULONG(seed)));
225
+ }
@@ -0,0 +1,173 @@
1
+ #include "pg_query.h"
2
+ #include "pg_query_internal.h"
3
+
4
+ #include "parser/gramparse.h"
5
+ #include "lib/stringinfo.h"
6
+
7
+ #include "protobuf/pg_query.pb-c.h"
8
+
9
+ #include <unistd.h>
10
+ #include <fcntl.h>
11
+
12
+ /* This is ugly. We need to access yyleng outside of scan.l, and casting yyscanner
13
+ to this internal struct seemed like one way to do it... */
14
+ struct yyguts_t
15
+ {
16
+ void *yyextra_r;
17
+ FILE *yyin_r, *yyout_r;
18
+ size_t yy_buffer_stack_top; /**< index of top of stack. */
19
+ size_t yy_buffer_stack_max; /**< capacity of stack. */
20
+ struct yy_buffer_state *yy_buffer_stack; /**< Stack as an array. */
21
+ char yy_hold_char;
22
+ size_t yy_n_chars;
23
+ size_t yyleng_r;
24
+ };
25
+
26
+ PgQueryScanResult pg_query_scan(const char* input)
27
+ {
28
+ MemoryContext ctx = NULL;
29
+ PgQueryScanResult result = {0};
30
+ core_yyscan_t yyscanner;
31
+ core_yy_extra_type yyextra;
32
+ core_YYSTYPE yylval;
33
+ YYLTYPE yylloc;
34
+ PgQuery__ScanResult scan_result = PG_QUERY__SCAN_RESULT__INIT;
35
+ PgQuery__ScanToken **output_tokens;
36
+ size_t token_count = 0;
37
+ size_t i;
38
+
39
+ ctx = pg_query_enter_memory_context();
40
+
41
+ MemoryContext parse_context = CurrentMemoryContext;
42
+
43
+ char stderr_buffer[STDERR_BUFFER_LEN + 1] = {0};
44
+ #ifndef DEBUG
45
+ int stderr_global;
46
+ int stderr_pipe[2];
47
+ #endif
48
+
49
+ #ifndef DEBUG
50
+ // Setup pipe for stderr redirection
51
+ if (pipe(stderr_pipe) != 0) {
52
+ PgQueryError* error = malloc(sizeof(PgQueryError));
53
+
54
+ error->message = strdup("Failed to open pipe, too many open file descriptors")
55
+
56
+ result.error = error;
57
+
58
+ return result;
59
+ }
60
+
61
+ fcntl(stderr_pipe[0], F_SETFL, fcntl(stderr_pipe[0], F_GETFL) | O_NONBLOCK);
62
+
63
+ // Redirect stderr to the pipe
64
+ stderr_global = dup(STDERR_FILENO);
65
+ dup2(stderr_pipe[1], STDERR_FILENO);
66
+ close(stderr_pipe[1]);
67
+ #endif
68
+
69
+ PG_TRY();
70
+ {
71
+ // Really this is stupid, we only run twice so we can pre-allocate the output array correctly
72
+ yyscanner = scanner_init(input, &yyextra, &ScanKeywords, ScanKeywordTokens);
73
+ for (;; token_count++)
74
+ {
75
+ if (core_yylex(&yylval, &yylloc, yyscanner) == 0) break;
76
+ }
77
+ scanner_finish(yyscanner);
78
+
79
+ output_tokens = malloc(sizeof(PgQuery__ScanToken *) * token_count);
80
+
81
+ /* initialize the flex scanner --- should match raw_parser() */
82
+ yyscanner = scanner_init(input, &yyextra, &ScanKeywords, ScanKeywordTokens);
83
+
84
+ /* Lex tokens */
85
+ for (i = 0; ; i++)
86
+ {
87
+ int tok;
88
+ int keyword;
89
+
90
+ tok = core_yylex(&yylval, &yylloc, yyscanner);
91
+ if (tok == 0) break;
92
+
93
+ output_tokens[i] = malloc(sizeof(PgQuery__ScanToken));
94
+ pg_query__scan_token__init(output_tokens[i]);
95
+ output_tokens[i]->start = yylloc;
96
+ if (tok == SCONST || tok == BCONST || tok == XCONST || tok == IDENT || tok == C_COMMENT) {
97
+ output_tokens[i]->end = yyextra.yyllocend;
98
+ } else {
99
+ output_tokens[i]->end = yylloc + ((struct yyguts_t*) yyscanner)->yyleng_r;
100
+ }
101
+ output_tokens[i]->token = tok;
102
+
103
+ switch (tok) {
104
+ #define PG_KEYWORD(a,b,c) case b: output_tokens[i]->keyword_kind = c + 1; break;
105
+ #include "parser/kwlist.h"
106
+ default: output_tokens[i]->keyword_kind = 0;
107
+ }
108
+ }
109
+
110
+ scanner_finish(yyscanner);
111
+
112
+ scan_result.version = PG_VERSION_NUM;
113
+ scan_result.n_tokens = token_count;
114
+ scan_result.tokens = output_tokens;
115
+ result.pbuf.len = pg_query__scan_result__get_packed_size(&scan_result);
116
+ result.pbuf.data = malloc(result.pbuf.len);
117
+ pg_query__scan_result__pack(&scan_result, (void*) result.pbuf.data);
118
+
119
+ for (i = 0; i < token_count; i++) {
120
+ free(output_tokens[i]);
121
+ }
122
+ free(output_tokens);
123
+
124
+ #ifndef DEBUG
125
+ // Save stderr for result
126
+ read(stderr_pipe[0], stderr_buffer, STDERR_BUFFER_LEN);
127
+ #endif
128
+
129
+ result.stderr_buffer = strdup(stderr_buffer);
130
+ }
131
+ PG_CATCH();
132
+ {
133
+ ErrorData* error_data;
134
+ PgQueryError* error;
135
+
136
+ MemoryContextSwitchTo(parse_context);
137
+ error_data = CopyErrorData();
138
+
139
+ // Note: This is intentionally malloc so exiting the memory context doesn't free this
140
+ error = malloc(sizeof(PgQueryError));
141
+ error->message = strdup(error_data->message);
142
+ error->filename = strdup(error_data->filename);
143
+ error->funcname = strdup(error_data->funcname);
144
+ error->context = NULL;
145
+ error->lineno = error_data->lineno;
146
+ error->cursorpos = error_data->cursorpos;
147
+
148
+ result.error = error;
149
+ FlushErrorState();
150
+ }
151
+ PG_END_TRY();
152
+
153
+ #ifndef DEBUG
154
+ // Restore stderr, close pipe
155
+ dup2(stderr_global, STDERR_FILENO);
156
+ close(stderr_pipe[0]);
157
+ close(stderr_global);
158
+ #endif
159
+
160
+ pg_query_exit_memory_context(ctx);
161
+
162
+ return result;
163
+ }
164
+
165
+ void pg_query_free_scan_result(PgQueryScanResult result)
166
+ {
167
+ if (result.error) {
168
+ pg_query_free_error(result.error);
169
+ }
170
+
171
+ free(result.pbuf.data);
172
+ free(result.stderr_buffer);
173
+ }