pg_query 2.1.0 → 4.2.1

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 (472) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +104 -0
  3. data/README.md +59 -31
  4. data/Rakefile +2 -2
  5. data/ext/pg_query/extconf.rb +8 -2
  6. data/ext/pg_query/include/access/amapi.h +45 -1
  7. data/ext/pg_query/include/access/attmap.h +1 -1
  8. data/ext/pg_query/include/access/attnum.h +2 -2
  9. data/ext/pg_query/include/access/clog.h +4 -2
  10. data/ext/pg_query/include/access/commit_ts.h +6 -9
  11. data/ext/pg_query/include/access/detoast.h +1 -11
  12. data/ext/pg_query/include/access/genam.h +15 -12
  13. data/ext/pg_query/include/access/gin.h +2 -2
  14. data/ext/pg_query/include/access/htup.h +1 -1
  15. data/ext/pg_query/include/access/htup_details.h +75 -87
  16. data/ext/pg_query/include/access/itup.h +7 -1
  17. data/ext/pg_query/include/access/parallel.h +2 -2
  18. data/ext/pg_query/include/access/printtup.h +1 -1
  19. data/ext/pg_query/include/access/relation.h +1 -1
  20. data/ext/pg_query/include/access/relscan.h +17 -2
  21. data/ext/pg_query/include/access/rmgr.h +30 -3
  22. data/ext/pg_query/include/access/rmgrlist.h +23 -23
  23. data/ext/pg_query/include/access/sdir.h +1 -1
  24. data/ext/pg_query/include/access/skey.h +1 -1
  25. data/ext/pg_query/include/access/stratnum.h +4 -2
  26. data/ext/pg_query/include/access/sysattr.h +1 -1
  27. data/ext/pg_query/include/access/table.h +2 -1
  28. data/ext/pg_query/include/access/tableam.h +272 -20
  29. data/ext/pg_query/include/access/toast_compression.h +73 -0
  30. data/ext/pg_query/include/access/transam.h +123 -13
  31. data/ext/pg_query/include/access/tupconvert.h +1 -1
  32. data/ext/pg_query/include/access/tupdesc.h +1 -1
  33. data/ext/pg_query/include/access/tupmacs.h +3 -3
  34. data/ext/pg_query/include/access/twophase.h +5 -1
  35. data/ext/pg_query/include/access/xact.h +79 -19
  36. data/ext/pg_query/include/access/xlog.h +60 -155
  37. data/ext/pg_query/include/access/xlog_internal.h +50 -14
  38. data/ext/pg_query/include/access/xlogdefs.h +8 -16
  39. data/ext/pg_query/include/access/xlogprefetcher.h +55 -0
  40. data/ext/pg_query/include/access/xlogreader.h +148 -32
  41. data/ext/pg_query/include/access/xlogrecord.h +18 -9
  42. data/ext/pg_query/include/access/xlogrecovery.h +157 -0
  43. data/ext/pg_query/include/c.h +101 -44
  44. data/ext/pg_query/include/catalog/catalog.h +3 -1
  45. data/ext/pg_query/include/catalog/catversion.h +2 -2
  46. data/ext/pg_query/include/catalog/dependency.h +10 -16
  47. data/ext/pg_query/include/catalog/genbki.h +83 -5
  48. data/ext/pg_query/include/catalog/index.h +18 -3
  49. data/ext/pg_query/include/catalog/indexing.h +12 -324
  50. data/ext/pg_query/include/catalog/namespace.h +4 -2
  51. data/ext/pg_query/include/catalog/objectaccess.h +70 -2
  52. data/ext/pg_query/include/catalog/objectaddress.h +11 -6
  53. data/ext/pg_query/include/catalog/pg_aggregate.h +14 -10
  54. data/ext/pg_query/include/catalog/pg_aggregate_d.h +2 -1
  55. data/ext/pg_query/include/catalog/pg_am.h +4 -1
  56. data/ext/pg_query/include/catalog/pg_am_d.h +3 -1
  57. data/ext/pg_query/include/catalog/pg_attribute.h +27 -10
  58. data/ext/pg_query/include/catalog/pg_attribute_d.h +21 -18
  59. data/ext/pg_query/include/catalog/pg_authid.h +7 -2
  60. data/ext/pg_query/include/catalog/pg_authid_d.h +17 -9
  61. data/ext/pg_query/include/catalog/pg_class.h +45 -15
  62. data/ext/pg_query/include/catalog/pg_class_d.h +31 -2
  63. data/ext/pg_query/include/catalog/pg_collation.h +33 -8
  64. data/ext/pg_query/include/catalog/pg_collation_d.h +20 -3
  65. data/ext/pg_query/include/catalog/pg_constraint.h +38 -12
  66. data/ext/pg_query/include/catalog/pg_constraint_d.h +10 -4
  67. data/ext/pg_query/include/catalog/pg_control.h +5 -5
  68. data/ext/pg_query/include/catalog/pg_conversion.h +7 -4
  69. data/ext/pg_query/include/catalog/pg_conversion_d.h +4 -1
  70. data/ext/pg_query/include/catalog/pg_depend.h +11 -7
  71. data/ext/pg_query/include/catalog/pg_depend_d.h +3 -1
  72. data/ext/pg_query/include/catalog/pg_event_trigger.h +9 -3
  73. data/ext/pg_query/include/catalog/pg_event_trigger_d.h +3 -1
  74. data/ext/pg_query/include/catalog/pg_index.h +17 -7
  75. data/ext/pg_query/include/catalog/pg_index_d.h +20 -17
  76. data/ext/pg_query/include/catalog/pg_language.h +10 -5
  77. data/ext/pg_query/include/catalog/pg_language_d.h +3 -1
  78. data/ext/pg_query/include/catalog/pg_namespace.h +7 -2
  79. data/ext/pg_query/include/catalog/pg_namespace_d.h +3 -1
  80. data/ext/pg_query/include/catalog/pg_opclass.h +8 -5
  81. data/ext/pg_query/include/catalog/pg_opclass_d.h +3 -1
  82. data/ext/pg_query/include/catalog/pg_operator.h +21 -16
  83. data/ext/pg_query/include/catalog/pg_operator_d.h +37 -1
  84. data/ext/pg_query/include/catalog/pg_opfamily.h +6 -3
  85. data/ext/pg_query/include/catalog/pg_opfamily_d.h +3 -1
  86. data/ext/pg_query/include/catalog/pg_parameter_acl.h +60 -0
  87. data/ext/pg_query/include/catalog/pg_parameter_acl_d.h +34 -0
  88. data/ext/pg_query/include/catalog/pg_partitioned_table.h +20 -9
  89. data/ext/pg_query/include/catalog/pg_partitioned_table_d.h +2 -1
  90. data/ext/pg_query/include/catalog/pg_proc.h +20 -11
  91. data/ext/pg_query/include/catalog/pg_proc_d.h +10 -8
  92. data/ext/pg_query/include/catalog/pg_publication.h +50 -4
  93. data/ext/pg_query/include/catalog/pg_publication_d.h +3 -1
  94. data/ext/pg_query/include/catalog/pg_replication_origin.h +6 -1
  95. data/ext/pg_query/include/catalog/pg_replication_origin_d.h +5 -1
  96. data/ext/pg_query/include/catalog/pg_statistic.h +19 -12
  97. data/ext/pg_query/include/catalog/pg_statistic_d.h +2 -1
  98. data/ext/pg_query/include/catalog/pg_statistic_ext.h +19 -5
  99. data/ext/pg_query/include/catalog/pg_statistic_ext_d.h +7 -2
  100. data/ext/pg_query/include/catalog/pg_transform.h +8 -5
  101. data/ext/pg_query/include/catalog/pg_transform_d.h +3 -1
  102. data/ext/pg_query/include/catalog/pg_trigger.h +24 -8
  103. data/ext/pg_query/include/catalog/pg_trigger_d.h +4 -1
  104. data/ext/pg_query/include/catalog/pg_ts_config.h +6 -3
  105. data/ext/pg_query/include/catalog/pg_ts_config_d.h +3 -1
  106. data/ext/pg_query/include/catalog/pg_ts_dict.h +8 -3
  107. data/ext/pg_query/include/catalog/pg_ts_dict_d.h +3 -1
  108. data/ext/pg_query/include/catalog/pg_ts_parser.h +6 -3
  109. data/ext/pg_query/include/catalog/pg_ts_parser_d.h +3 -1
  110. data/ext/pg_query/include/catalog/pg_ts_template.h +6 -3
  111. data/ext/pg_query/include/catalog/pg_ts_template_d.h +3 -1
  112. data/ext/pg_query/include/catalog/pg_type.h +56 -24
  113. data/ext/pg_query/include/catalog/pg_type_d.h +70 -31
  114. data/ext/pg_query/include/catalog/storage.h +5 -3
  115. data/ext/pg_query/include/commands/async.h +4 -5
  116. data/ext/pg_query/include/commands/dbcommands.h +2 -1
  117. data/ext/pg_query/include/commands/defrem.h +11 -24
  118. data/ext/pg_query/include/commands/event_trigger.h +2 -2
  119. data/ext/pg_query/include/commands/explain.h +1 -1
  120. data/ext/pg_query/include/commands/prepare.h +1 -1
  121. data/ext/pg_query/include/commands/tablespace.h +3 -1
  122. data/ext/pg_query/include/commands/trigger.h +27 -17
  123. data/ext/pg_query/include/commands/user.h +2 -2
  124. data/ext/pg_query/include/commands/vacuum.h +88 -41
  125. data/ext/pg_query/include/commands/variable.h +1 -1
  126. data/ext/pg_query/include/common/file_perm.h +4 -4
  127. data/ext/pg_query/include/common/hashfn.h +1 -1
  128. data/ext/pg_query/include/common/ip.h +1 -7
  129. data/ext/pg_query/include/common/keywords.h +2 -6
  130. data/ext/pg_query/include/common/kwlookup.h +1 -1
  131. data/ext/pg_query/include/common/pg_prng.h +60 -0
  132. data/ext/pg_query/include/common/relpath.h +2 -2
  133. data/ext/pg_query/include/common/string.h +24 -1
  134. data/ext/pg_query/include/common/unicode_combining_table.h +114 -2
  135. data/ext/pg_query/include/common/unicode_east_asian_fw_table.h +125 -0
  136. data/ext/pg_query/include/datatype/timestamp.h +40 -1
  137. data/ext/pg_query/include/executor/execdesc.h +1 -1
  138. data/ext/pg_query/include/executor/executor.h +65 -22
  139. data/ext/pg_query/include/executor/functions.h +17 -3
  140. data/ext/pg_query/include/executor/instrument.h +33 -16
  141. data/ext/pg_query/include/executor/spi.h +41 -3
  142. data/ext/pg_query/include/executor/tablefunc.h +1 -1
  143. data/ext/pg_query/include/executor/tuptable.h +1 -1
  144. data/ext/pg_query/include/fmgr.h +13 -7
  145. data/ext/pg_query/include/funcapi.h +16 -4
  146. data/ext/pg_query/include/getaddrinfo.h +1 -1
  147. data/ext/pg_query/include/jit/jit.h +11 -11
  148. data/ext/pg_query/include/kwlist_d.h +517 -494
  149. data/ext/pg_query/include/lib/dshash.h +112 -0
  150. data/ext/pg_query/include/lib/ilist.h +20 -1
  151. data/ext/pg_query/include/lib/pairingheap.h +1 -1
  152. data/ext/pg_query/include/lib/simplehash.h +150 -25
  153. data/ext/pg_query/include/lib/sort_template.h +432 -0
  154. data/ext/pg_query/include/lib/stringinfo.h +1 -1
  155. data/ext/pg_query/include/libpq/auth.h +6 -4
  156. data/ext/pg_query/include/libpq/crypt.h +5 -4
  157. data/ext/pg_query/include/libpq/hba.h +43 -4
  158. data/ext/pg_query/include/libpq/libpq-be.h +23 -6
  159. data/ext/pg_query/include/libpq/libpq.h +31 -20
  160. data/ext/pg_query/include/libpq/pqcomm.h +17 -31
  161. data/ext/pg_query/include/libpq/pqformat.h +1 -1
  162. data/ext/pg_query/include/libpq/pqsignal.h +4 -4
  163. data/ext/pg_query/include/mb/pg_wchar.h +106 -23
  164. data/ext/pg_query/include/mb/stringinfo_mb.h +1 -1
  165. data/ext/pg_query/include/miscadmin.h +71 -52
  166. data/ext/pg_query/include/nodes/bitmapset.h +1 -1
  167. data/ext/pg_query/include/nodes/execnodes.h +272 -80
  168. data/ext/pg_query/include/nodes/extensible.h +4 -2
  169. data/ext/pg_query/include/nodes/lockoptions.h +1 -1
  170. data/ext/pg_query/include/nodes/makefuncs.h +7 -6
  171. data/ext/pg_query/include/nodes/memnodes.h +5 -3
  172. data/ext/pg_query/include/nodes/nodeFuncs.h +1 -1
  173. data/ext/pg_query/include/nodes/nodes.h +30 -11
  174. data/ext/pg_query/include/nodes/params.h +1 -1
  175. data/ext/pg_query/include/nodes/parsenodes.h +327 -94
  176. data/ext/pg_query/include/nodes/pathnodes.h +245 -67
  177. data/ext/pg_query/include/nodes/pg_list.h +75 -68
  178. data/ext/pg_query/include/nodes/plannodes.h +128 -30
  179. data/ext/pg_query/include/nodes/primnodes.h +99 -47
  180. data/ext/pg_query/include/nodes/print.h +1 -1
  181. data/ext/pg_query/include/nodes/tidbitmap.h +1 -1
  182. data/ext/pg_query/include/nodes/value.h +58 -39
  183. data/ext/pg_query/include/optimizer/cost.h +9 -2
  184. data/ext/pg_query/include/optimizer/geqo.h +9 -7
  185. data/ext/pg_query/include/optimizer/geqo_gene.h +1 -1
  186. data/ext/pg_query/include/optimizer/optimizer.h +25 -22
  187. data/ext/pg_query/include/optimizer/paths.h +6 -6
  188. data/ext/pg_query/include/optimizer/planmain.h +15 -14
  189. data/ext/pg_query/include/parser/analyze.h +19 -5
  190. data/ext/pg_query/include/parser/gram.h +947 -913
  191. data/ext/pg_query/include/parser/gramparse.h +1 -1
  192. data/ext/pg_query/include/parser/kwlist.h +463 -453
  193. data/ext/pg_query/include/parser/parse_agg.h +2 -7
  194. data/ext/pg_query/include/parser/parse_coerce.h +4 -1
  195. data/ext/pg_query/include/parser/parse_expr.h +2 -3
  196. data/ext/pg_query/include/parser/parse_func.h +2 -1
  197. data/ext/pg_query/include/parser/parse_node.h +21 -9
  198. data/ext/pg_query/include/parser/parse_oper.h +1 -3
  199. data/ext/pg_query/include/parser/parse_relation.h +5 -4
  200. data/ext/pg_query/include/parser/parse_type.h +1 -1
  201. data/ext/pg_query/include/parser/parser.h +31 -4
  202. data/ext/pg_query/include/parser/parsetree.h +1 -1
  203. data/ext/pg_query/include/parser/scanner.h +1 -1
  204. data/ext/pg_query/include/parser/scansup.h +2 -5
  205. data/ext/pg_query/include/partitioning/partdefs.h +1 -1
  206. data/ext/pg_query/include/pg_config.h +94 -46
  207. data/ext/pg_query/include/pg_config_manual.h +74 -21
  208. data/ext/pg_query/include/pg_getopt.h +6 -6
  209. data/ext/pg_query/include/pg_query.h +5 -4
  210. data/ext/pg_query/include/pg_query_enum_defs.c +358 -241
  211. data/ext/pg_query/include/pg_query_fingerprint_conds.c +44 -7
  212. data/ext/pg_query/include/pg_query_fingerprint_defs.c +1220 -422
  213. data/ext/pg_query/include/pg_query_outfuncs_conds.c +43 -13
  214. data/ext/pg_query/include/pg_query_outfuncs_defs.c +152 -26
  215. data/ext/pg_query/include/pg_query_readfuncs_conds.c +11 -2
  216. data/ext/pg_query/include/pg_query_readfuncs_defs.c +174 -30
  217. data/ext/pg_query/include/pg_trace.h +1 -1
  218. data/ext/pg_query/include/pgstat.h +449 -1237
  219. data/ext/pg_query/include/pgtime.h +14 -4
  220. data/ext/pg_query/include/pl_gram.h +126 -128
  221. data/ext/pg_query/include/pl_reserved_kwlist.h +1 -1
  222. data/ext/pg_query/include/pl_reserved_kwlist_d.h +10 -10
  223. data/ext/pg_query/include/pl_unreserved_kwlist.h +2 -3
  224. data/ext/pg_query/include/pl_unreserved_kwlist_d.h +54 -56
  225. data/ext/pg_query/include/plerrcodes.h +9 -1
  226. data/ext/pg_query/include/plpgsql.h +52 -54
  227. data/ext/pg_query/include/port/atomics/arch-arm.h +7 -1
  228. data/ext/pg_query/include/port/atomics/arch-ppc.h +1 -1
  229. data/ext/pg_query/include/port/atomics/arch-x86.h +1 -1
  230. data/ext/pg_query/include/port/atomics/fallback.h +1 -1
  231. data/ext/pg_query/include/port/atomics/generic-gcc.h +3 -3
  232. data/ext/pg_query/include/port/atomics/generic.h +1 -1
  233. data/ext/pg_query/include/port/atomics.h +1 -1
  234. data/ext/pg_query/include/port/pg_bitutils.h +88 -12
  235. data/ext/pg_query/include/port/pg_bswap.h +1 -1
  236. data/ext/pg_query/include/port/pg_crc32c.h +1 -1
  237. data/ext/pg_query/include/port.h +72 -43
  238. data/ext/pg_query/include/portability/instr_time.h +1 -1
  239. data/ext/pg_query/include/postgres.h +60 -16
  240. data/ext/pg_query/include/postmaster/autovacuum.h +17 -17
  241. data/ext/pg_query/include/postmaster/auxprocess.h +20 -0
  242. data/ext/pg_query/include/postmaster/bgworker.h +2 -1
  243. data/ext/pg_query/include/postmaster/bgworker_internals.h +2 -2
  244. data/ext/pg_query/include/postmaster/bgwriter.h +5 -5
  245. data/ext/pg_query/include/postmaster/fork_process.h +1 -1
  246. data/ext/pg_query/include/postmaster/interrupt.h +1 -1
  247. data/ext/pg_query/include/postmaster/pgarch.h +42 -8
  248. data/ext/pg_query/include/postmaster/postmaster.h +18 -17
  249. data/ext/pg_query/include/postmaster/startup.h +39 -0
  250. data/ext/pg_query/include/postmaster/syslogger.h +15 -10
  251. data/ext/pg_query/include/postmaster/walwriter.h +3 -3
  252. data/ext/pg_query/include/protobuf/pg_query.pb-c.h +1422 -916
  253. data/ext/pg_query/include/protobuf/pg_query.pb.h +43678 -32769
  254. data/ext/pg_query/include/regex/regex.h +18 -16
  255. data/ext/pg_query/include/replication/logicallauncher.h +3 -5
  256. data/ext/pg_query/include/replication/logicalproto.h +161 -17
  257. data/ext/pg_query/include/replication/logicalworker.h +1 -1
  258. data/ext/pg_query/include/replication/origin.h +7 -7
  259. data/ext/pg_query/include/replication/reorderbuffer.h +262 -44
  260. data/ext/pg_query/include/replication/slot.h +23 -12
  261. data/ext/pg_query/include/replication/syncrep.h +5 -5
  262. data/ext/pg_query/include/replication/walreceiver.h +145 -13
  263. data/ext/pg_query/include/replication/walsender.h +8 -8
  264. data/ext/pg_query/include/rewrite/prs2lock.h +1 -1
  265. data/ext/pg_query/include/rewrite/rewriteHandler.h +1 -3
  266. data/ext/pg_query/include/rewrite/rewriteManip.h +1 -1
  267. data/ext/pg_query/include/rewrite/rewriteSupport.h +1 -1
  268. data/ext/pg_query/include/storage/backendid.h +3 -3
  269. data/ext/pg_query/include/storage/block.h +4 -10
  270. data/ext/pg_query/include/storage/buf.h +1 -1
  271. data/ext/pg_query/include/storage/bufmgr.h +19 -14
  272. data/ext/pg_query/include/storage/bufpage.h +6 -8
  273. data/ext/pg_query/include/storage/condition_variable.h +13 -2
  274. data/ext/pg_query/include/storage/dsm.h +4 -1
  275. data/ext/pg_query/include/storage/dsm_impl.h +3 -2
  276. data/ext/pg_query/include/storage/fd.h +33 -3
  277. data/ext/pg_query/include/storage/fileset.h +40 -0
  278. data/ext/pg_query/include/storage/ipc.h +4 -1
  279. data/ext/pg_query/include/storage/item.h +1 -1
  280. data/ext/pg_query/include/storage/itemid.h +1 -1
  281. data/ext/pg_query/include/storage/itemptr.h +3 -1
  282. data/ext/pg_query/include/storage/large_object.h +2 -2
  283. data/ext/pg_query/include/storage/latch.h +9 -13
  284. data/ext/pg_query/include/storage/lmgr.h +2 -1
  285. data/ext/pg_query/include/storage/lock.h +17 -13
  286. data/ext/pg_query/include/storage/lockdefs.h +2 -2
  287. data/ext/pg_query/include/storage/lwlock.h +6 -32
  288. data/ext/pg_query/include/storage/lwlocknames.h +0 -1
  289. data/ext/pg_query/include/storage/off.h +1 -1
  290. data/ext/pg_query/include/storage/pg_sema.h +1 -1
  291. data/ext/pg_query/include/storage/pg_shmem.h +9 -7
  292. data/ext/pg_query/include/storage/pmsignal.h +15 -4
  293. data/ext/pg_query/include/storage/predicate.h +4 -4
  294. data/ext/pg_query/include/storage/proc.h +183 -55
  295. data/ext/pg_query/include/storage/procarray.h +98 -0
  296. data/ext/pg_query/include/storage/proclist_types.h +1 -1
  297. data/ext/pg_query/include/storage/procsignal.h +3 -7
  298. data/ext/pg_query/include/storage/relfilenode.h +1 -1
  299. data/ext/pg_query/include/storage/s_lock.h +67 -4
  300. data/ext/pg_query/include/storage/sharedfileset.h +3 -11
  301. data/ext/pg_query/include/storage/shm_mq.h +5 -4
  302. data/ext/pg_query/include/storage/shm_toc.h +1 -1
  303. data/ext/pg_query/include/storage/shmem.h +1 -1
  304. data/ext/pg_query/include/storage/sinval.h +3 -3
  305. data/ext/pg_query/include/storage/sinvaladt.h +1 -1
  306. data/ext/pg_query/include/storage/smgr.h +10 -8
  307. data/ext/pg_query/include/storage/spin.h +2 -2
  308. data/ext/pg_query/include/storage/standby.h +13 -6
  309. data/ext/pg_query/include/storage/standbydefs.h +2 -2
  310. data/ext/pg_query/include/storage/sync.h +7 -3
  311. data/ext/pg_query/include/tcop/cmdtag.h +1 -1
  312. data/ext/pg_query/include/tcop/cmdtaglist.h +3 -2
  313. data/ext/pg_query/include/tcop/deparse_utility.h +1 -1
  314. data/ext/pg_query/include/tcop/dest.h +1 -1
  315. data/ext/pg_query/include/tcop/fastpath.h +1 -2
  316. data/ext/pg_query/include/tcop/pquery.h +7 -1
  317. data/ext/pg_query/include/tcop/tcopprot.h +19 -11
  318. data/ext/pg_query/include/tcop/utility.h +7 -3
  319. data/ext/pg_query/include/tsearch/ts_cache.h +2 -2
  320. data/ext/pg_query/include/utils/acl.h +24 -3
  321. data/ext/pg_query/include/utils/aclchk_internal.h +1 -1
  322. data/ext/pg_query/include/utils/array.h +7 -2
  323. data/ext/pg_query/include/utils/backend_progress.h +44 -0
  324. data/ext/pg_query/include/utils/backend_status.h +321 -0
  325. data/ext/pg_query/include/utils/builtins.h +11 -11
  326. data/ext/pg_query/include/utils/bytea.h +3 -2
  327. data/ext/pg_query/include/utils/catcache.h +1 -1
  328. data/ext/pg_query/include/utils/date.h +1 -1
  329. data/ext/pg_query/include/utils/datetime.h +8 -7
  330. data/ext/pg_query/include/utils/datum.h +9 -1
  331. data/ext/pg_query/include/utils/dsa.h +1 -1
  332. data/ext/pg_query/include/utils/dynahash.h +4 -3
  333. data/ext/pg_query/include/utils/elog.h +52 -21
  334. data/ext/pg_query/include/utils/errcodes.h +2 -0
  335. data/ext/pg_query/include/utils/expandeddatum.h +1 -1
  336. data/ext/pg_query/include/utils/expandedrecord.h +1 -1
  337. data/ext/pg_query/include/utils/float.h +7 -7
  338. data/ext/pg_query/include/utils/fmgroids.h +1300 -696
  339. data/ext/pg_query/include/utils/fmgrprotos.h +199 -16
  340. data/ext/pg_query/include/utils/fmgrtab.h +6 -5
  341. data/ext/pg_query/include/utils/guc.h +69 -43
  342. data/ext/pg_query/include/utils/guc_tables.h +23 -19
  343. data/ext/pg_query/include/utils/hsearch.h +15 -11
  344. data/ext/pg_query/include/utils/inval.h +5 -1
  345. data/ext/pg_query/include/utils/lsyscache.h +11 -1
  346. data/ext/pg_query/include/utils/memdebug.h +1 -1
  347. data/ext/pg_query/include/utils/memutils.h +8 -3
  348. data/ext/pg_query/include/utils/numeric.h +19 -5
  349. data/ext/pg_query/include/utils/palloc.h +25 -3
  350. data/ext/pg_query/include/utils/partcache.h +1 -1
  351. data/ext/pg_query/include/utils/pg_locale.h +17 -9
  352. data/ext/pg_query/include/utils/pg_lsn.h +1 -1
  353. data/ext/pg_query/include/utils/pgstat_internal.h +784 -0
  354. data/ext/pg_query/include/utils/pidfile.h +1 -1
  355. data/ext/pg_query/include/utils/plancache.h +6 -5
  356. data/ext/pg_query/include/utils/portal.h +12 -1
  357. data/ext/pg_query/include/utils/ps_status.h +1 -1
  358. data/ext/pg_query/include/utils/queryenvironment.h +1 -1
  359. data/ext/pg_query/include/utils/queryjumble.h +88 -0
  360. data/ext/pg_query/include/utils/regproc.h +14 -3
  361. data/ext/pg_query/include/utils/rel.h +71 -20
  362. data/ext/pg_query/include/utils/relcache.h +9 -7
  363. data/ext/pg_query/include/utils/reltrigger.h +1 -1
  364. data/ext/pg_query/include/utils/resowner.h +1 -1
  365. data/ext/pg_query/include/utils/rls.h +2 -2
  366. data/ext/pg_query/include/utils/ruleutils.h +4 -1
  367. data/ext/pg_query/include/utils/sharedtuplestore.h +1 -1
  368. data/ext/pg_query/include/utils/snapmgr.h +35 -14
  369. data/ext/pg_query/include/utils/snapshot.h +14 -1
  370. data/ext/pg_query/include/utils/sortsupport.h +117 -2
  371. data/ext/pg_query/include/utils/syscache.h +6 -1
  372. data/ext/pg_query/include/utils/timeout.h +11 -4
  373. data/ext/pg_query/include/utils/timestamp.h +6 -5
  374. data/ext/pg_query/include/utils/tuplesort.h +25 -11
  375. data/ext/pg_query/include/utils/tuplestore.h +2 -2
  376. data/ext/pg_query/include/utils/typcache.h +24 -17
  377. data/ext/pg_query/include/utils/tzparser.h +1 -1
  378. data/ext/pg_query/include/utils/varlena.h +5 -3
  379. data/ext/pg_query/include/utils/wait_event.h +289 -0
  380. data/ext/pg_query/include/utils/xml.h +4 -4
  381. data/ext/pg_query/pg_query.pb-c.c +4318 -2307
  382. data/ext/pg_query/pg_query_deparse.c +1114 -381
  383. data/ext/pg_query/pg_query_fingerprint.c +46 -10
  384. data/ext/pg_query/pg_query_fingerprint.h +3 -1
  385. data/ext/pg_query/pg_query_json_plpgsql.c +55 -12
  386. data/ext/pg_query/pg_query_normalize.c +163 -20
  387. data/ext/pg_query/pg_query_outfuncs.h +1 -0
  388. data/ext/pg_query/pg_query_outfuncs_json.c +65 -16
  389. data/ext/pg_query/pg_query_outfuncs_protobuf.c +70 -10
  390. data/ext/pg_query/pg_query_parse.c +1 -1
  391. data/ext/pg_query/pg_query_parse_plpgsql.c +79 -16
  392. data/ext/pg_query/pg_query_readfuncs_protobuf.c +42 -8
  393. data/ext/pg_query/pg_query_ruby.c +1 -1
  394. data/ext/pg_query/pg_query_scan.c +2 -1
  395. data/ext/pg_query/pg_query_split.c +3 -2
  396. data/ext/pg_query/src_backend_catalog_namespace.c +21 -9
  397. data/ext/pg_query/src_backend_catalog_pg_proc.c +4 -1
  398. data/ext/pg_query/src_backend_commands_define.c +11 -1
  399. data/ext/pg_query/src_backend_nodes_bitmapset.c +3 -1
  400. data/ext/pg_query/src_backend_nodes_copyfuncs.c +424 -109
  401. data/ext/pg_query/src_backend_nodes_equalfuncs.c +291 -46
  402. data/ext/pg_query/src_backend_nodes_extensible.c +1 -1
  403. data/ext/pg_query/src_backend_nodes_list.c +86 -11
  404. data/ext/pg_query/src_backend_nodes_makefuncs.c +5 -4
  405. data/ext/pg_query/src_backend_nodes_nodeFuncs.c +55 -12
  406. data/ext/pg_query/src_backend_nodes_value.c +28 -19
  407. data/ext/pg_query/src_backend_parser_gram.c +33890 -31262
  408. data/ext/pg_query/src_backend_parser_parser.c +26 -7
  409. data/ext/pg_query/src_backend_parser_scan.c +644 -441
  410. data/ext/pg_query/src_backend_parser_scansup.c +4 -28
  411. data/ext/pg_query/src_backend_postmaster_postmaster.c +77 -106
  412. data/ext/pg_query/src_backend_storage_ipc_ipc.c +13 -4
  413. data/ext/pg_query/src_backend_storage_lmgr_s_lock.c +5 -4
  414. data/ext/pg_query/src_backend_tcop_postgres.c +73 -24
  415. data/ext/pg_query/src_backend_utils_activity_pgstat_database.c +140 -0
  416. data/ext/pg_query/src_backend_utils_adt_datum.c +13 -1
  417. data/ext/pg_query/src_backend_utils_adt_expandeddatum.c +1 -1
  418. data/ext/pg_query/src_backend_utils_adt_format_type.c +6 -2
  419. data/ext/pg_query/src_backend_utils_adt_ruleutils.c +109 -15
  420. data/ext/pg_query/src_backend_utils_error_assert.c +16 -14
  421. data/ext/pg_query/src_backend_utils_error_elog.c +172 -99
  422. data/ext/pg_query/src_backend_utils_fmgr_fmgr.c +12 -17
  423. data/ext/pg_query/src_backend_utils_hash_dynahash.c +40 -10
  424. data/ext/pg_query/src_backend_utils_init_globals.c +5 -5
  425. data/ext/pg_query/src_backend_utils_mb_mbutils.c +55 -66
  426. data/ext/pg_query/src_backend_utils_misc_guc.c +207 -45
  427. data/ext/pg_query/src_backend_utils_mmgr_aset.c +7 -5
  428. data/ext/pg_query/src_backend_utils_mmgr_mcxt.c +123 -35
  429. data/ext/pg_query/src_common_encnames.c +1 -1
  430. data/ext/pg_query/src_common_hashfn.c +3 -3
  431. data/ext/pg_query/src_common_keywords.c +15 -2
  432. data/ext/pg_query/src_common_kwlist_d.h +517 -494
  433. data/ext/pg_query/src_common_kwlookup.c +1 -1
  434. data/ext/pg_query/src_common_pg_prng.c +152 -0
  435. data/ext/pg_query/src_common_psprintf.c +1 -1
  436. data/ext/pg_query/src_common_string.c +7 -1
  437. data/ext/pg_query/src_common_stringinfo.c +1 -1
  438. data/ext/pg_query/src_common_wchar.c +712 -109
  439. data/ext/pg_query/src_pl_plpgsql_src_pl_comp.c +49 -22
  440. data/ext/pg_query/src_pl_plpgsql_src_pl_funcs.c +1 -18
  441. data/ext/pg_query/src_pl_plpgsql_src_pl_gram.c +1235 -1261
  442. data/ext/pg_query/src_pl_plpgsql_src_pl_handler.c +1 -1
  443. data/ext/pg_query/src_pl_plpgsql_src_pl_reserved_kwlist_d.h +10 -10
  444. data/ext/pg_query/src_pl_plpgsql_src_pl_scanner.c +2 -2
  445. data/ext/pg_query/src_pl_plpgsql_src_pl_unreserved_kwlist_d.h +54 -56
  446. data/ext/pg_query/src_port_pg_bitutils.c +41 -52
  447. data/ext/pg_query/src_port_pgsleep.c +1 -1
  448. data/ext/pg_query/src_port_pgstrcasecmp.c +1 -1
  449. data/ext/pg_query/src_port_qsort.c +12 -224
  450. data/ext/pg_query/src_port_snprintf.c +46 -20
  451. data/ext/pg_query/src_port_strerror.c +9 -19
  452. data/ext/pg_query/src_port_strnlen.c +1 -1
  453. data/lib/pg_query/deparse.rb +7 -1
  454. data/lib/pg_query/filter_columns.rb +6 -4
  455. data/lib/pg_query/fingerprint.rb +18 -3
  456. data/lib/pg_query/node.rb +2 -2
  457. data/lib/pg_query/param_refs.rb +1 -1
  458. data/lib/pg_query/parse.rb +87 -51
  459. data/lib/pg_query/pg_query_pb.rb +1109 -942
  460. data/lib/pg_query/treewalker.rb +6 -0
  461. data/lib/pg_query/truncate.rb +54 -8
  462. data/lib/pg_query/version.rb +1 -1
  463. metadata +29 -18
  464. data/ext/pg_query/include/access/xloginsert.h +0 -64
  465. data/ext/pg_query/include/bootstrap/bootstrap.h +0 -62
  466. data/ext/pg_query/include/parser/parse_clause.h +0 -54
  467. data/ext/pg_query/include/parser/parse_collate.h +0 -27
  468. data/ext/pg_query/include/parser/parse_target.h +0 -46
  469. data/ext/pg_query/src_backend_libpq_pqcomm.c +0 -651
  470. data/ext/pg_query/src_backend_parser_parse_expr.c +0 -313
  471. data/ext/pg_query/src_port_erand48.c +0 -127
  472. data/ext/pg_query/src_port_random.c +0 -31
