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,9 @@
1
+ #ifndef PG_QUERY_JSON_PLPGSQL_H
2
+ #define PG_QUERY_JSON_PLPGSQL_H
3
+
4
+ #include "postgres.h"
5
+ #include "plpgsql.h"
6
+
7
+ char* plpgsqlToJSON(PLpgSQL_function* func);
8
+
9
+ #endif
@@ -0,0 +1,439 @@
1
+ #include "pg_query.h"
2
+ #include "pg_query_internal.h"
3
+
4
+ #include "parser/parser.h"
5
+ #include "parser/scanner.h"
6
+ #include "parser/scansup.h"
7
+ #include "mb/pg_wchar.h"
8
+ #include "nodes/nodeFuncs.h"
9
+
10
+ /*
11
+ * Struct for tracking locations/lengths of constants during normalization
12
+ */
13
+ typedef struct pgssLocationLen
14
+ {
15
+ int location; /* start offset in query text */
16
+ int length; /* length in bytes, or -1 to ignore */
17
+ } pgssLocationLen;
18
+
19
+ /*
20
+ * Working state for constant tree walker
21
+ */
22
+ typedef struct pgssConstLocations
23
+ {
24
+ /* Array of locations of constants that should be removed */
25
+ pgssLocationLen *clocations;
26
+
27
+ /* Allocated length of clocations array */
28
+ int clocations_buf_size;
29
+
30
+ /* Current number of valid entries in clocations array */
31
+ int clocations_count;
32
+
33
+ /* highest Param id we've seen, in order to start normalization correctly */
34
+ int highest_extern_param_id;
35
+
36
+ /* query text */
37
+ const char * query;
38
+ int query_len;
39
+ } pgssConstLocations;
40
+
41
+ /*
42
+ * comp_location: comparator for qsorting pgssLocationLen structs by location
43
+ */
44
+ static int
45
+ comp_location(const void *a, const void *b)
46
+ {
47
+ int l = ((const pgssLocationLen *) a)->location;
48
+ int r = ((const pgssLocationLen *) b)->location;
49
+
50
+ if (l < r)
51
+ return -1;
52
+ else if (l > r)
53
+ return +1;
54
+ else
55
+ return 0;
56
+ }
57
+
58
+ /*
59
+ * Given a valid SQL string and an array of constant-location records,
60
+ * fill in the textual lengths of those constants.
61
+ *
62
+ * The constants may use any allowed constant syntax, such as float literals,
63
+ * bit-strings, single-quoted strings and dollar-quoted strings. This is
64
+ * accomplished by using the public API for the core scanner.
65
+ *
66
+ * It is the caller's job to ensure that the string is a valid SQL statement
67
+ * with constants at the indicated locations. Since in practice the string
68
+ * has already been parsed, and the locations that the caller provides will
69
+ * have originated from within the authoritative parser, this should not be
70
+ * a problem.
71
+ *
72
+ * Duplicate constant pointers are possible, and will have their lengths
73
+ * marked as '-1', so that they are later ignored. (Actually, we assume the
74
+ * lengths were initialized as -1 to start with, and don't change them here.)
75
+ *
76
+ * N.B. There is an assumption that a '-' character at a Const location begins
77
+ * a negative numeric constant. This precludes there ever being another
78
+ * reason for a constant to start with a '-'.
79
+ */
80
+ static void
81
+ fill_in_constant_lengths(pgssConstLocations *jstate, const char *query)
82
+ {
83
+ pgssLocationLen *locs;
84
+ core_yyscan_t yyscanner;
85
+ core_yy_extra_type yyextra;
86
+ core_YYSTYPE yylval;
87
+ YYLTYPE yylloc;
88
+ int last_loc = -1;
89
+ int i;
90
+
91
+ /*
92
+ * Sort the records by location so that we can process them in order while
93
+ * scanning the query text.
94
+ */
95
+ if (jstate->clocations_count > 1)
96
+ qsort(jstate->clocations, jstate->clocations_count,
97
+ sizeof(pgssLocationLen), comp_location);
98
+ locs = jstate->clocations;
99
+
100
+ /* initialize the flex scanner --- should match raw_parser() */
101
+ yyscanner = scanner_init(query,
102
+ &yyextra,
103
+ &ScanKeywords,
104
+ ScanKeywordTokens);
105
+
106
+ /* Search for each constant, in sequence */
107
+ for (i = 0; i < jstate->clocations_count; i++)
108
+ {
109
+ int loc = locs[i].location;
110
+ int tok;
111
+
112
+ Assert(loc >= 0);
113
+
114
+ if (loc <= last_loc)
115
+ continue; /* Duplicate constant, ignore */
116
+
117
+ /* Lex tokens until we find the desired constant */
118
+ for (;;)
119
+ {
120
+ tok = core_yylex(&yylval, &yylloc, yyscanner);
121
+
122
+ /* We should not hit end-of-string, but if we do, behave sanely */
123
+ if (tok == 0)
124
+ break; /* out of inner for-loop */
125
+
126
+ /*
127
+ * We should find the token position exactly, but if we somehow
128
+ * run past it, work with that.
129
+ */
130
+ if (yylloc >= loc)
131
+ {
132
+ if (query[loc] == '-')
133
+ {
134
+ /*
135
+ * It's a negative value - this is the one and only case
136
+ * where we replace more than a single token.
137
+ *
138
+ * Do not compensate for the core system's special-case
139
+ * adjustment of location to that of the leading '-'
140
+ * operator in the event of a negative constant. It is
141
+ * also useful for our purposes to start from the minus
142
+ * symbol. In this way, queries like "select * from foo
143
+ * where bar = 1" and "select * from foo where bar = -2"
144
+ * will have identical normalized query strings.
145
+ */
146
+ tok = core_yylex(&yylval, &yylloc, yyscanner);
147
+ if (tok == 0)
148
+ break; /* out of inner for-loop */
149
+ }
150
+
151
+ /*
152
+ * We now rely on the assumption that flex has placed a zero
153
+ * byte after the text of the current token in scanbuf.
154
+ */
155
+ locs[i].length = (int) strlen(yyextra.scanbuf + loc);
156
+
157
+ /* Quoted string with Unicode escapes
158
+ *
159
+ * The lexer consumes trailing whitespace in order to find UESCAPE, but if there
160
+ * is no UESCAPE it has still consumed it - don't include it in constant length.
161
+ */
162
+ if (locs[i].length > 4 && /* U&'' */
163
+ (yyextra.scanbuf[loc] == 'u' || yyextra.scanbuf[loc] == 'U') &&
164
+ yyextra.scanbuf[loc + 1] == '&' && yyextra.scanbuf[loc + 2] == '\'')
165
+ {
166
+ int j = locs[i].length - 1; /* Skip the \0 */
167
+ for (; j >= 0 && scanner_isspace(yyextra.scanbuf[loc + j]); j--) {}
168
+ locs[i].length = j + 1; /* Count the \0 */
169
+ }
170
+
171
+ break; /* out of inner for-loop */
172
+ }
173
+ }
174
+
175
+ /* If we hit end-of-string, give up, leaving remaining lengths -1 */
176
+ if (tok == 0)
177
+ break;
178
+
179
+ last_loc = loc;
180
+ }
181
+
182
+ scanner_finish(yyscanner);
183
+ }
184
+
185
+ /*
186
+ * Generate a normalized version of the query string that will be used to
187
+ * represent all similar queries.
188
+ *
189
+ * Note that the normalized representation may well vary depending on
190
+ * just which "equivalent" query is used to create the hashtable entry.
191
+ * We assume this is OK.
192
+ *
193
+ * *query_len_p contains the input string length, and is updated with
194
+ * the result string length (which cannot be longer) on exit.
195
+ *
196
+ * Returns a palloc'd string.
197
+ */
198
+ static char *
199
+ generate_normalized_query(pgssConstLocations *jstate, int query_loc, int* query_len_p, int encoding)
200
+ {
201
+ char *norm_query;
202
+ const char *query = jstate->query;
203
+ int query_len = *query_len_p;
204
+ int i,
205
+ norm_query_buflen, /* Space allowed for norm_query */
206
+ len_to_wrt, /* Length (in bytes) to write */
207
+ quer_loc = 0, /* Source query byte location */
208
+ n_quer_loc = 0, /* Normalized query byte location */
209
+ last_off = 0, /* Offset from start for previous tok */
210
+ last_tok_len = 0; /* Length (in bytes) of that tok */
211
+
212
+ /*
213
+ * Get constants' lengths (core system only gives us locations). Note
214
+ * this also ensures the items are sorted by location.
215
+ */
216
+ fill_in_constant_lengths(jstate, query);
217
+
218
+ /*
219
+ * Allow for $n symbols to be longer than the constants they replace.
220
+ * Constants must take at least one byte in text form, while a $n symbol
221
+ * certainly isn't more than 11 bytes, even if n reaches INT_MAX. We
222
+ * could refine that limit based on the max value of n for the current
223
+ * query, but it hardly seems worth any extra effort to do so.
224
+ */
225
+ norm_query_buflen = query_len + jstate->clocations_count * 10;
226
+
227
+ /* Allocate result buffer */
228
+ norm_query = palloc(norm_query_buflen + 1);
229
+
230
+ for (i = 0; i < jstate->clocations_count; i++)
231
+ {
232
+ int off, /* Offset from start for cur tok */
233
+ tok_len; /* Length (in bytes) of that tok */
234
+
235
+ off = jstate->clocations[i].location;
236
+ /* Adjust recorded location if we're dealing with partial string */
237
+ off -= query_loc;
238
+
239
+ tok_len = jstate->clocations[i].length;
240
+
241
+ if (tok_len < 0)
242
+ continue; /* ignore any duplicates */
243
+
244
+ /* Copy next chunk (what precedes the next constant) */
245
+ len_to_wrt = off - last_off;
246
+ len_to_wrt -= last_tok_len;
247
+
248
+ Assert(len_to_wrt >= 0);
249
+ memcpy(norm_query + n_quer_loc, query + quer_loc, len_to_wrt);
250
+ n_quer_loc += len_to_wrt;
251
+
252
+ /* And insert a param symbol in place of the constant token */
253
+ n_quer_loc += sprintf(norm_query + n_quer_loc, "$%d",
254
+ i + 1 + jstate->highest_extern_param_id);
255
+
256
+ quer_loc = off + tok_len;
257
+ last_off = off;
258
+ last_tok_len = tok_len;
259
+ }
260
+
261
+ /*
262
+ * We've copied up until the last ignorable constant. Copy over the
263
+ * remaining bytes of the original query string.
264
+ */
265
+ len_to_wrt = query_len - quer_loc;
266
+
267
+ Assert(len_to_wrt >= 0);
268
+ memcpy(norm_query + n_quer_loc, query + quer_loc, len_to_wrt);
269
+ n_quer_loc += len_to_wrt;
270
+
271
+ Assert(n_quer_loc <= norm_query_buflen);
272
+ norm_query[n_quer_loc] = '\0';
273
+
274
+ *query_len_p = n_quer_loc;
275
+ return norm_query;
276
+ }
277
+
278
+ static void RecordConstLocation(pgssConstLocations *jstate, int location)
279
+ {
280
+ /* -1 indicates unknown or undefined location */
281
+ if (location >= 0)
282
+ {
283
+ /* enlarge array if needed */
284
+ if (jstate->clocations_count >= jstate->clocations_buf_size)
285
+ {
286
+ jstate->clocations_buf_size *= 2;
287
+ jstate->clocations = (pgssLocationLen *)
288
+ repalloc(jstate->clocations,
289
+ jstate->clocations_buf_size *
290
+ sizeof(pgssLocationLen));
291
+ }
292
+ jstate->clocations[jstate->clocations_count].location = location;
293
+ /* initialize lengths to -1 to simplify fill_in_constant_lengths */
294
+ jstate->clocations[jstate->clocations_count].length = -1;
295
+ jstate->clocations_count++;
296
+ }
297
+ }
298
+
299
+ static bool const_record_walker(Node *node, pgssConstLocations *jstate)
300
+ {
301
+ bool result;
302
+ MemoryContext normalize_context = CurrentMemoryContext;
303
+
304
+ if (node == NULL) return false;
305
+
306
+ if (IsA(node, A_Const))
307
+ {
308
+ RecordConstLocation(jstate, castNode(A_Const, node)->location);
309
+ }
310
+ else if (IsA(node, ParamRef))
311
+ {
312
+ /* Track the highest ParamRef number */
313
+ if (((ParamRef *) node)->number > jstate->highest_extern_param_id)
314
+ jstate->highest_extern_param_id = castNode(ParamRef, node)->number;
315
+ }
316
+ else if (IsA(node, DefElem))
317
+ {
318
+ DefElem * defElem = (DefElem *) node;
319
+ if (defElem->arg != NULL && IsA(defElem->arg, String)) {
320
+ for (int i = defElem->location; i < jstate->query_len; i++) {
321
+ if (jstate->query[i] == '\'') {
322
+ RecordConstLocation(jstate, i);
323
+ break;
324
+ }
325
+ }
326
+ }
327
+ return const_record_walker((Node *) ((DefElem *) node)->arg, jstate);
328
+ }
329
+ else if (IsA(node, RawStmt))
330
+ {
331
+ return const_record_walker((Node *) ((RawStmt *) node)->stmt, jstate);
332
+ }
333
+ else if (IsA(node, VariableSetStmt))
334
+ {
335
+ return const_record_walker((Node *) ((VariableSetStmt *) node)->args, jstate);
336
+ }
337
+ else if (IsA(node, CopyStmt))
338
+ {
339
+ return const_record_walker((Node *) ((CopyStmt *) node)->query, jstate);
340
+ }
341
+ else if (IsA(node, ExplainStmt))
342
+ {
343
+ return const_record_walker((Node *) ((ExplainStmt *) node)->query, jstate);
344
+ }
345
+ else if (IsA(node, CreateRoleStmt))
346
+ {
347
+ return const_record_walker((Node *) ((CreateRoleStmt *) node)->options, jstate);
348
+ }
349
+ else if (IsA(node, AlterRoleStmt))
350
+ {
351
+ return const_record_walker((Node *) ((AlterRoleStmt *) node)->options, jstate);
352
+ }
353
+ else if (IsA(node, DeclareCursorStmt))
354
+ {
355
+ return const_record_walker((Node *) ((DeclareCursorStmt *) node)->query, jstate);
356
+ }
357
+
358
+ PG_TRY();
359
+ {
360
+ result = raw_expression_tree_walker(node, const_record_walker, (void*) jstate);
361
+ }
362
+ PG_CATCH();
363
+ {
364
+ MemoryContextSwitchTo(normalize_context);
365
+ result = false;
366
+ FlushErrorState();
367
+ }
368
+ PG_END_TRY();
369
+
370
+ return result;
371
+ }
372
+
373
+ PgQueryNormalizeResult pg_query_normalize(const char* input)
374
+ {
375
+ MemoryContext ctx = NULL;
376
+ PgQueryNormalizeResult result = {0};
377
+
378
+ ctx = pg_query_enter_memory_context();
379
+
380
+ PG_TRY();
381
+ {
382
+ List *tree;
383
+ pgssConstLocations jstate;
384
+ int query_len;
385
+
386
+ /* Parse query */
387
+ tree = raw_parser(input);
388
+
389
+ query_len = (int) strlen(input);
390
+
391
+ /* Set up workspace for constant recording */
392
+ jstate.clocations_buf_size = 32;
393
+ jstate.clocations = (pgssLocationLen *)
394
+ palloc(jstate.clocations_buf_size * sizeof(pgssLocationLen));
395
+ jstate.clocations_count = 0;
396
+ jstate.highest_extern_param_id = 0;
397
+ jstate.query = input;
398
+ jstate.query_len = query_len;
399
+
400
+ /* Walk tree and record const locations */
401
+ const_record_walker((Node *) tree, &jstate);
402
+
403
+ /* Normalize query */
404
+ result.normalized_query = strdup(generate_normalized_query(&jstate, 0, &query_len, PG_UTF8));
405
+ }
406
+ PG_CATCH();
407
+ {
408
+ ErrorData* error_data;
409
+ PgQueryError* error;
410
+
411
+ MemoryContextSwitchTo(ctx);
412
+ error_data = CopyErrorData();
413
+
414
+ error = malloc(sizeof(PgQueryError));
415
+ error->message = strdup(error_data->message);
416
+ error->filename = strdup(error_data->filename);
417
+ error->lineno = error_data->lineno;
418
+ error->cursorpos = error_data->cursorpos;
419
+
420
+ result.error = error;
421
+ FlushErrorState();
422
+ }
423
+ PG_END_TRY();
424
+
425
+ pg_query_exit_memory_context(ctx);
426
+
427
+ return result;
428
+ }
429
+
430
+ void pg_query_free_normalize_result(PgQueryNormalizeResult result)
431
+ {
432
+ if (result.error) {
433
+ free(result.error->message);
434
+ free(result.error->filename);
435
+ free(result.error);
436
+ }
437
+
438
+ free(result.normalized_query);
439
+ }
@@ -0,0 +1,10 @@
1
+ #ifndef PG_QUERY_OUTFUNCS_H
2
+ #define PG_QUERY_OUTFUNCS_H
3
+
4
+ #include "pg_query.h"
5
+
6
+ PgQueryProtobuf pg_query_nodes_to_protobuf(const void *obj);
7
+
8
+ char *pg_query_nodes_to_json(const void *obj);
9
+
10
+ #endif