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,56 @@
1
+ /*-------------------------------------------------------------------------
2
+ *
3
+ * pidfile.h
4
+ * Declarations describing the data directory lock file (postmaster.pid)
5
+ *
6
+ * Portions Copyright (c) 1996-2020, PostgreSQL Global Development Group
7
+ * Portions Copyright (c) 1994, Regents of the University of California
8
+ *
9
+ * src/include/utils/pidfile.h
10
+ *
11
+ *-------------------------------------------------------------------------
12
+ */
13
+ #ifndef UTILS_PIDFILE_H
14
+ #define UTILS_PIDFILE_H
15
+
16
+ /*
17
+ * As of Postgres 10, the contents of the data-directory lock file are:
18
+ *
19
+ * line #
20
+ * 1 postmaster PID (or negative of a standalone backend's PID)
21
+ * 2 data directory path
22
+ * 3 postmaster start timestamp (time_t representation)
23
+ * 4 port number
24
+ * 5 first Unix socket directory path (empty if none)
25
+ * 6 first listen_address (IP address or "*"; empty if no TCP port)
26
+ * 7 shared memory key (empty on Windows)
27
+ * 8 postmaster status (see values below)
28
+ *
29
+ * Lines 6 and up are added via AddToDataDirLockFile() after initial file
30
+ * creation; also, line 5 is initially empty and is changed after the first
31
+ * Unix socket is opened. Onlookers should not assume that lines 4 and up
32
+ * are filled in any particular order.
33
+ *
34
+ * Socket lock file(s), if used, have the same contents as lines 1-5, with
35
+ * line 5 being their own directory.
36
+ */
37
+ #define LOCK_FILE_LINE_PID 1
38
+ #define LOCK_FILE_LINE_DATA_DIR 2
39
+ #define LOCK_FILE_LINE_START_TIME 3
40
+ #define LOCK_FILE_LINE_PORT 4
41
+ #define LOCK_FILE_LINE_SOCKET_DIR 5
42
+ #define LOCK_FILE_LINE_LISTEN_ADDR 6
43
+ #define LOCK_FILE_LINE_SHMEM_KEY 7
44
+ #define LOCK_FILE_LINE_PM_STATUS 8
45
+
46
+ /*
47
+ * The PM_STATUS line may contain one of these values. All these strings
48
+ * must be the same length, per comments for AddToDataDirLockFile().
49
+ * We pad with spaces as needed to make that true.
50
+ */
51
+ #define PM_STATUS_STARTING "starting" /* still starting up */
52
+ #define PM_STATUS_STOPPING "stopping" /* in shutdown sequence */
53
+ #define PM_STATUS_READY "ready " /* ready for connections */
54
+ #define PM_STATUS_STANDBY "standby " /* up, won't accept connections */
55
+
56
+ #endif /* UTILS_PIDFILE_H */
@@ -0,0 +1,235 @@
1
+ /*-------------------------------------------------------------------------
2
+ *
3
+ * plancache.h
4
+ * Plan cache definitions.
5
+ *
6
+ * See plancache.c for comments.
7
+ *
8
+ * Portions Copyright (c) 1996-2020, PostgreSQL Global Development Group
9
+ * Portions Copyright (c) 1994, Regents of the University of California
10
+ *
11
+ * src/include/utils/plancache.h
12
+ *
13
+ *-------------------------------------------------------------------------
14
+ */
15
+ #ifndef PLANCACHE_H
16
+ #define PLANCACHE_H
17
+
18
+ #include "access/tupdesc.h"
19
+ #include "lib/ilist.h"
20
+ #include "nodes/params.h"
21
+ #include "tcop/cmdtag.h"
22
+ #include "utils/queryenvironment.h"
23
+ #include "utils/resowner.h"
24
+
25
+
26
+ /* Forward declaration, to avoid including parsenodes.h here */
27
+ struct RawStmt;
28
+
29
+ /* possible values for plan_cache_mode */
30
+ typedef enum
31
+ {
32
+ PLAN_CACHE_MODE_AUTO,
33
+ PLAN_CACHE_MODE_FORCE_GENERIC_PLAN,
34
+ PLAN_CACHE_MODE_FORCE_CUSTOM_PLAN
35
+ } PlanCacheMode;
36
+
37
+ /* GUC parameter */
38
+ extern int plan_cache_mode;
39
+
40
+ #define CACHEDPLANSOURCE_MAGIC 195726186
41
+ #define CACHEDPLAN_MAGIC 953717834
42
+ #define CACHEDEXPR_MAGIC 838275847
43
+
44
+ /*
45
+ * CachedPlanSource (which might better have been called CachedQuery)
46
+ * represents a SQL query that we expect to use multiple times. It stores
47
+ * the query source text, the raw parse tree, and the analyzed-and-rewritten
48
+ * query tree, as well as adjunct data. Cache invalidation can happen as a
49
+ * result of DDL affecting objects used by the query. In that case we discard
50
+ * the analyzed-and-rewritten query tree, and rebuild it when next needed.
51
+ *
52
+ * An actual execution plan, represented by CachedPlan, is derived from the
53
+ * CachedPlanSource when we need to execute the query. The plan could be
54
+ * either generic (usable with any set of plan parameters) or custom (for a
55
+ * specific set of parameters). plancache.c contains the logic that decides
56
+ * which way to do it for any particular execution. If we are using a generic
57
+ * cached plan then it is meant to be re-used across multiple executions, so
58
+ * callers must always treat CachedPlans as read-only.
59
+ *
60
+ * Once successfully built and "saved", CachedPlanSources typically live
61
+ * for the life of the backend, although they can be dropped explicitly.
62
+ * CachedPlans are reference-counted and go away automatically when the last
63
+ * reference is dropped. A CachedPlan can outlive the CachedPlanSource it
64
+ * was created from.
65
+ *
66
+ * An "unsaved" CachedPlanSource can be used for generating plans, but it
67
+ * lives in transient storage and will not be updated in response to sinval
68
+ * events.
69
+ *
70
+ * CachedPlans made from saved CachedPlanSources are likewise in permanent
71
+ * storage, so to avoid memory leaks, the reference-counted references to them
72
+ * must be held in permanent data structures or ResourceOwners. CachedPlans
73
+ * made from unsaved CachedPlanSources are in children of the caller's
74
+ * memory context, so references to them should not be longer-lived than
75
+ * that context. (Reference counting is somewhat pro forma in that case,
76
+ * though it may be useful if the CachedPlan can be discarded early.)
77
+ *
78
+ * A CachedPlanSource has two associated memory contexts: one that holds the
79
+ * struct itself, the query source text and the raw parse tree, and another
80
+ * context that holds the rewritten query tree and associated data. This
81
+ * allows the query tree to be discarded easily when it is invalidated.
82
+ *
83
+ * Some callers wish to use the CachedPlan API even with one-shot queries
84
+ * that have no reason to be saved at all. We therefore support a "oneshot"
85
+ * variant that does no data copying or invalidation checking. In this case
86
+ * there are no separate memory contexts: the CachedPlanSource struct and
87
+ * all subsidiary data live in the caller's CurrentMemoryContext, and there
88
+ * is no way to free memory short of clearing that entire context. A oneshot
89
+ * plan is always treated as unsaved.
90
+ *
91
+ * Note: the string referenced by commandTag is not subsidiary storage;
92
+ * it is assumed to be a compile-time-constant string. As with portals,
93
+ * commandTag shall be NULL if and only if the original query string (before
94
+ * rewriting) was an empty string.
95
+ */
96
+ typedef struct CachedPlanSource
97
+ {
98
+ int magic; /* should equal CACHEDPLANSOURCE_MAGIC */
99
+ struct RawStmt *raw_parse_tree; /* output of raw_parser(), or NULL */
100
+ const char *query_string; /* source text of query */
101
+ CommandTag commandTag; /* 'nuff said */
102
+ Oid *param_types; /* array of parameter type OIDs, or NULL */
103
+ int num_params; /* length of param_types array */
104
+ ParserSetupHook parserSetup; /* alternative parameter spec method */
105
+ void *parserSetupArg;
106
+ int cursor_options; /* cursor options used for planning */
107
+ bool fixed_result; /* disallow change in result tupdesc? */
108
+ TupleDesc resultDesc; /* result type; NULL = doesn't return tuples */
109
+ MemoryContext context; /* memory context holding all above */
110
+ /* These fields describe the current analyzed-and-rewritten query tree: */
111
+ List *query_list; /* list of Query nodes, or NIL if not valid */
112
+ List *relationOids; /* OIDs of relations the queries depend on */
113
+ List *invalItems; /* other dependencies, as PlanInvalItems */
114
+ struct OverrideSearchPath *search_path; /* search_path used for parsing
115
+ * and planning */
116
+ MemoryContext query_context; /* context holding the above, or NULL */
117
+ Oid rewriteRoleId; /* Role ID we did rewriting for */
118
+ bool rewriteRowSecurity; /* row_security used during rewrite */
119
+ bool dependsOnRLS; /* is rewritten query specific to the above? */
120
+ /* If we have a generic plan, this is a reference-counted link to it: */
121
+ struct CachedPlan *gplan; /* generic plan, or NULL if not valid */
122
+ /* Some state flags: */
123
+ bool is_oneshot; /* is it a "oneshot" plan? */
124
+ bool is_complete; /* has CompleteCachedPlan been done? */
125
+ bool is_saved; /* has CachedPlanSource been "saved"? */
126
+ bool is_valid; /* is the query_list currently valid? */
127
+ int generation; /* increments each time we create a plan */
128
+ /* If CachedPlanSource has been saved, it is a member of a global list */
129
+ dlist_node node; /* list link, if is_saved */
130
+ /* State kept to help decide whether to use custom or generic plans: */
131
+ double generic_cost; /* cost of generic plan, or -1 if not known */
132
+ double total_custom_cost; /* total cost of custom plans so far */
133
+ int num_custom_plans; /* number of plans included in total */
134
+ } CachedPlanSource;
135
+
136
+ /*
137
+ * CachedPlan represents an execution plan derived from a CachedPlanSource.
138
+ * The reference count includes both the link from the parent CachedPlanSource
139
+ * (if any), and any active plan executions, so the plan can be discarded
140
+ * exactly when refcount goes to zero. Both the struct itself and the
141
+ * subsidiary data live in the context denoted by the context field.
142
+ * This makes it easy to free a no-longer-needed cached plan. (However,
143
+ * if is_oneshot is true, the context does not belong solely to the CachedPlan
144
+ * so no freeing is possible.)
145
+ */
146
+ typedef struct CachedPlan
147
+ {
148
+ int magic; /* should equal CACHEDPLAN_MAGIC */
149
+ List *stmt_list; /* list of PlannedStmts */
150
+ bool is_oneshot; /* is it a "oneshot" plan? */
151
+ bool is_saved; /* is CachedPlan in a long-lived context? */
152
+ bool is_valid; /* is the stmt_list currently valid? */
153
+ Oid planRoleId; /* Role ID the plan was created for */
154
+ bool dependsOnRole; /* is plan specific to that role? */
155
+ TransactionId saved_xmin; /* if valid, replan when TransactionXmin
156
+ * changes from this value */
157
+ int generation; /* parent's generation number for this plan */
158
+ int refcount; /* count of live references to this struct */
159
+ MemoryContext context; /* context containing this CachedPlan */
160
+ } CachedPlan;
161
+
162
+ /*
163
+ * CachedExpression is a low-overhead mechanism for caching the planned form
164
+ * of standalone scalar expressions. While such expressions are not usually
165
+ * subject to cache invalidation events, that can happen, for example because
166
+ * of replacement of a SQL function that was inlined into the expression.
167
+ * The plancache takes care of storing the expression tree and marking it
168
+ * invalid if a cache invalidation occurs, but the caller must notice the
169
+ * !is_valid status and discard the obsolete expression without reusing it.
170
+ * We do not store the original parse tree, only the planned expression;
171
+ * this is an optimization based on the assumption that we usually will not
172
+ * need to replan for the life of the session.
173
+ */
174
+ typedef struct CachedExpression
175
+ {
176
+ int magic; /* should equal CACHEDEXPR_MAGIC */
177
+ Node *expr; /* planned form of expression */
178
+ bool is_valid; /* is the expression still valid? */
179
+ /* remaining fields should be treated as private to plancache.c: */
180
+ List *relationOids; /* OIDs of relations the expr depends on */
181
+ List *invalItems; /* other dependencies, as PlanInvalItems */
182
+ MemoryContext context; /* context containing this CachedExpression */
183
+ dlist_node node; /* link in global list of CachedExpressions */
184
+ } CachedExpression;
185
+
186
+
187
+ extern void InitPlanCache(void);
188
+ extern void ResetPlanCache(void);
189
+
190
+ extern CachedPlanSource *CreateCachedPlan(struct RawStmt *raw_parse_tree,
191
+ const char *query_string,
192
+ CommandTag commandTag);
193
+ extern CachedPlanSource *CreateOneShotCachedPlan(struct RawStmt *raw_parse_tree,
194
+ const char *query_string,
195
+ CommandTag commandTag);
196
+ extern void CompleteCachedPlan(CachedPlanSource *plansource,
197
+ List *querytree_list,
198
+ MemoryContext querytree_context,
199
+ Oid *param_types,
200
+ int num_params,
201
+ ParserSetupHook parserSetup,
202
+ void *parserSetupArg,
203
+ int cursor_options,
204
+ bool fixed_result);
205
+
206
+ extern void SaveCachedPlan(CachedPlanSource *plansource);
207
+ extern void DropCachedPlan(CachedPlanSource *plansource);
208
+
209
+ extern void CachedPlanSetParentContext(CachedPlanSource *plansource,
210
+ MemoryContext newcontext);
211
+
212
+ extern CachedPlanSource *CopyCachedPlan(CachedPlanSource *plansource);
213
+
214
+ extern bool CachedPlanIsValid(CachedPlanSource *plansource);
215
+
216
+ extern List *CachedPlanGetTargetList(CachedPlanSource *plansource,
217
+ QueryEnvironment *queryEnv);
218
+
219
+ extern CachedPlan *GetCachedPlan(CachedPlanSource *plansource,
220
+ ParamListInfo boundParams,
221
+ bool useResOwner,
222
+ QueryEnvironment *queryEnv);
223
+ extern void ReleaseCachedPlan(CachedPlan *plan, bool useResOwner);
224
+
225
+ extern bool CachedPlanAllowsSimpleValidityCheck(CachedPlanSource *plansource,
226
+ CachedPlan *plan,
227
+ ResourceOwner owner);
228
+ extern bool CachedPlanIsSimplyValid(CachedPlanSource *plansource,
229
+ CachedPlan *plan,
230
+ ResourceOwner owner);
231
+
232
+ extern CachedExpression *GetCachedExpression(Node *expr);
233
+ extern void FreeCachedExpression(CachedExpression *cexpr);
234
+
235
+ #endif /* PLANCACHE_H */
@@ -0,0 +1,241 @@
1
+ /*-------------------------------------------------------------------------
2
+ *
3
+ * portal.h
4
+ * POSTGRES portal definitions.
5
+ *
6
+ * A portal is an abstraction which represents the execution state of
7
+ * a running or runnable query. Portals support both SQL-level CURSORs
8
+ * and protocol-level portals.
9
+ *
10
+ * Scrolling (nonsequential access) and suspension of execution are allowed
11
+ * only for portals that contain a single SELECT-type query. We do not want
12
+ * to let the client suspend an update-type query partway through! Because
13
+ * the query rewriter does not allow arbitrary ON SELECT rewrite rules,
14
+ * only queries that were originally update-type could produce multiple
15
+ * plan trees; so the restriction to a single query is not a problem
16
+ * in practice.
17
+ *
18
+ * For SQL cursors, we support three kinds of scroll behavior:
19
+ *
20
+ * (1) Neither NO SCROLL nor SCROLL was specified: to remain backward
21
+ * compatible, we allow backward fetches here, unless it would
22
+ * impose additional runtime overhead to do so.
23
+ *
24
+ * (2) NO SCROLL was specified: don't allow any backward fetches.
25
+ *
26
+ * (3) SCROLL was specified: allow all kinds of backward fetches, even
27
+ * if we need to take a performance hit to do so. (The planner sticks
28
+ * a Materialize node atop the query plan if needed.)
29
+ *
30
+ * Case #1 is converted to #2 or #3 by looking at the query itself and
31
+ * determining if scrollability can be supported without additional
32
+ * overhead.
33
+ *
34
+ * Protocol-level portals have no nonsequential-fetch API and so the
35
+ * distinction doesn't matter for them. They are always initialized
36
+ * to look like NO SCROLL cursors.
37
+ *
38
+ *
39
+ * Portions Copyright (c) 1996-2020, PostgreSQL Global Development Group
40
+ * Portions Copyright (c) 1994, Regents of the University of California
41
+ *
42
+ * src/include/utils/portal.h
43
+ *
44
+ *-------------------------------------------------------------------------
45
+ */
46
+ #ifndef PORTAL_H
47
+ #define PORTAL_H
48
+
49
+ #include "datatype/timestamp.h"
50
+ #include "executor/execdesc.h"
51
+ #include "tcop/cmdtag.h"
52
+ #include "utils/plancache.h"
53
+ #include "utils/resowner.h"
54
+
55
+ /*
56
+ * We have several execution strategies for Portals, depending on what
57
+ * query or queries are to be executed. (Note: in all cases, a Portal
58
+ * executes just a single source-SQL query, and thus produces just a
59
+ * single result from the user's viewpoint. However, the rule rewriter
60
+ * may expand the single source query to zero or many actual queries.)
61
+ *
62
+ * PORTAL_ONE_SELECT: the portal contains one single SELECT query. We run
63
+ * the Executor incrementally as results are demanded. This strategy also
64
+ * supports holdable cursors (the Executor results can be dumped into a
65
+ * tuplestore for access after transaction completion).
66
+ *
67
+ * PORTAL_ONE_RETURNING: the portal contains a single INSERT/UPDATE/DELETE
68
+ * query with a RETURNING clause (plus possibly auxiliary queries added by
69
+ * rule rewriting). On first execution, we run the portal to completion
70
+ * and dump the primary query's results into the portal tuplestore; the
71
+ * results are then returned to the client as demanded. (We can't support
72
+ * suspension of the query partway through, because the AFTER TRIGGER code
73
+ * can't cope, and also because we don't want to risk failing to execute
74
+ * all the auxiliary queries.)
75
+ *
76
+ * PORTAL_ONE_MOD_WITH: the portal contains one single SELECT query, but
77
+ * it has data-modifying CTEs. This is currently treated the same as the
78
+ * PORTAL_ONE_RETURNING case because of the possibility of needing to fire
79
+ * triggers. It may act more like PORTAL_ONE_SELECT in future.
80
+ *
81
+ * PORTAL_UTIL_SELECT: the portal contains a utility statement that returns
82
+ * a SELECT-like result (for example, EXPLAIN or SHOW). On first execution,
83
+ * we run the statement and dump its results into the portal tuplestore;
84
+ * the results are then returned to the client as demanded.
85
+ *
86
+ * PORTAL_MULTI_QUERY: all other cases. Here, we do not support partial
87
+ * execution: the portal's queries will be run to completion on first call.
88
+ */
89
+ typedef enum PortalStrategy
90
+ {
91
+ PORTAL_ONE_SELECT,
92
+ PORTAL_ONE_RETURNING,
93
+ PORTAL_ONE_MOD_WITH,
94
+ PORTAL_UTIL_SELECT,
95
+ PORTAL_MULTI_QUERY
96
+ } PortalStrategy;
97
+
98
+ /*
99
+ * A portal is always in one of these states. It is possible to transit
100
+ * from ACTIVE back to READY if the query is not run to completion;
101
+ * otherwise we never back up in status.
102
+ */
103
+ typedef enum PortalStatus
104
+ {
105
+ PORTAL_NEW, /* freshly created */
106
+ PORTAL_DEFINED, /* PortalDefineQuery done */
107
+ PORTAL_READY, /* PortalStart complete, can run it */
108
+ PORTAL_ACTIVE, /* portal is running (can't delete it) */
109
+ PORTAL_DONE, /* portal is finished (don't re-run it) */
110
+ PORTAL_FAILED /* portal got error (can't re-run it) */
111
+ } PortalStatus;
112
+
113
+ typedef struct PortalData *Portal;
114
+
115
+ typedef struct PortalData
116
+ {
117
+ /* Bookkeeping data */
118
+ const char *name; /* portal's name */
119
+ const char *prepStmtName; /* source prepared statement (NULL if none) */
120
+ MemoryContext portalContext; /* subsidiary memory for portal */
121
+ ResourceOwner resowner; /* resources owned by portal */
122
+ void (*cleanup) (Portal portal); /* cleanup hook */
123
+
124
+ /*
125
+ * State data for remembering which subtransaction(s) the portal was
126
+ * created or used in. If the portal is held over from a previous
127
+ * transaction, both subxids are InvalidSubTransactionId. Otherwise,
128
+ * createSubid is the creating subxact and activeSubid is the last subxact
129
+ * in which we ran the portal.
130
+ */
131
+ SubTransactionId createSubid; /* the creating subxact */
132
+ SubTransactionId activeSubid; /* the last subxact with activity */
133
+
134
+ /* The query or queries the portal will execute */
135
+ const char *sourceText; /* text of query (as of 8.4, never NULL) */
136
+ CommandTag commandTag; /* command tag for original query */
137
+ QueryCompletion qc; /* command completion data for executed query */
138
+ List *stmts; /* list of PlannedStmts */
139
+ CachedPlan *cplan; /* CachedPlan, if stmts are from one */
140
+
141
+ ParamListInfo portalParams; /* params to pass to query */
142
+ QueryEnvironment *queryEnv; /* environment for query */
143
+
144
+ /* Features/options */
145
+ PortalStrategy strategy; /* see above */
146
+ int cursorOptions; /* DECLARE CURSOR option bits */
147
+ bool run_once; /* portal will only be run once */
148
+
149
+ /* Status data */
150
+ PortalStatus status; /* see above */
151
+ bool portalPinned; /* a pinned portal can't be dropped */
152
+ bool autoHeld; /* was automatically converted from pinned to
153
+ * held (see HoldPinnedPortals()) */
154
+
155
+ /* If not NULL, Executor is active; call ExecutorEnd eventually: */
156
+ QueryDesc *queryDesc; /* info needed for executor invocation */
157
+
158
+ /* If portal returns tuples, this is their tupdesc: */
159
+ TupleDesc tupDesc; /* descriptor for result tuples */
160
+ /* and these are the format codes to use for the columns: */
161
+ int16 *formats; /* a format code for each column */
162
+
163
+ /*
164
+ * Where we store tuples for a held cursor or a PORTAL_ONE_RETURNING or
165
+ * PORTAL_UTIL_SELECT query. (A cursor held past the end of its
166
+ * transaction no longer has any active executor state.)
167
+ */
168
+ Tuplestorestate *holdStore; /* store for holdable cursors */
169
+ MemoryContext holdContext; /* memory containing holdStore */
170
+
171
+ /*
172
+ * Snapshot under which tuples in the holdStore were read. We must keep a
173
+ * reference to this snapshot if there is any possibility that the tuples
174
+ * contain TOAST references, because releasing the snapshot could allow
175
+ * recently-dead rows to be vacuumed away, along with any toast data
176
+ * belonging to them. In the case of a held cursor, we avoid needing to
177
+ * keep such a snapshot by forcibly detoasting the data.
178
+ */
179
+ Snapshot holdSnapshot; /* registered snapshot, or NULL if none */
180
+
181
+ /*
182
+ * atStart, atEnd and portalPos indicate the current cursor position.
183
+ * portalPos is zero before the first row, N after fetching N'th row of
184
+ * query. After we run off the end, portalPos = # of rows in query, and
185
+ * atEnd is true. Note that atStart implies portalPos == 0, but not the
186
+ * reverse: we might have backed up only as far as the first row, not to
187
+ * the start. Also note that various code inspects atStart and atEnd, but
188
+ * only the portal movement routines should touch portalPos.
189
+ */
190
+ bool atStart;
191
+ bool atEnd;
192
+ uint64 portalPos;
193
+
194
+ /* Presentation data, primarily used by the pg_cursors system view */
195
+ TimestampTz creation_time; /* time at which this portal was defined */
196
+ bool visible; /* include this portal in pg_cursors? */
197
+ } PortalData;
198
+
199
+ /*
200
+ * PortalIsValid
201
+ * True iff portal is valid.
202
+ */
203
+ #define PortalIsValid(p) PointerIsValid(p)
204
+
205
+
206
+ /* Prototypes for functions in utils/mmgr/portalmem.c */
207
+ extern void EnablePortalManager(void);
208
+ extern bool PreCommit_Portals(bool isPrepare);
209
+ extern void AtAbort_Portals(void);
210
+ extern void AtCleanup_Portals(void);
211
+ extern void PortalErrorCleanup(void);
212
+ extern void AtSubCommit_Portals(SubTransactionId mySubid,
213
+ SubTransactionId parentSubid,
214
+ ResourceOwner parentXactOwner);
215
+ extern void AtSubAbort_Portals(SubTransactionId mySubid,
216
+ SubTransactionId parentSubid,
217
+ ResourceOwner myXactOwner,
218
+ ResourceOwner parentXactOwner);
219
+ extern void AtSubCleanup_Portals(SubTransactionId mySubid);
220
+ extern Portal CreatePortal(const char *name, bool allowDup, bool dupSilent);
221
+ extern Portal CreateNewPortal(void);
222
+ extern void PinPortal(Portal portal);
223
+ extern void UnpinPortal(Portal portal);
224
+ extern void MarkPortalActive(Portal portal);
225
+ extern void MarkPortalDone(Portal portal);
226
+ extern void MarkPortalFailed(Portal portal);
227
+ extern void PortalDrop(Portal portal, bool isTopCommit);
228
+ extern Portal GetPortalByName(const char *name);
229
+ extern void PortalDefineQuery(Portal portal,
230
+ const char *prepStmtName,
231
+ const char *sourceText,
232
+ CommandTag commandTag,
233
+ List *stmts,
234
+ CachedPlan *cplan);
235
+ extern PlannedStmt *PortalGetPrimaryStmt(Portal portal);
236
+ extern void PortalCreateHoldStore(Portal portal);
237
+ extern void PortalHashTableDeleteAll(void);
238
+ extern bool ThereAreNoReadyPortals(void);
239
+ extern void HoldPinnedPortals(void);
240
+
241
+ #endif /* PORTAL_H */