@@ -4,7 +4,7 @@
4
4
  * definitions for executor state nodes
5
5
  *
6
6
  *
7
- * Portions Copyright (c) 1996-2020, PostgreSQL Global Development Group
7
+ * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
8
8
  * Portions Copyright (c) 1994, Regents of the University of California
9
9
  *
10
10
  * src/include/nodes/execnodes.h
@@ -17,6 +17,7 @@
17
17
  #include "access/tupconvert.h"
18
18
  #include "executor/instrument.h"
19
19
  #include "fmgr.h"
20
+ #include "lib/ilist.h"
20
21
  #include "lib/pairingheap.h"
21
22
  #include "nodes/params.h"
22
23
  #include "nodes/plannodes.h"
@@ -33,7 +34,6 @@
33
34
  #include "utils/tuplestore.h"
34
35
 
35
36
  struct PlanState; /* forward references in this file */
36
- struct PartitionRoutingInfo;
37
37
  struct ParallelHashJoinState;
38
38
  struct ExecRowMark;
39
39
  struct ExprState;
@@ -41,6 +41,7 @@ struct ExprContext;
41
41
  struct RangeTblEntry; /* avoid including parsenodes.h here */
42
42
  struct ExprEvalStep; /* avoid including execExpr.h everywhere */
43
43
  struct CopyMultiInsertBuffer;
