pg_query 2.2.1 → 4.2.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (466) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +21 -1
  3. data/README.md +29 -33
  4. data/Rakefile +2 -2
  5. data/ext/pg_query/include/access/amapi.h +45 -1
  6. data/ext/pg_query/include/access/attmap.h +1 -1
  7. data/ext/pg_query/include/access/attnum.h +2 -2
  8. data/ext/pg_query/include/access/clog.h +4 -2
  9. data/ext/pg_query/include/access/commit_ts.h +6 -9
  10. data/ext/pg_query/include/access/detoast.h +1 -11
  11. data/ext/pg_query/include/access/genam.h +15 -12
  12. data/ext/pg_query/include/access/gin.h +2 -2
  13. data/ext/pg_query/include/access/htup.h +1 -1
  14. data/ext/pg_query/include/access/htup_details.h +75 -87
  15. data/ext/pg_query/include/access/itup.h +7 -1
  16. data/ext/pg_query/include/access/parallel.h +2 -2
  17. data/ext/pg_query/include/access/printtup.h +1 -1
  18. data/ext/pg_query/include/access/relation.h +1 -1
  19. data/ext/pg_query/include/access/relscan.h +17 -2
  20. data/ext/pg_query/include/access/rmgr.h +30 -3
  21. data/ext/pg_query/include/access/rmgrlist.h +23 -23
  22. data/ext/pg_query/include/access/sdir.h +1 -1
  23. data/ext/pg_query/include/access/skey.h +1 -1
  24. data/ext/pg_query/include/access/stratnum.h +4 -2
  25. data/ext/pg_query/include/access/sysattr.h +1 -1
  26. data/ext/pg_query/include/access/table.h +2 -1
  27. data/ext/pg_query/include/access/tableam.h +272 -20
  28. data/ext/pg_query/include/access/toast_compression.h +73 -0
  29. data/ext/pg_query/include/access/transam.h +123 -13
  30. data/ext/pg_query/include/access/tupconvert.h +1 -1
  31. data/ext/pg_query/include/access/tupdesc.h +1 -1
  32. data/ext/pg_query/include/access/tupmacs.h +3 -3
  33. data/ext/pg_query/include/access/twophase.h +3 -1
  34. data/ext/pg_query/include/access/xact.h +73 -19
  35. data/ext/pg_query/include/access/xlog.h +60 -155
  36. data/ext/pg_query/include/access/xlog_internal.h +40 -13
  37. data/ext/pg_query/include/access/xlogdefs.h +8 -16
  38. data/ext/pg_query/include/access/xlogprefetcher.h +55 -0
  39. data/ext/pg_query/include/access/xlogreader.h +145 -39
  40. data/ext/pg_query/include/access/xlogrecord.h +18 -9
  41. data/ext/pg_query/include/access/xlogrecovery.h +157 -0
  42. data/ext/pg_query/include/c.h +101 -44
  43. data/ext/pg_query/include/catalog/catalog.h +3 -1
  44. data/ext/pg_query/include/catalog/catversion.h +2 -2
  45. data/ext/pg_query/include/catalog/dependency.h +8 -16
  46. data/ext/pg_query/include/catalog/genbki.h +83 -5
  47. data/ext/pg_query/include/catalog/index.h +18 -3
  48. data/ext/pg_query/include/catalog/indexing.h +12 -324
  49. data/ext/pg_query/include/catalog/namespace.h +4 -2
  50. data/ext/pg_query/include/catalog/objectaccess.h +70 -2
  51. data/ext/pg_query/include/catalog/objectaddress.h +11 -6
  52. data/ext/pg_query/include/catalog/pg_aggregate.h +14 -10
  53. data/ext/pg_query/include/catalog/pg_aggregate_d.h +2 -1
  54. data/ext/pg_query/include/catalog/pg_am.h +4 -1
  55. data/ext/pg_query/include/catalog/pg_am_d.h +3 -1
  56. data/ext/pg_query/include/catalog/pg_attribute.h +27 -10
  57. data/ext/pg_query/include/catalog/pg_attribute_d.h +21 -18
  58. data/ext/pg_query/include/catalog/pg_authid.h +7 -2
  59. data/ext/pg_query/include/catalog/pg_authid_d.h +17 -9
  60. data/ext/pg_query/include/catalog/pg_class.h +44 -14
  61. data/ext/pg_query/include/catalog/pg_class_d.h +30 -1
  62. data/ext/pg_query/include/catalog/pg_collation.h +33 -8
  63. data/ext/pg_query/include/catalog/pg_collation_d.h +20 -3
  64. data/ext/pg_query/include/catalog/pg_constraint.h +38 -12
  65. data/ext/pg_query/include/catalog/pg_constraint_d.h +10 -4
  66. data/ext/pg_query/include/catalog/pg_control.h +3 -5
  67. data/ext/pg_query/include/catalog/pg_conversion.h +7 -4
  68. data/ext/pg_query/include/catalog/pg_conversion_d.h +4 -1
  69. data/ext/pg_query/include/catalog/pg_depend.h +11 -7
  70. data/ext/pg_query/include/catalog/pg_depend_d.h +3 -1
  71. data/ext/pg_query/include/catalog/pg_event_trigger.h +9 -3
  72. data/ext/pg_query/include/catalog/pg_event_trigger_d.h +3 -1
  73. data/ext/pg_query/include/catalog/pg_index.h +17 -7
  74. data/ext/pg_query/include/catalog/pg_index_d.h +20 -17
  75. data/ext/pg_query/include/catalog/pg_language.h +10 -5
  76. data/ext/pg_query/include/catalog/pg_language_d.h +3 -1
  77. data/ext/pg_query/include/catalog/pg_namespace.h +7 -2
  78. data/ext/pg_query/include/catalog/pg_namespace_d.h +3 -1
  79. data/ext/pg_query/include/catalog/pg_opclass.h +8 -5
  80. data/ext/pg_query/include/catalog/pg_opclass_d.h +3 -1
  81. data/ext/pg_query/include/catalog/pg_operator.h +18 -15
  82. data/ext/pg_query/include/catalog/pg_operator_d.h +37 -1
  83. data/ext/pg_query/include/catalog/pg_opfamily.h +6 -3
  84. data/ext/pg_query/include/catalog/pg_opfamily_d.h +3 -1
  85. data/ext/pg_query/include/catalog/pg_parameter_acl.h +60 -0
  86. data/ext/pg_query/include/catalog/pg_parameter_acl_d.h +34 -0
  87. data/ext/pg_query/include/catalog/pg_partitioned_table.h +20 -9
  88. data/ext/pg_query/include/catalog/pg_partitioned_table_d.h +2 -1
  89. data/ext/pg_query/include/catalog/pg_proc.h +20 -11
  90. data/ext/pg_query/include/catalog/pg_proc_d.h +10 -8
  91. data/ext/pg_query/include/catalog/pg_publication.h +50 -7
  92. data/ext/pg_query/include/catalog/pg_publication_d.h +3 -1
  93. data/ext/pg_query/include/catalog/pg_replication_origin.h +6 -1
  94. data/ext/pg_query/include/catalog/pg_replication_origin_d.h +5 -1
  95. data/ext/pg_query/include/catalog/pg_statistic.h +19 -12
  96. data/ext/pg_query/include/catalog/pg_statistic_d.h +2 -1
  97. data/ext/pg_query/include/catalog/pg_statistic_ext.h +19 -5
  98. data/ext/pg_query/include/catalog/pg_statistic_ext_d.h +7 -2
  99. data/ext/pg_query/include/catalog/pg_transform.h +8 -5
  100. data/ext/pg_query/include/catalog/pg_transform_d.h +3 -1
  101. data/ext/pg_query/include/catalog/pg_trigger.h +24 -8
  102. data/ext/pg_query/include/catalog/pg_trigger_d.h +4 -1
  103. data/ext/pg_query/include/catalog/pg_ts_config.h +6 -3
  104. data/ext/pg_query/include/catalog/pg_ts_config_d.h +3 -1
  105. data/ext/pg_query/include/catalog/pg_ts_dict.h +8 -3
  106. data/ext/pg_query/include/catalog/pg_ts_dict_d.h +3 -1
  107. data/ext/pg_query/include/catalog/pg_ts_parser.h +6 -3
  108. data/ext/pg_query/include/catalog/pg_ts_parser_d.h +3 -1
  109. data/ext/pg_query/include/catalog/pg_ts_template.h +6 -3
  110. data/ext/pg_query/include/catalog/pg_ts_template_d.h +3 -1
  111. data/ext/pg_query/include/catalog/pg_type.h +55 -24
  112. data/ext/pg_query/include/catalog/pg_type_d.h +70 -31
  113. data/ext/pg_query/include/catalog/storage.h +5 -3
  114. data/ext/pg_query/include/commands/async.h +3 -4
  115. data/ext/pg_query/include/commands/dbcommands.h +2 -1
  116. data/ext/pg_query/include/commands/defrem.h +11 -24
  117. data/ext/pg_query/include/commands/event_trigger.h +2 -2
  118. data/ext/pg_query/include/commands/explain.h +1 -1
  119. data/ext/pg_query/include/commands/prepare.h +1 -1
  120. data/ext/pg_query/include/commands/tablespace.h +2 -2
  121. data/ext/pg_query/include/commands/trigger.h +18 -16
  122. data/ext/pg_query/include/commands/user.h +2 -2
  123. data/ext/pg_query/include/commands/vacuum.h +88 -41
  124. data/ext/pg_query/include/commands/variable.h +1 -1
  125. data/ext/pg_query/include/common/file_perm.h +4 -4
  126. data/ext/pg_query/include/common/hashfn.h +1 -1
  127. data/ext/pg_query/include/common/ip.h +1 -7
  128. data/ext/pg_query/include/common/keywords.h +2 -6
  129. data/ext/pg_query/include/common/kwlookup.h +1 -1
  130. data/ext/pg_query/include/common/pg_prng.h +60 -0
  131. data/ext/pg_query/include/common/relpath.h +2 -2
  132. data/ext/pg_query/include/common/string.h +24 -1
  133. data/ext/pg_query/include/common/unicode_combining_table.h +114 -2
  134. data/ext/pg_query/include/common/unicode_east_asian_fw_table.h +125 -0
  135. data/ext/pg_query/include/datatype/timestamp.h +40 -1
  136. data/ext/pg_query/include/executor/execdesc.h +1 -1
  137. data/ext/pg_query/include/executor/executor.h +65 -22
  138. data/ext/pg_query/include/executor/functions.h +17 -3
  139. data/ext/pg_query/include/executor/instrument.h +33 -16
  140. data/ext/pg_query/include/executor/spi.h +41 -3
  141. data/ext/pg_query/include/executor/tablefunc.h +1 -1
  142. data/ext/pg_query/include/executor/tuptable.h +1 -1
  143. data/ext/pg_query/include/fmgr.h +13 -7
  144. data/ext/pg_query/include/funcapi.h +16 -4
  145. data/ext/pg_query/include/getaddrinfo.h +1 -1
  146. data/ext/pg_query/include/jit/jit.h +11 -11
  147. data/ext/pg_query/include/kwlist_d.h +517 -494
  148. data/ext/pg_query/include/lib/dshash.h +112 -0
  149. data/ext/pg_query/include/lib/ilist.h +20 -1
  150. data/ext/pg_query/include/lib/pairingheap.h +1 -1
  151. data/ext/pg_query/include/lib/simplehash.h +140 -15
  152. data/ext/pg_query/include/lib/sort_template.h +432 -0
  153. data/ext/pg_query/include/lib/stringinfo.h +1 -1
  154. data/ext/pg_query/include/libpq/auth.h +6 -4
  155. data/ext/pg_query/include/libpq/crypt.h +5 -4
  156. data/ext/pg_query/include/libpq/hba.h +43 -4
  157. data/ext/pg_query/include/libpq/libpq-be.h +23 -6
  158. data/ext/pg_query/include/libpq/libpq.h +30 -20
  159. data/ext/pg_query/include/libpq/pqcomm.h +17 -31
  160. data/ext/pg_query/include/libpq/pqformat.h +1 -1
  161. data/ext/pg_query/include/libpq/pqsignal.h +4 -4
  162. data/ext/pg_query/include/mb/pg_wchar.h +105 -23
  163. data/ext/pg_query/include/mb/stringinfo_mb.h +1 -1
  164. data/ext/pg_query/include/miscadmin.h +47 -41
  165. data/ext/pg_query/include/nodes/bitmapset.h +1 -1
  166. data/ext/pg_query/include/nodes/execnodes.h +270 -78
  167. data/ext/pg_query/include/nodes/extensible.h +4 -2
  168. data/ext/pg_query/include/nodes/lockoptions.h +1 -1
  169. data/ext/pg_query/include/nodes/makefuncs.h +7 -6
  170. data/ext/pg_query/include/nodes/memnodes.h +5 -3
  171. data/ext/pg_query/include/nodes/nodeFuncs.h +1 -1
  172. data/ext/pg_query/include/nodes/nodes.h +30 -11
  173. data/ext/pg_query/include/nodes/params.h +1 -1
  174. data/ext/pg_query/include/nodes/parsenodes.h +322 -90
  175. data/ext/pg_query/include/nodes/pathnodes.h +243 -66
  176. data/ext/pg_query/include/nodes/pg_list.h +75 -69
  177. data/ext/pg_query/include/nodes/plannodes.h +111 -28
  178. data/ext/pg_query/include/nodes/primnodes.h +99 -47
  179. data/ext/pg_query/include/nodes/print.h +1 -1
  180. data/ext/pg_query/include/nodes/tidbitmap.h +1 -1
  181. data/ext/pg_query/include/nodes/value.h +58 -39
  182. data/ext/pg_query/include/optimizer/cost.h +9 -2
  183. data/ext/pg_query/include/optimizer/geqo.h +9 -7
  184. data/ext/pg_query/include/optimizer/geqo_gene.h +1 -1
  185. data/ext/pg_query/include/optimizer/optimizer.h +25 -17
  186. data/ext/pg_query/include/optimizer/paths.h +6 -6
  187. data/ext/pg_query/include/optimizer/planmain.h +15 -14
  188. data/ext/pg_query/include/parser/analyze.h +19 -5
  189. data/ext/pg_query/include/parser/gram.h +947 -913
  190. data/ext/pg_query/include/parser/gramparse.h +1 -1
  191. data/ext/pg_query/include/parser/kwlist.h +463 -453
  192. data/ext/pg_query/include/parser/parse_agg.h +2 -7
  193. data/ext/pg_query/include/parser/parse_coerce.h +3 -1
  194. data/ext/pg_query/include/parser/parse_expr.h +2 -3
  195. data/ext/pg_query/include/parser/parse_func.h +2 -1
  196. data/ext/pg_query/include/parser/parse_node.h +21 -9
  197. data/ext/pg_query/include/parser/parse_oper.h +1 -3
  198. data/ext/pg_query/include/parser/parse_relation.h +5 -4
  199. data/ext/pg_query/include/parser/parse_type.h +1 -1
  200. data/ext/pg_query/include/parser/parser.h +31 -4
  201. data/ext/pg_query/include/parser/parsetree.h +1 -1
  202. data/ext/pg_query/include/parser/scanner.h +1 -1
  203. data/ext/pg_query/include/parser/scansup.h +2 -5
  204. data/ext/pg_query/include/partitioning/partdefs.h +1 -1
  205. data/ext/pg_query/include/pg_config.h +83 -41
  206. data/ext/pg_query/include/pg_config_manual.h +74 -21
  207. data/ext/pg_query/include/pg_getopt.h +6 -6
  208. data/ext/pg_query/include/pg_query.h +5 -4
  209. data/ext/pg_query/include/pg_query_enum_defs.c +358 -241
  210. data/ext/pg_query/include/pg_query_fingerprint_conds.c +44 -7
  211. data/ext/pg_query/include/pg_query_fingerprint_defs.c +939 -113
  212. data/ext/pg_query/include/pg_query_outfuncs_conds.c +43 -13
  213. data/ext/pg_query/include/pg_query_outfuncs_defs.c +151 -26
  214. data/ext/pg_query/include/pg_query_readfuncs_conds.c +11 -2
  215. data/ext/pg_query/include/pg_query_readfuncs_defs.c +173 -30
  216. data/ext/pg_query/include/pg_trace.h +1 -1
  217. data/ext/pg_query/include/pgstat.h +449 -1238
  218. data/ext/pg_query/include/pgtime.h +14 -4
  219. data/ext/pg_query/include/pl_gram.h +126 -128
  220. data/ext/pg_query/include/pl_reserved_kwlist.h +1 -1
  221. data/ext/pg_query/include/pl_reserved_kwlist_d.h +10 -10
  222. data/ext/pg_query/include/pl_unreserved_kwlist.h +2 -3
  223. data/ext/pg_query/include/pl_unreserved_kwlist_d.h +54 -56
  224. data/ext/pg_query/include/plerrcodes.h +9 -1
  225. data/ext/pg_query/include/plpgsql.h +52 -54
  226. data/ext/pg_query/include/port/atomics/arch-arm.h +7 -1
  227. data/ext/pg_query/include/port/atomics/arch-ppc.h +1 -1
  228. data/ext/pg_query/include/port/atomics/arch-x86.h +1 -1
  229. data/ext/pg_query/include/port/atomics/fallback.h +1 -1
  230. data/ext/pg_query/include/port/atomics/generic-gcc.h +3 -3
  231. data/ext/pg_query/include/port/atomics/generic.h +1 -1
  232. data/ext/pg_query/include/port/atomics.h +1 -1
  233. data/ext/pg_query/include/port/pg_bitutils.h +40 -10
  234. data/ext/pg_query/include/port/pg_bswap.h +1 -1
  235. data/ext/pg_query/include/port/pg_crc32c.h +1 -1
  236. data/ext/pg_query/include/port.h +71 -46
  237. data/ext/pg_query/include/portability/instr_time.h +1 -1
  238. data/ext/pg_query/include/postgres.h +60 -16
  239. data/ext/pg_query/include/postmaster/autovacuum.h +17 -17
  240. data/ext/pg_query/include/postmaster/auxprocess.h +20 -0
  241. data/ext/pg_query/include/postmaster/bgworker.h +2 -1
  242. data/ext/pg_query/include/postmaster/bgworker_internals.h +2 -2
  243. data/ext/pg_query/include/postmaster/bgwriter.h +5 -5
  244. data/ext/pg_query/include/postmaster/fork_process.h +1 -1
  245. data/ext/pg_query/include/postmaster/interrupt.h +1 -1
  246. data/ext/pg_query/include/postmaster/pgarch.h +42 -8
  247. data/ext/pg_query/include/postmaster/postmaster.h +18 -17
  248. data/ext/pg_query/include/postmaster/startup.h +39 -0
  249. data/ext/pg_query/include/postmaster/syslogger.h +15 -10
  250. data/ext/pg_query/include/postmaster/walwriter.h +3 -3
  251. data/ext/pg_query/include/protobuf/pg_query.pb-c.h +1419 -914
  252. data/ext/pg_query/include/protobuf/pg_query.pb.h +43678 -32769
  253. data/ext/pg_query/include/regex/regex.h +18 -16
  254. data/ext/pg_query/include/replication/logicallauncher.h +3 -5
  255. data/ext/pg_query/include/replication/logicalproto.h +161 -17
  256. data/ext/pg_query/include/replication/logicalworker.h +1 -1
  257. data/ext/pg_query/include/replication/origin.h +7 -7
  258. data/ext/pg_query/include/replication/reorderbuffer.h +259 -42
  259. data/ext/pg_query/include/replication/slot.h +22 -11
  260. data/ext/pg_query/include/replication/syncrep.h +5 -5
  261. data/ext/pg_query/include/replication/walreceiver.h +145 -13
  262. data/ext/pg_query/include/replication/walsender.h +8 -8
  263. data/ext/pg_query/include/rewrite/prs2lock.h +1 -1
  264. data/ext/pg_query/include/rewrite/rewriteHandler.h +1 -3
  265. data/ext/pg_query/include/rewrite/rewriteManip.h +1 -1
  266. data/ext/pg_query/include/rewrite/rewriteSupport.h +1 -1
  267. data/ext/pg_query/include/storage/backendid.h +3 -3
  268. data/ext/pg_query/include/storage/block.h +4 -10
  269. data/ext/pg_query/include/storage/buf.h +1 -1
  270. data/ext/pg_query/include/storage/bufmgr.h +19 -14
  271. data/ext/pg_query/include/storage/bufpage.h +6 -8
  272. data/ext/pg_query/include/storage/condition_variable.h +13 -2
  273. data/ext/pg_query/include/storage/dsm.h +4 -1
  274. data/ext/pg_query/include/storage/dsm_impl.h +3 -2
  275. data/ext/pg_query/include/storage/fd.h +33 -3
  276. data/ext/pg_query/include/storage/fileset.h +40 -0
  277. data/ext/pg_query/include/storage/ipc.h +4 -1
  278. data/ext/pg_query/include/storage/item.h +1 -1
  279. data/ext/pg_query/include/storage/itemid.h +1 -1
  280. data/ext/pg_query/include/storage/itemptr.h +3 -1
  281. data/ext/pg_query/include/storage/large_object.h +2 -2
  282. data/ext/pg_query/include/storage/latch.h +9 -13
  283. data/ext/pg_query/include/storage/lmgr.h +2 -1
  284. data/ext/pg_query/include/storage/lock.h +11 -8
  285. data/ext/pg_query/include/storage/lockdefs.h +2 -2
  286. data/ext/pg_query/include/storage/lwlock.h +5 -32
  287. data/ext/pg_query/include/storage/lwlocknames.h +0 -1
  288. data/ext/pg_query/include/storage/off.h +1 -1
  289. data/ext/pg_query/include/storage/pg_sema.h +1 -1
  290. data/ext/pg_query/include/storage/pg_shmem.h +9 -7
  291. data/ext/pg_query/include/storage/pmsignal.h +15 -4
  292. data/ext/pg_query/include/storage/predicate.h +4 -4
  293. data/ext/pg_query/include/storage/proc.h +173 -59
  294. data/ext/pg_query/include/storage/procarray.h +98 -0
  295. data/ext/pg_query/include/storage/proclist_types.h +1 -1
  296. data/ext/pg_query/include/storage/procsignal.h +3 -7
  297. data/ext/pg_query/include/storage/relfilenode.h +1 -1
  298. data/ext/pg_query/include/storage/s_lock.h +60 -21
  299. data/ext/pg_query/include/storage/sharedfileset.h +3 -11
  300. data/ext/pg_query/include/storage/shm_mq.h +5 -4
  301. data/ext/pg_query/include/storage/shm_toc.h +1 -1
  302. data/ext/pg_query/include/storage/shmem.h +1 -1
  303. data/ext/pg_query/include/storage/sinval.h +3 -3
  304. data/ext/pg_query/include/storage/sinvaladt.h +1 -1
  305. data/ext/pg_query/include/storage/smgr.h +10 -8
  306. data/ext/pg_query/include/storage/spin.h +2 -2
  307. data/ext/pg_query/include/storage/standby.h +13 -6
  308. data/ext/pg_query/include/storage/standbydefs.h +2 -2
  309. data/ext/pg_query/include/storage/sync.h +7 -3
  310. data/ext/pg_query/include/tcop/cmdtag.h +1 -1
  311. data/ext/pg_query/include/tcop/cmdtaglist.h +3 -2
  312. data/ext/pg_query/include/tcop/deparse_utility.h +1 -1
  313. data/ext/pg_query/include/tcop/dest.h +1 -1
  314. data/ext/pg_query/include/tcop/fastpath.h +1 -2
  315. data/ext/pg_query/include/tcop/pquery.h +1 -1
  316. data/ext/pg_query/include/tcop/tcopprot.h +19 -11
  317. data/ext/pg_query/include/tcop/utility.h +7 -3
  318. data/ext/pg_query/include/tsearch/ts_cache.h +2 -2
  319. data/ext/pg_query/include/utils/acl.h +24 -3
  320. data/ext/pg_query/include/utils/aclchk_internal.h +1 -1
  321. data/ext/pg_query/include/utils/array.h +7 -2
  322. data/ext/pg_query/include/utils/backend_progress.h +44 -0
  323. data/ext/pg_query/include/utils/backend_status.h +321 -0
  324. data/ext/pg_query/include/utils/builtins.h +10 -11
  325. data/ext/pg_query/include/utils/bytea.h +3 -2
  326. data/ext/pg_query/include/utils/catcache.h +1 -1
  327. data/ext/pg_query/include/utils/date.h +1 -1
  328. data/ext/pg_query/include/utils/datetime.h +8 -7
  329. data/ext/pg_query/include/utils/datum.h +9 -1
  330. data/ext/pg_query/include/utils/dsa.h +1 -1
  331. data/ext/pg_query/include/utils/dynahash.h +4 -3
  332. data/ext/pg_query/include/utils/elog.h +52 -21
  333. data/ext/pg_query/include/utils/errcodes.h +2 -0
  334. data/ext/pg_query/include/utils/expandeddatum.h +1 -1
  335. data/ext/pg_query/include/utils/expandedrecord.h +1 -1
  336. data/ext/pg_query/include/utils/float.h +7 -7
  337. data/ext/pg_query/include/utils/fmgroids.h +1300 -696
  338. data/ext/pg_query/include/utils/fmgrprotos.h +199 -16
  339. data/ext/pg_query/include/utils/fmgrtab.h +6 -5
  340. data/ext/pg_query/include/utils/guc.h +69 -43
  341. data/ext/pg_query/include/utils/guc_tables.h +23 -19
  342. data/ext/pg_query/include/utils/hsearch.h +15 -11
  343. data/ext/pg_query/include/utils/inval.h +4 -1
  344. data/ext/pg_query/include/utils/lsyscache.h +11 -1
  345. data/ext/pg_query/include/utils/memdebug.h +1 -1
  346. data/ext/pg_query/include/utils/memutils.h +8 -3
  347. data/ext/pg_query/include/utils/numeric.h +19 -5
  348. data/ext/pg_query/include/utils/palloc.h +25 -3
  349. data/ext/pg_query/include/utils/partcache.h +1 -1
  350. data/ext/pg_query/include/utils/pg_locale.h +17 -9
  351. data/ext/pg_query/include/utils/pg_lsn.h +1 -1
  352. data/ext/pg_query/include/utils/pgstat_internal.h +784 -0
  353. data/ext/pg_query/include/utils/pidfile.h +1 -1
  354. data/ext/pg_query/include/utils/plancache.h +6 -5
  355. data/ext/pg_query/include/utils/portal.h +10 -12
  356. data/ext/pg_query/include/utils/ps_status.h +1 -1
  357. data/ext/pg_query/include/utils/queryenvironment.h +1 -1
  358. data/ext/pg_query/include/utils/queryjumble.h +88 -0
  359. data/ext/pg_query/include/utils/regproc.h +14 -3
  360. data/ext/pg_query/include/utils/rel.h +71 -19
  361. data/ext/pg_query/include/utils/relcache.h +8 -5
  362. data/ext/pg_query/include/utils/reltrigger.h +1 -1
  363. data/ext/pg_query/include/utils/resowner.h +1 -1
  364. data/ext/pg_query/include/utils/rls.h +2 -2
  365. data/ext/pg_query/include/utils/ruleutils.h +4 -1
  366. data/ext/pg_query/include/utils/sharedtuplestore.h +1 -1
  367. data/ext/pg_query/include/utils/snapmgr.h +34 -14
  368. data/ext/pg_query/include/utils/snapshot.h +14 -1
  369. data/ext/pg_query/include/utils/sortsupport.h +117 -2
  370. data/ext/pg_query/include/utils/syscache.h +6 -1
  371. data/ext/pg_query/include/utils/timeout.h +11 -4
  372. data/ext/pg_query/include/utils/timestamp.h +6 -5
  373. data/ext/pg_query/include/utils/tuplesort.h +25 -11
  374. data/ext/pg_query/include/utils/tuplestore.h +2 -2
  375. data/ext/pg_query/include/utils/typcache.h +24 -17
  376. data/ext/pg_query/include/utils/tzparser.h +1 -1
  377. data/ext/pg_query/include/utils/varlena.h +5 -3
  378. data/ext/pg_query/include/utils/wait_event.h +289 -0
  379. data/ext/pg_query/include/utils/xml.h +4 -4
  380. data/ext/pg_query/pg_query.pb-c.c +4302 -2304
  381. data/ext/pg_query/pg_query_deparse.c +1106 -373
  382. data/ext/pg_query/pg_query_fingerprint.c +30 -10
  383. data/ext/pg_query/pg_query_json_plpgsql.c +0 -25
  384. data/ext/pg_query/pg_query_normalize.c +1 -1
  385. data/ext/pg_query/pg_query_outfuncs_json.c +54 -16
  386. data/ext/pg_query/pg_query_outfuncs_protobuf.c +70 -10
  387. data/ext/pg_query/pg_query_parse.c +1 -1
  388. data/ext/pg_query/pg_query_readfuncs_protobuf.c +42 -8
  389. data/ext/pg_query/pg_query_scan.c +2 -1
  390. data/ext/pg_query/pg_query_split.c +3 -2
  391. data/ext/pg_query/src_backend_catalog_namespace.c +20 -9
  392. data/ext/pg_query/src_backend_catalog_pg_proc.c +4 -1
  393. data/ext/pg_query/src_backend_commands_define.c +11 -1
  394. data/ext/pg_query/src_backend_nodes_bitmapset.c +3 -1
  395. data/ext/pg_query/src_backend_nodes_copyfuncs.c +401 -76
  396. data/ext/pg_query/src_backend_nodes_equalfuncs.c +290 -46
  397. data/ext/pg_query/src_backend_nodes_extensible.c +1 -1
  398. data/ext/pg_query/src_backend_nodes_list.c +74 -11
  399. data/ext/pg_query/src_backend_nodes_makefuncs.c +5 -4
  400. data/ext/pg_query/src_backend_nodes_nodeFuncs.c +55 -12
  401. data/ext/pg_query/src_backend_nodes_value.c +28 -19
  402. data/ext/pg_query/src_backend_parser_gram.c +33874 -31261
  403. data/ext/pg_query/src_backend_parser_parser.c +26 -7
  404. data/ext/pg_query/src_backend_parser_scan.c +172 -209
  405. data/ext/pg_query/src_backend_parser_scansup.c +4 -28
  406. data/ext/pg_query/src_backend_postmaster_postmaster.c +77 -106
  407. data/ext/pg_query/src_backend_storage_ipc_ipc.c +13 -4
  408. data/ext/pg_query/src_backend_storage_lmgr_s_lock.c +5 -4
  409. data/ext/pg_query/src_backend_tcop_postgres.c +62 -23
  410. data/ext/pg_query/src_backend_utils_activity_pgstat_database.c +140 -0
  411. data/ext/pg_query/src_backend_utils_adt_datum.c +13 -1
  412. data/ext/pg_query/src_backend_utils_adt_expandeddatum.c +1 -1
  413. data/ext/pg_query/src_backend_utils_adt_format_type.c +6 -2
  414. data/ext/pg_query/src_backend_utils_adt_ruleutils.c +71 -5
  415. data/ext/pg_query/src_backend_utils_error_assert.c +16 -14
  416. data/ext/pg_query/src_backend_utils_error_elog.c +172 -99
  417. data/ext/pg_query/src_backend_utils_fmgr_fmgr.c +12 -17
  418. data/ext/pg_query/src_backend_utils_hash_dynahash.c +40 -10
  419. data/ext/pg_query/src_backend_utils_init_globals.c +5 -5
  420. data/ext/pg_query/src_backend_utils_mb_mbutils.c +55 -66
  421. data/ext/pg_query/src_backend_utils_misc_guc.c +206 -45
  422. data/ext/pg_query/src_backend_utils_mmgr_aset.c +7 -5
  423. data/ext/pg_query/src_backend_utils_mmgr_mcxt.c +123 -35
  424. data/ext/pg_query/src_common_encnames.c +1 -1
  425. data/ext/pg_query/src_common_hashfn.c +3 -3
  426. data/ext/pg_query/src_common_keywords.c +15 -2
  427. data/ext/pg_query/src_common_kwlist_d.h +517 -494
  428. data/ext/pg_query/src_common_kwlookup.c +1 -1
  429. data/ext/pg_query/src_common_pg_prng.c +152 -0
  430. data/ext/pg_query/src_common_psprintf.c +1 -1
  431. data/ext/pg_query/src_common_string.c +7 -1
  432. data/ext/pg_query/src_common_stringinfo.c +1 -1
  433. data/ext/pg_query/src_common_wchar.c +701 -109
  434. data/ext/pg_query/src_pl_plpgsql_src_pl_comp.c +45 -20
  435. data/ext/pg_query/src_pl_plpgsql_src_pl_funcs.c +1 -18
  436. data/ext/pg_query/src_pl_plpgsql_src_pl_gram.c +1233 -1259
  437. data/ext/pg_query/src_pl_plpgsql_src_pl_handler.c +1 -1
  438. data/ext/pg_query/src_pl_plpgsql_src_pl_reserved_kwlist_d.h +10 -10
  439. data/ext/pg_query/src_pl_plpgsql_src_pl_scanner.c +2 -2
  440. data/ext/pg_query/src_pl_plpgsql_src_pl_unreserved_kwlist_d.h +54 -56
  441. data/ext/pg_query/src_port_pg_bitutils.c +41 -31
  442. data/ext/pg_query/src_port_pgsleep.c +1 -1
  443. data/ext/pg_query/src_port_pgstrcasecmp.c +1 -1
  444. data/ext/pg_query/src_port_qsort.c +12 -224
  445. data/ext/pg_query/src_port_snprintf.c +37 -13
  446. data/ext/pg_query/src_port_strerror.c +9 -19
  447. data/ext/pg_query/src_port_strnlen.c +1 -1
  448. data/lib/pg_query/filter_columns.rb +1 -1
  449. data/lib/pg_query/fingerprint.rb +5 -1
  450. data/lib/pg_query/node.rb +2 -2
  451. data/lib/pg_query/param_refs.rb +1 -1
  452. data/lib/pg_query/parse.rb +18 -8
  453. data/lib/pg_query/pg_query_pb.rb +1108 -942
  454. data/lib/pg_query/truncate.rb +1 -1
  455. data/lib/pg_query/version.rb +1 -1
  456. metadata +28 -18
  457. data/ext/pg_query/include/access/xloginsert.h +0 -64
  458. data/ext/pg_query/include/bootstrap/bootstrap.h +0 -62
  459. data/ext/pg_query/include/parser/parse_clause.h +0 -54
  460. data/ext/pg_query/include/parser/parse_collate.h +0 -27
  461. data/ext/pg_query/include/parser/parse_target.h +0 -46
  462. data/ext/pg_query/pg_query_ruby_freebsd.sym +0 -2
  463. data/ext/pg_query/src_backend_libpq_pqcomm.c +0 -659
  464. data/ext/pg_query/src_backend_parser_parse_expr.c +0 -313
  465. data/ext/pg_query/src_port_erand48.c +0 -127
  466. 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
 