44
+ struct LogicalTapeSet;
44
45
 
45
46
 
46
47
  /* ----------------
@@ -60,7 +61,7 @@ typedef Datum (*ExprStateEvalFunc) (struct ExprState *expression,
60
61
 
61
62
  typedef struct ExprState
62
63
  {
63
- NodeTag tag;
64
+ NodeTag type;
64
65
 
65
66
  uint8 flags; /* bitmask of EEO_FLAG_* bits, see above */
66
67
 
@@ -141,6 +142,8 @@ typedef struct ExprState
141
142
  * Unique is it a unique index?
142
143
  * OpclassOptions opclass-specific options, or NULL if none
143
144
  * ReadyForInserts is it valid for inserts?
145
+ * CheckedUnchanged IndexUnchanged status determined yet?
146
+ * IndexUnchanged aminsert hint, cached for retail inserts
144
147
  * Concurrent are we doing a concurrent index build?
145
148
  * BrokenHotChain did we detect any broken HOT chains?
146
149
  * ParallelWorkers # of workers requested (excludes leader)
@@ -170,7 +173,10 @@ typedef struct IndexInfo
170
173
  uint16 *ii_UniqueStrats; /* array with one entry per column */
171
174
  Datum *ii_OpclassOptions; /* array with one entry per column */
172
175
  bool ii_Unique;
176
+ bool ii_NullsNotDistinct;
173
177
  bool ii_ReadyForInserts;
178
+ bool ii_CheckedUnchanged;
179
+ bool ii_IndexUnchanged;
174
180
  bool ii_Concurrent;
175
181
  bool ii_BrokenHotChain;
176
182
  int ii_ParallelWorkers;
@@ -357,10 +363,6 @@ typedef struct ProjectionInfo
357
363
  * attribute numbers of the "original" tuple and the
358
364
  * attribute numbers of the "clean" tuple.
359
365
  * resultSlot: tuple slot used to hold cleaned tuple.
360
- * junkAttNo: not used by junkfilter code. Can be used by caller
361
- * to remember the attno of a specific junk attribute
362
- * (nodeModifyTable.c keeps the "ctid" or "wholerow"
363
- * attno here).
364
366
  * ----------------
365
367
  */
366
368
  typedef struct JunkFilter
@@ -370,7 +372,6 @@ typedef struct JunkFilter
370
372
  TupleDesc jf_cleanTupType;
371
373
  AttrNumber *jf_cleanMap;
372
374
  TupleTableSlot *jf_resultSlot;
373
- AttrNumber jf_junkAttNo;
374
375
  } JunkFilter;
375
376
 