@@ -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
  *
@@ -4,7 +4,7 @@
4
4
  * prototypes for the creator functions of various 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/makefuncs.h
@@ -24,18 +24,18 @@ extern A_Expr *makeA_Expr(A_Expr_Kind kind, List *name,
24
24
  extern A_Expr *makeSimpleA_Expr(A_Expr_Kind kind, char *name,
25
25
  Node *lexpr, Node *rexpr, int location);
26
26
 
27
- extern Var *makeVar(Index varno,
27
+ extern Var *makeVar(int varno,
28
28
  AttrNumber varattno,
29
29
  Oid vartype,
30
30
  int32 vartypmod,
31
31
  Oid varcollid,
32
32
  Index varlevelsup);
33
33
 
34
- extern Var *makeVarFromTargetEntry(Index varno,
34
+ extern Var *makeVarFromTargetEntry(int varno,
35
35
  TargetEntry *tle);
36
36
 
37
37
  extern Var *makeWholeRowVar(RangeTblEntry *rte,
38
- Index varno,
38
+ int varno,
39
39
  Index varlevelsup,
40
40
  bool allowScalar);
41
41
 
@@ -79,7 +79,8 @@ extern ColumnDef *makeColumnDef(const char *colname,
79
79
  extern FuncExpr *makeFuncExpr(Oid funcid, Oid rettype, List *args,
80
80
  Oid funccollid, Oid inputcollid, CoercionForm fformat);
81
81
 
82
- extern FuncCall *makeFuncCall(List *name, List *args, int location);
82
+ extern FuncCall *makeFuncCall(List *name, List *args,
83
+ CoercionForm funcformat, int location);
83
84
 
84
85
  extern Expr *make_opclause(Oid opno, Oid opresulttype, bool opretset,
85
86
  Expr *leftop, Expr *rightop,
@@ -95,7 +96,7 @@ extern List *make_ands_implicit(Expr *clause);
95
96
 
96
97
  extern IndexInfo *makeIndexInfo(int numattrs, int numkeyattrs, Oid amoid,
97
98
  List *expressions, List *predicates,
98
- bool unique, bool isready, bool concurrent);
99
+ bool unique, bool nulls_not_distinct, bool isready, bool concurrent);
99
100
 
100
101
  extern DefElem *makeDefElem(char *name, Node *arg, int location);
101
102
  extern DefElem *makeDefElemExtended(char *nameSpace, char *name, Node *arg,