376
377
  /*
@@ -388,6 +389,22 @@ typedef struct OnConflictSetState
388
389
  ExprState *oc_WhereClause; /* state for the WHERE clause */
389
390
  } OnConflictSetState;
390
391
 
392
+ /* ----------------
393
+ * MergeActionState information
394
+ *
395
+ * Executor state for a MERGE action.
396
+ * ----------------
397
+ */
398
+ typedef struct MergeActionState
399
+ {
400
+ NodeTag type;
401
+
402
+ MergeAction *mas_action; /* associated MergeAction node */
403
+ ProjectionInfo *mas_proj; /* projection of the action's targetlist for
404
+ * this rel */
405
+ ExprState *mas_whenqual; /* WHEN [NOT] MATCHED AND conditions */
406
+ } MergeActionState;
407
+
391
408
  /*
392
409
  * ResultRelInfo
393
410
  *
@@ -424,6 +441,21 @@ typedef struct ResultRelInfo
424
441
  /* array of key/attr info for indices */
425
442
  IndexInfo **ri_IndexRelationInfo;
426
443
 
444
+ /*
445
+ * For UPDATE/DELETE result relations, the attribute number of the row
446
+ * identity junk attribute in the source plan's output tuples
447
+ */
448
+ AttrNumber ri_RowIdAttNo;
449
+
450
+ /* Projection to generate new tuple in an INSERT/UPDATE */
451
+ ProjectionInfo *ri_projectNew;
452
+ /* Slot to hold that tuple */
453
+ TupleTableSlot *ri_newTupleSlot;
454
+ /* Slot to hold the old tuple being updated */
455
+ TupleTableSlot *ri_oldTupleSlot;
456
+ /* Have the projection and the slots above been initialized? */
457
+ bool ri_projectNewInfoValid;
458
+
427
459
  /* triggers to be fired, if any */
428
460
  TriggerDesc *ri_TrigDesc;
429
461
 
@@ -450,6 +482,13 @@ typedef struct ResultRelInfo
450
482
  /* true when modifying foreign table directly */
451
483
  bool ri_usesFdwDirectModify;
452
484
 
485
+ /* batch insert stuff */
486
+ int ri_NumSlots; /* number of slots in the array */
487
+ int ri_NumSlotsInitialized; /* number of initialized slots */
488
+ int ri_BatchSize; /* max slots inserted in a single batch */
489
+ TupleTableSlot **ri_Slots; /* input tuples for batch insert */
490
+ TupleTableSlot **ri_PlanSlots;
491
+
453
492
  /* list of WithCheckOption's to be checked */
454
493
  List *ri_WithCheckOptions;
455
494
 
@@ -465,9 +504,6 @@ typedef struct ResultRelInfo
465
504
  /* number of stored generated columns we need to compute */
466
505
  int ri_NumGeneratedNeeded;
467
506
 
468
- /* for removing junk attributes from tuples */
469
- JunkFilter *ri_junkFilter;
470
-
471
507
  /* list of RETURNING expressions */
472
508
  List *ri_returningList;
473
509
 
@@ -480,31 +516,69 @@ typedef struct ResultRelInfo
480
516
  /* ON CONFLICT evaluation state */
481
517
  OnConflictSetState *ri_onConflict;
482
518
 
483
- /* partition check expression */
484
- List *ri_PartitionCheck;
519
+ /* for MERGE, lists of MergeActionState */
520
+ List *ri_matchedMergeAction;
521
+ List *ri_notMatchedMergeAction;
485
522
 
486
- /* partition check expression state */
523
+ /* partition check expression state (NULL if not set up yet) */
487
524
  ExprState *ri_PartitionCheckExpr;
488
525
 
489
526
  /*
527
+ * Information needed by tuple routing target relations
528
+ *
490
529
  * RootResultRelInfo gives the target relation mentioned in the query, if
491
530
  * it's a partitioned table. It is not set if the target relation
492
531
  * mentioned in the query is an inherited table, nor when tuple routing is
493
532
  * not needed.
533
+ *
534
+ * RootToPartitionMap and PartitionTupleSlot, initialized by
535
+ * ExecInitRoutingInfo, are non-NULL if partition has a different tuple
536
+ * format than the root table.
494
537
  */
495
538
  struct ResultRelInfo *ri_RootResultRelInfo;
539
+ TupleConversionMap *ri_RootToPartitionMap;
540
+ TupleTableSlot *ri_PartitionTupleSlot;
496
541
 
497
- /* Additional information specific to partition tuple routing */
498
- struct PartitionRoutingInfo *ri_PartitionInfo;
542
+ /*
543
+ * Map to convert child result relation tuples to the format of the table
544
+ * actually mentioned in the query (called "root"). Computed only if
545
+ * needed. A NULL map value indicates that no conversion is needed, so we
546
+ * must have a separate flag to show if the map has been computed.
547
+ */
548
+ TupleConversionMap *ri_ChildToRootMap;
549
+ bool ri_ChildToRootMapValid;
499
550
 
500
- /* For use by copy.c when performing multi-inserts */
551
+ /* for use by copyfrom.c when performing multi-inserts */
501
552
  struct CopyMultiInsertBuffer *ri_CopyMultiInsertBuffer;
553
+
554
+ /*
555
+ * Used when a leaf partition is involved in a cross-partition update of
556
+ * one of its ancestors; see ExecCrossPartitionUpdateForeignKey().
557
+ */
558
+ List *ri_ancestorResultRels;
502
559
  } ResultRelInfo;
503
560
 
561
+ /* ----------------
562
+ * AsyncRequest
563
+ *
564
+ * State for an asynchronous tuple request.
565
+ * ----------------
566
+ */
567
+ typedef struct AsyncRequest
568
+ {
569
+ struct PlanState *requestor; /* Node that wants a tuple */
570
+ struct PlanState *requestee; /* Node from which a tuple is wanted */
571
+ int request_index; /* Scratch space for requestor */
572
+ bool callback_pending; /* Callback is needed */
573
+ bool request_complete; /* Request complete, result valid */
574
+ TupleTableSlot *result; /* Result (NULL or an empty slot if no more
575
+ * tuples) */
576
+ } AsyncRequest;
577
+
504
578
  /* ----------------
505
579
  * EState information
506
580
  *
507
- * Master working state for an Executor invocation
581
+ * Working state for an Executor invocation
508
582
  * ----------------
509
583
  */
510
584
  typedef struct EState
@@ -530,23 +604,18 @@ typedef struct EState
530
604
  CommandId es_output_cid;
531
605
 
532
606
  /* Info about target table(s) for insert/update/delete queries: */
533
- ResultRelInfo *es_result_relations; /* array of ResultRelInfos */
534
- int es_num_result_relations; /* length of array */
535
- ResultRelInfo *es_result_relation_info; /* currently active array elt */
607
+ ResultRelInfo **es_result_relations; /* Array of per-range-table-entry
608
+ * ResultRelInfo pointers, or NULL
609
+ * if not a target table */
610
+ List *es_opened_result_relations; /* List of non-NULL entries in
611
+ * es_result_relations in no
612
+ * specific order */
536
613
 
537
- /*
538
- * Info about the partition root table(s) for insert/update/delete queries
539
- * targeting partitioned tables. Only leaf partitions are mentioned in
540
- * es_result_relations, but we need access to the roots for firing
541
- * triggers and for runtime tuple routing.
542
- */
543
- ResultRelInfo *es_root_result_relations; /* array of ResultRelInfos */
544
- int es_num_root_result_relations; /* length of the array */
545
614
  PartitionDirectory es_partition_directory; /* for PartitionDesc lookup */
546
615
 
547
616
  /*
548
617
  * The following list contains ResultRelInfos created by the tuple routing
549
- * code for partitions that don't already have one.
618
+ * code for partitions that aren't found in the es_result_relations array.
550
619
  */
551
620
  List *es_tuple_routing_result_relations;
552
621
 
@@ -652,10 +721,7 @@ typedef struct ExecRowMark
652
721
  * Each LockRows and ModifyTable node keeps a list of the rowmarks it needs to
653
722
  * deal with. In addition to a pointer to the related entry in es_rowmarks,
654
723
  * this struct carries the column number(s) of the resjunk columns associated
655
- * with the rowmark (see comments for PlanRowMark for more detail). In the
656
- * case of ModifyTable, there has to be a separate ExecAuxRowMark list for
657
- * each child plan, because the resjunk columns could be at different physical
658
- * column positions in different subplans.
724
+ * with the rowmark (see comments for PlanRowMark for more detail).
659
725
  */
660
726
  typedef struct ExecAuxRowMark
661
727
  {
@@ -750,17 +816,6 @@ typedef tuplehash_iterator TupleHashIterator;
750
816
  * ----------------------------------------------------------------
751
817
  */
752
818
 
753
- /* ----------------
754
- * AggrefExprState node
755
- * ----------------
756
- */
757
- typedef struct AggrefExprState
758
- {
759
- NodeTag type;
760
- Aggref *aggref; /* expression plan node */
761
- int aggno; /* ID number for agg within its plan node */
762
- } AggrefExprState;
763
-
764
819
  /* ----------------
765
820
  * WindowFuncExprState node
766
821
  * ----------------
@@ -888,18 +943,6 @@ typedef struct SubPlanState
888
943
  ExprState *cur_eq_comp; /* equality comparator for LHS vs. table */
889
944
  } SubPlanState;
890
945
 
891
- /* ----------------
892
- * AlternativeSubPlanState node
893
- * ----------------
894
- */
895
- typedef struct AlternativeSubPlanState
896
- {
897
- NodeTag type;
898
- AlternativeSubPlan *subplan; /* expression plan node */
899
- List *subplans; /* SubPlanStates of alternative subplans */
900
- int active; /* list index of the one we're using */
901
- } AlternativeSubPlanState;
902
-
903
946
  /*
904
947
  * DomainConstraintState - one item to check during CoerceToDomain
905
948
  *
@@ -994,6 +1037,8 @@ typedef struct PlanState
994
1037
  ExprContext *ps_ExprContext; /* node's expression-evaluation context */
995
1038
  ProjectionInfo *ps_ProjInfo; /* info for doing tuple projection */
996
1039
 
1040
+ bool async_capable; /* true if node is async-capable */
1041
+
997
1042
  /*
998
1043
  * Scanslot's descriptor if known. This is a bit of a hack, but otherwise
999
1044
  * it's hard for expression compilation to optimize based on the
@@ -1080,9 +1125,8 @@ typedef struct PlanState
1080
1125
  * EvalPlanQualSlot), and/or found using the rowmark mechanism (non-locking
1081
1126
  * rowmarks by the EPQ machinery itself, locking ones by the caller).
1082
1127
  *
1083
- * While the plan to be checked may be changed using EvalPlanQualSetPlan() -
1084
- * e.g. so all source plans for a ModifyTable node can be processed - all such
1085
- * plans need to share the same EState.
1128
+ * While the plan to be checked may be changed using EvalPlanQualSetPlan(),
1129
+ * all such plans need to share the same EState.
1086
1130
  */
1087
1131
  typedef struct EPQState
1088
1132
  {
@@ -1166,6 +1210,12 @@ typedef struct ProjectSetState
1166
1210
  MemoryContext argcontext; /* context for SRF arguments */
1167
1211
  } ProjectSetState;
1168
1212
 
1213
+
1214
+ /* flags for mt_merge_subcommands */
1215
+ #define MERGE_INSERT 0x01
1216
+ #define MERGE_UPDATE 0x02
1217
+ #define MERGE_DELETE 0x04
1218
+
1169
1219
  /* ----------------
1170
1220
  * ModifyTableState information
1171
1221
  * ----------------
@@ -1173,21 +1223,34 @@ typedef struct ProjectSetState
1173
1223
  typedef struct ModifyTableState
1174
1224
  {
1175
1225
  PlanState ps; /* its first field is NodeTag */
1176
- CmdType operation; /* INSERT, UPDATE, or DELETE */
1226
+ CmdType operation; /* INSERT, UPDATE, DELETE, or MERGE */
1177
1227
  bool canSetTag; /* do we set the command tag/es_processed? */
1178
1228
  bool mt_done; /* are we done? */
1179
- PlanState **mt_plans; /* subplans (one per target rel) */
1180
- int mt_nplans; /* number of plans in the array */
1181
- int mt_whichplan; /* which one is being executed (0..n-1) */
1182
- TupleTableSlot **mt_scans; /* input tuple corresponding to underlying
1183
- * plans */
1184
- ResultRelInfo *resultRelInfo; /* per-subplan target relations */
1185
- ResultRelInfo *rootResultRelInfo; /* root target relation (partitioned
1186
- * table root) */
1187
- List **mt_arowmarks; /* per-subplan ExecAuxRowMark lists */
1229
+ int mt_nrels; /* number of entries in resultRelInfo[] */
1230
+ ResultRelInfo *resultRelInfo; /* info about target relation(s) */
1231
+
1232
+ /*
1233
+ * Target relation mentioned in the original statement, used to fire
1234
+ * statement-level triggers and as the root for tuple routing. (This
1235
+ * might point to one of the resultRelInfo[] entries, but it can also be a
1236
+ * distinct struct.)
1237
+ */
1238
+ ResultRelInfo *rootResultRelInfo;
1239
+
1188
1240
  EPQState mt_epqstate; /* for evaluating EvalPlanQual rechecks */
1189
1241
  bool fireBSTriggers; /* do we need to fire stmt triggers? */
1190
1242
 
1243
+ /*
1244
+ * These fields are used for inherited UPDATE and DELETE, to track which
1245
+ * target relation a given tuple is from. If there are a lot of target
1246
+ * relations, we use a hash table to translate table OIDs to
1247
+ * resultRelInfo[] indexes; otherwise mt_resultOidHash is NULL.
1248
+ */
1249
+ int mt_resultOidAttno; /* resno of "tableoid" junk attr */
1250
+ Oid mt_lastResultOid; /* last-seen value of tableoid */
1251
+ int mt_lastResultIndex; /* corresponding index in resultRelInfo[] */
1252
+ HTAB *mt_resultOidHash; /* optional hash table to speed lookups */
1253
+
1191
1254
  /*
1192
1255
  * Slot for storing tuples in the root partitioned table's rowtype during
1193
1256
  * an UPDATE of a partitioned table.
@@ -1203,20 +1266,25 @@ typedef struct ModifyTableState
1203
1266
  /* controls transition table population for INSERT...ON CONFLICT UPDATE */
1204
1267
  struct TransitionCaptureState *mt_oc_transition_capture;
1205
1268
 
1206
- /* Per plan map for tuple conversion from child to root */
1207
- TupleConversionMap **mt_per_subplan_tupconv_maps;
1269
+ /* Flags showing which subcommands are present INS/UPD/DEL/DO NOTHING */
1270
+ int mt_merge_subcommands;
1271
+
1272
+ /* tuple counters for MERGE */
1273
+ double mt_merge_inserted;
1274
+ double mt_merge_updated;
1275
+ double mt_merge_deleted;
1208
1276
  } ModifyTableState;
1209
1277
 
1210
1278
  /* ----------------
1211
1279
  * AppendState information
1212
1280
  *
1213
1281
  * nplans how many plans are in the array
1214
- * whichplan which plan is being executed (0 .. n-1), or a
1215
- * special negative value. See nodeAppend.c.
1282
+ * whichplan which synchronous plan is being executed (0 .. n-1)
1283
+ * or a special negative value. See nodeAppend.c.
1216
1284
  * prune_state details required to allow partitions to be
1217
1285
  * eliminated from the scan, or NULL if not possible.
1218
- * valid_subplans for runtime pruning, valid appendplans indexes to
1219
- * scan.
1286
+ * valid_subplans for runtime pruning, valid synchronous appendplans
1287
+ * indexes to scan.
1220
1288
  * ----------------
1221
1289
  */
1222
1290
 
@@ -1232,12 +1300,25 @@ struct AppendState
1232
1300
  PlanState **appendplans; /* array of PlanStates for my inputs */
1233
1301
  int as_nplans;
1234
1302
  int as_whichplan;
1303
+ bool as_begun; /* false means need to initialize */
1304
+ Bitmapset *as_asyncplans; /* asynchronous plans indexes */
1305
+ int as_nasyncplans; /* # of asynchronous plans */
1306
+ AsyncRequest **as_asyncrequests; /* array of AsyncRequests */
1307
+ TupleTableSlot **as_asyncresults; /* unreturned results of async plans */
1308
+ int as_nasyncresults; /* # of valid entries in as_asyncresults */
1309
+ bool as_syncdone; /* true if all synchronous plans done in
1310
+ * asynchronous mode, else false */
1311
+ int as_nasyncremain; /* # of remaining asynchronous plans */
1312
+ Bitmapset *as_needrequest; /* asynchronous plans needing a new request */
1313
+ struct WaitEventSet *as_eventset; /* WaitEventSet used to configure file
1314
+ * descriptor wait events */
1235
1315
  int as_first_partial_plan; /* Index of 'appendplans' containing
1236
1316
  * the first partial plan */
1237
1317
  ParallelAppendState *as_pstate; /* parallel coordination info */
1238
1318
  Size pstate_len; /* size of parallel coordination info */
1239
1319
  struct PartitionPruneState *as_prune_state;
1240
1320
  Bitmapset *as_valid_subplans;
1321
+ Bitmapset *as_valid_asyncplans; /* valid asynchronous plans indexes */
1241
1322
  bool (*choose_next_subplan) (AppendState *);
1242
1323
  };
1243
1324
 
@@ -1454,7 +1535,7 @@ typedef struct IndexScanState
1454
1535
  /* ----------------
1455
1536
  * IndexOnlyScanState information
1456
1537
  *
1457
- * indexqual execution state for indexqual expressions
1538
+ * recheckqual execution state for recheckqual expressions
1458
1539
  * ScanKeys Skey structures for index quals
1459
1540
  * NumScanKeys number of ScanKeys
1460
1541
  * OrderByKeys Skey structures for index ordering operators
@@ -1473,7 +1554,7 @@ typedef struct IndexScanState
1473
1554
  typedef struct IndexOnlyScanState
1474
1555
  {
1475
1556
  ScanState ss; /* its first field is NodeTag */
1476
- ExprState *indexqual;
1557
+ ExprState *recheckqual;
1477
1558
  struct ScanKeyData *ioss_ScanKeys;
1478
1559
  int ioss_NumScanKeys;
1479
1560
  struct ScanKeyData *ioss_OrderByKeys;
@@ -1636,6 +1717,24 @@ typedef struct TidScanState
1636
1717
  HeapTupleData tss_htup;
1637
1718
  } TidScanState;
1638
1719
 
1720
+ /* ----------------
1721
+ * TidRangeScanState information
1722
+ *
1723
+ * trss_tidexprs list of TidOpExpr structs (see nodeTidrangescan.c)
1724
+ * trss_mintid the lowest TID in the scan range
1725
+ * trss_maxtid the highest TID in the scan range
1726
+ * trss_inScan is a scan currently in progress?
1727
+ * ----------------
1728
+ */
1729
+ typedef struct TidRangeScanState
1730
+ {
1731
+ ScanState ss; /* its first field is NodeTag */
1732
+ List *trss_tidexprs;
1733
+ ItemPointerData trss_mintid;
1734
+ ItemPointerData trss_maxtid;
1735
+ bool trss_inScan;
1736
+ } TidRangeScanState;
1737
+
1639
1738
  /* ----------------
1640
1739
  * SubqueryScanState information
1641
1740
  *
@@ -1804,6 +1903,7 @@ typedef struct ForeignScanState
1804
1903
  ScanState ss; /* its first field is NodeTag */
1805
1904
  ExprState *fdw_recheck_quals; /* original quals not in ss.ps.qual */
1806
1905
  Size pscan_len; /* size of parallel coordination information */
1906
+ ResultRelInfo *resultRelInfo; /* result rel info, if UPDATE or DELETE */
1807
1907
  /* use struct pointer to avoid including fdwapi.h here */
1808
1908
  struct FdwRoutine *fdwroutine;
1809
1909
  void *fdw_state; /* foreign-data wrapper can keep state here */
@@ -1992,6 +2092,75 @@ typedef struct MaterialState
1992
2092
  Tuplestorestate *tuplestorestate;
1993
2093
  } MaterialState;
1994
2094
 
2095
+ struct MemoizeEntry;
2096
+ struct MemoizeTuple;
2097
+ struct MemoizeKey;
2098
+
2099
+ typedef struct MemoizeInstrumentation
2100
+ {
2101
+ uint64 cache_hits; /* number of rescans where we've found the
2102
+ * scan parameter values to be cached */
2103
+ uint64 cache_misses; /* number of rescans where we've not found the
2104
+ * scan parameter values to be cached. */
2105
+ uint64 cache_evictions; /* number of cache entries removed due to
2106
+ * the need to free memory */
2107
+ uint64 cache_overflows; /* number of times we've had to bypass the
2108
+ * cache when filling it due to not being
2109
+ * able to free enough space to store the
2110
+ * current scan's tuples. */
2111
+ uint64 mem_peak; /* peak memory usage in bytes */
2112
+ } MemoizeInstrumentation;
2113
+
2114
+ /* ----------------
2115
+ * Shared memory container for per-worker memoize information
2116
+ * ----------------
2117
+ */
2118
+ typedef struct SharedMemoizeInfo
2119
+ {
2120
+ int num_workers;
2121
+ MemoizeInstrumentation sinstrument[FLEXIBLE_ARRAY_MEMBER];
2122
+ } SharedMemoizeInfo;
2123
+
2124
+ /* ----------------
2125
+ * MemoizeState information
2126
+ *
2127
+ * memoize nodes are used to cache recent and commonly seen results from
2128
+ * a parameterized scan.
2129
+ * ----------------
2130
+ */
2131
+ typedef struct MemoizeState
2132
+ {
2133
+ ScanState ss; /* its first field is NodeTag */
2134
+ int mstatus; /* value of ExecMemoize state machine */
2135
+ int nkeys; /* number of cache keys */
2136
+ struct memoize_hash *hashtable; /* hash table for cache entries */
2137
+ TupleDesc hashkeydesc; /* tuple descriptor for cache keys */
2138
+ TupleTableSlot *tableslot; /* min tuple slot for existing cache entries */
2139
+ TupleTableSlot *probeslot; /* virtual slot used for hash lookups */
2140
+ ExprState *cache_eq_expr; /* Compare exec params to hash key */
2141
+ ExprState **param_exprs; /* exprs containing the parameters to this
2142
+ * node */
2143
+ FmgrInfo *hashfunctions; /* lookup data for hash funcs nkeys in size */
2144
+ Oid *collations; /* collation for comparisons nkeys in size */
2145
+ uint64 mem_used; /* bytes of memory used by cache */
2146
+ uint64 mem_limit; /* memory limit in bytes for the cache */
2147
+ MemoryContext tableContext; /* memory context to store cache data */
2148
+ dlist_head lru_list; /* least recently used entry list */
2149
+ struct MemoizeTuple *last_tuple; /* Used to point to the last tuple
2150
+ * returned during a cache hit and the
2151
+ * tuple we last stored when
2152
+ * populating the cache. */
2153
+ struct MemoizeEntry *entry; /* the entry that 'last_tuple' belongs to or
2154
+ * NULL if 'last_tuple' is NULL. */
2155
+ bool singlerow; /* true if the cache entry is to be marked as
2156
+ * complete after caching the first tuple. */
2157
+ bool binary_mode; /* true when cache key should be compared bit
2158
+ * by bit, false when using hash equality ops */
2159
+ MemoizeInstrumentation stats; /* execution statistics */
2160
+ SharedMemoizeInfo *shared_info; /* statistics for parallel workers */
2161
+ Bitmapset *keyparamids; /* Param->paramids of expressions belonging to
2162
+ * param_exprs */
2163
+ } MemoizeState;
1995
2164
 
1996
2165
  /* ----------------
1997
2166
  * When performing sorting by multiple keys, it's possible that the input
@@ -2032,6 +2201,7 @@ typedef struct SortState
2032
2201
  int64 bound_Done; /* value of bound we did the sort with */
2033
2202
  void *tuplesortstate; /* private state of tuplesort.c */
2034
2203
  bool am_worker; /* are we a worker? */
2204
+ bool datumSort; /* Datum sort instead of tuple sort? */
2035
2205
  SharedSortInfo *shared_info; /* one entry per worker */
2036
2206
  } SortState;
2037
2207
 
@@ -2196,7 +2366,7 @@ typedef struct AggState
2196
2366
  bool table_filled; /* hash table filled yet? */
2197
2367
  int num_hashes;
2198
2368
  MemoryContext hash_metacxt; /* memory for hash table itself */
2199
- struct HashTapeInfo *hash_tapeinfo; /* metadata for spill tapes */
2369
+ struct LogicalTapeSet *hash_tapeset; /* tape set for hash spill tapes */
2200
2370
  struct HashAggSpill *hash_spills; /* HashAggSpill for each grouping set,
2201
2371
  * exists only during first pass */
2202
2372
  TupleTableSlot *hash_spill_rslot; /* for reading spill files */
@@ -2236,6 +2406,18 @@ typedef struct AggState
2236
2406
  typedef struct WindowStatePerFuncData *WindowStatePerFunc;
2237
2407
  typedef struct WindowStatePerAggData *WindowStatePerAgg;
2238
2408
 
2409
+ /*
2410
+ * WindowAggStatus -- Used to track the status of WindowAggState
2411
+ */
2412
+ typedef enum WindowAggStatus
2413
+ {
2414
+ WINDOWAGG_DONE, /* No more processing to do */
2415
+ WINDOWAGG_RUN, /* Normal processing of window funcs */
2416
+ WINDOWAGG_PASSTHROUGH, /* Don't eval window funcs */
2417
+ WINDOWAGG_PASSTHROUGH_STRICT /* Pass-through plus don't store new
2418
+ * tuples during spool */
2419
+ } WindowAggStatus;
2420
+
2239
2421
  typedef struct WindowAggState
2240
2422
  {
2241
2423
  ScanState ss; /* its first field is NodeTag */
@@ -2262,6 +2444,7 @@ typedef struct WindowAggState
2262
2444
  struct WindowObjectData *agg_winobj; /* winobj for aggregate fetches */
2263
2445
  int64 aggregatedbase; /* start row for current aggregates */
2264
2446
  int64 aggregatedupto; /* rows before this one are aggregated */
2447
+ WindowAggStatus status; /* run status of WindowAggState */
2265
2448
 
2266
2449
  int frameOptions; /* frame_clause options, see WindowDef */
2267
2450
  ExprState *startOffset; /* expression for starting bound offset */
@@ -2288,8 +2471,17 @@ typedef struct WindowAggState
2288
2471
  MemoryContext curaggcontext; /* current aggregate's working data */
2289
2472
  ExprContext *tmpcontext; /* short-term evaluation context */
2290
2473
 
2474
+ ExprState *runcondition; /* Condition which must remain true otherwise
2475
+ * execution of the WindowAgg will finish or
2476
+ * go into pass-through mode. NULL when there
2477
+ * is no such condition. */
2478
+
2479
+ bool use_pass_through; /* When false, stop execution when
2480
+ * runcondition is no longer true. Else
2481
+ * just stop evaluating window funcs. */
2482
+ bool top_window; /* true if this is the top-most WindowAgg or
2483
+ * the only WindowAgg in this query level */
2291
2484
  bool all_first; /* true if the scan is starting */
2292
- bool all_done; /* true if the scan is finished */
2293
2485
  bool partition_spooled; /* true if all tuples in current partition
2294
2486
  * have been spooled into tuplestore */
2295
2487
  bool more_partitions; /* true if there's more partitions after
@@ -4,7 +4,7 @@
4
4
  * Definitions for extensible nodes and custom scans
5
5
  *
6
6
  *
7
- * Portions Copyright (c) 1996-2020, PostgreSQL Global Development Group
7
+ * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
8
8
  * Portions Copyright (c) 1994, Regents of the University of California
9
9
  *
10
10
  * src/include/nodes/extensible.h
@@ -76,10 +76,12 @@ extern const ExtensibleNodeMethods *GetExtensibleNodeMethods(const char *name,
76
76
 
77
77
  /*
78
78
  * Flags for custom paths, indicating what capabilities the resulting scan
79
- * will have.
79
+ * will have. The flags fields of CustomPath and CustomScan nodes are
80
+ * bitmasks of these flags.
80
81
  */
81
82
  #define CUSTOMPATH_SUPPORT_BACKWARD_SCAN 0x0001
82
83
  #define CUSTOMPATH_SUPPORT_MARK_RESTORE 0x0002
84
+ #define CUSTOMPATH_SUPPORT_PROJECTION 0x0004
83
85
 
84
86
  /*
85
87
  * Custom path methods. Mostly, we just need to know how to convert a
@@ -4,7 +4,7 @@
4
4
  * Common header for some locking-related declarations.
5
5
  *
6
6
  *
7
- * Copyright (c) 2014-2020, PostgreSQL Global Development Group
7
+ * Copyright (c) 2014-2022, PostgreSQL Global Development Group
8
8
  *
9
9
  * src/include/nodes/lockoptions.h
10
10
  *