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
@@ -27,7 +27,7 @@
27
27
  * always be so; try to be careful to maintain the distinction.)
28
28
  *
29
29
  *
30
- * Portions Copyright (c) 1996-2020, PostgreSQL Global Development Group
30
+ * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
31
31
  * Portions Copyright (c) 1994, Regents of the University of California
32
32
  *
33
33
  * src/include/nodes/pg_list.h
@@ -144,26 +144,6 @@ list_second_cell(const List *l)
144
144
  return NULL;
145
145
  }
146
146
 
147
- /* Fetch address of list's third cell, if it has one, else NULL */
148
- static inline ListCell *
149
- list_third_cell(const List *l)
150
- {
151
- if (l && l->length >= 3)
152
- return &l->elements[2];
153
- else
154
- return NULL;
155
- }
156
-
157
- /* Fetch address of list's fourth cell, if it has one, else NULL */
158
- static inline ListCell *
159
- list_fourth_cell(const List *l)
160
- {
161
- if (l && l->length >= 4)
162
- return &l->elements[3];
163
- else
164
- return NULL;
165
- }
166
-
167
147
  /* Fetch list's length */
168
148
  static inline int
169
149
  list_length(const List *l)
@@ -186,35 +166,34 @@ list_length(const List *l)
186
166
  * linitial() than lfirst(): given a List, lsecond() returns the data
187
167
  * in the second list cell.
188
168
  */
189
-
190
169
  #define lfirst(lc) ((lc)->ptr_value)
191
170
  #define lfirst_int(lc) ((lc)->int_value)
192
171
  #define lfirst_oid(lc) ((lc)->oid_value)
193
172
  #define lfirst_node(type,lc) castNode(type, lfirst(lc))
194
173
 
195
- #define linitial(l) lfirst(list_head(l))
196
- #define linitial_int(l) lfirst_int(list_head(l))
197
- #define linitial_oid(l) lfirst_oid(list_head(l))
174
+ #define linitial(l) lfirst(list_nth_cell(l, 0))
175
+ #define linitial_int(l) lfirst_int(list_nth_cell(l, 0))
176
+ #define linitial_oid(l) lfirst_oid(list_nth_cell(l, 0))
198
177
  #define linitial_node(type,l) castNode(type, linitial(l))
199
178
 
200
- #define lsecond(l) lfirst(list_second_cell(l))
201
- #define lsecond_int(l) lfirst_int(list_second_cell(l))
202
- #define lsecond_oid(l) lfirst_oid(list_second_cell(l))
179
+ #define lsecond(l) lfirst(list_nth_cell(l, 1))
180
+ #define lsecond_int(l) lfirst_int(list_nth_cell(l, 1))
181
+ #define lsecond_oid(l) lfirst_oid(list_nth_cell(l, 1))
203
182
  #define lsecond_node(type,l) castNode(type, lsecond(l))
204
183
 
205
- #define lthird(l) lfirst(list_third_cell(l))
206
- #define lthird_int(l) lfirst_int(list_third_cell(l))
207
- #define lthird_oid(l) lfirst_oid(list_third_cell(l))
184
+ #define lthird(l) lfirst(list_nth_cell(l, 2))
185
+ #define lthird_int(l) lfirst_int(list_nth_cell(l, 2))
186
+ #define lthird_oid(l) lfirst_oid(list_nth_cell(l, 2))
208
187
  #define lthird_node(type,l) castNode(type, lthird(l))
209
188
 
210
- #define lfourth(l) lfirst(list_fourth_cell(l))
211
- #define lfourth_int(l) lfirst_int(list_fourth_cell(l))
212
- #define lfourth_oid(l) lfirst_oid(list_fourth_cell(l))
189
+ #define lfourth(l) lfirst(list_nth_cell(l, 3))
190
+ #define lfourth_int(l) lfirst_int(list_nth_cell(l, 3))
191
+ #define lfourth_oid(l) lfirst_oid(list_nth_cell(l, 3))
213
192
  #define lfourth_node(type,l) castNode(type, lfourth(l))
214
193
 
215
- #define llast(l) lfirst(list_tail(l))
216
- #define llast_int(l) lfirst_int(list_tail(l))
217
- #define llast_oid(l) lfirst_oid(list_tail(l))
194
+ #define llast(l) lfirst(list_last_cell(l))
195
+ #define llast_int(l) lfirst_int(list_last_cell(l))
196
+ #define llast_oid(l) lfirst_oid(list_last_cell(l))
218
197
  #define llast_node(type,l) castNode(type, llast(l))
219
198
 
220
199
  /*
@@ -234,6 +213,10 @@ list_length(const List *l)
234
213
  #define list_make4(x1,x2,x3,x4) \
235
214
  list_make4_impl(T_List, list_make_ptr_cell(x1), list_make_ptr_cell(x2), \
236
215
  list_make_ptr_cell(x3), list_make_ptr_cell(x4))
216
+ #define list_make5(x1,x2,x3,x4,x5) \
217
+ list_make5_impl(T_List, list_make_ptr_cell(x1), list_make_ptr_cell(x2), \
218
+ list_make_ptr_cell(x3), list_make_ptr_cell(x4), \
219
+ list_make_ptr_cell(x5))
237
220
 
238
221
  #define list_make1_int(x1) \
239
222
  list_make1_impl(T_IntList, list_make_int_cell(x1))
@@ -245,6 +228,10 @@ list_length(const List *l)
245
228
  #define list_make4_int(x1,x2,x3,x4) \
246
229
  list_make4_impl(T_IntList, list_make_int_cell(x1), list_make_int_cell(x2), \
247
230
  list_make_int_cell(x3), list_make_int_cell(x4))
231
+ #define list_make5_int(x1,x2,x3,x4,x5) \
232
+ list_make5_impl(T_IntList, list_make_int_cell(x1), list_make_int_cell(x2), \
233
+ list_make_int_cell(x3), list_make_int_cell(x4), \
234
+ list_make_int_cell(x5))
248
235
 
249
236
  #define list_make1_oid(x1) \
250
237
  list_make1_impl(T_OidList, list_make_oid_cell(x1))
@@ -256,6 +243,10 @@ list_length(const List *l)
256
243
  #define list_make4_oid(x1,x2,x3,x4) \
257
244
  list_make4_impl(T_OidList, list_make_oid_cell(x1), list_make_oid_cell(x2), \
258
245
  list_make_oid_cell(x3), list_make_oid_cell(x4))
246
+ #define list_make5_oid(x1,x2,x3,x4,x5) \
247
+ list_make5_impl(T_OidList, list_make_oid_cell(x1), list_make_oid_cell(x2), \
248
+ list_make_oid_cell(x3), list_make_oid_cell(x4), \
249
+ list_make_oid_cell(x5))
259
250
 
260
251
  /*
261
252
  * Locate the n'th cell (counting from 0) of the list.
@@ -269,6 +260,16 @@ list_nth_cell(const List *list, int n)
269
260
  return &list->elements[n];
270
261
  }
271
262
 
263
+ /*
264
+ * Return the last cell in a non-NIL List.
265
+ */
266
+ static inline ListCell *
267
+ list_last_cell(const List *list)
268
+ {
269
+ Assert(list != NIL);
270
+ return &list->elements[list->length - 1];
271
+ }
272
+
272
273
  /*
273
274
  * Return the pointer value contained in the n'th element of the
274
275
  * specified list. (List elements begin at 0.)
@@ -531,37 +532,41 @@ extern List *list_make3_impl(NodeTag t, ListCell datum1, ListCell datum2,
531
532
  ListCell datum3);
532
533
  extern List *list_make4_impl(NodeTag t, ListCell datum1, ListCell datum2,
533
534
  ListCell datum3, ListCell datum4);
535
+ extern List *list_make5_impl(NodeTag t, ListCell datum1, ListCell datum2,
536
+ ListCell datum3, ListCell datum4,
537
+ ListCell datum5);
534
538
 
535
- extern List *lappend(List *list, void *datum);
536
- extern List *lappend_int(List *list, int datum);
537
- extern List *lappend_oid(List *list, Oid datum);
539
+ extern pg_nodiscard List *lappend(List *list, void *datum);
540
+ extern pg_nodiscard List *lappend_int(List *list, int datum);
541
+ extern pg_nodiscard List *lappend_oid(List *list, Oid datum);
538
542
 
539
- extern List *list_insert_nth(List *list, int pos, void *datum);
540
- extern List *list_insert_nth_int(List *list, int pos, int datum);
541
- extern List *list_insert_nth_oid(List *list, int pos, Oid datum);
543
+ extern pg_nodiscard List *list_insert_nth(List *list, int pos, void *datum);
544
+ extern pg_nodiscard List *list_insert_nth_int(List *list, int pos, int datum);
545
+ extern pg_nodiscard List *list_insert_nth_oid(List *list, int pos, Oid datum);
542
546
 
543
- extern List *lcons(void *datum, List *list);
544
- extern List *lcons_int(int datum, List *list);
545
- extern List *lcons_oid(Oid datum, List *list);
547
+ extern pg_nodiscard List *lcons(void *datum, List *list);
548
+ extern pg_nodiscard List *lcons_int(int datum, List *list);
549
+ extern pg_nodiscard List *lcons_oid(Oid datum, List *list);
546
550
 
547
- extern List *list_concat(List *list1, const List *list2);
548
- extern List *list_concat_copy(const List *list1, const List *list2);
551
+ extern pg_nodiscard List *list_concat(List *list1, const List *list2);
552
+ extern pg_nodiscard List *list_concat_copy(const List *list1, const List *list2);
549
553
 
550
- extern List *list_truncate(List *list, int new_size);
554
+ extern pg_nodiscard List *list_truncate(List *list, int new_size);
551
555
 
552
556
  extern bool list_member(const List *list, const void *datum);
553
557
  extern bool list_member_ptr(const List *list, const void *datum);
554
558
  extern bool list_member_int(const List *list, int datum);
555
559
  extern bool list_member_oid(const List *list, Oid datum);
556
560
 
557
- extern List *list_delete(List *list, void *datum);
558
- extern List *list_delete_ptr(List *list, void *datum);
559
- extern List *list_delete_int(List *list, int datum);
560
- extern List *list_delete_oid(List *list, Oid datum);
561
- extern List *list_delete_first(List *list);
562
- extern List *list_delete_last(List *list);
563
- extern List *list_delete_nth_cell(List *list, int n);
564
- extern List *list_delete_cell(List *list, ListCell *cell);
561
+ extern pg_nodiscard List *list_delete(List *list, void *datum);
562
+ extern pg_nodiscard List *list_delete_ptr(List *list, void *datum);
563
+ extern pg_nodiscard List *list_delete_int(List *list, int datum);
564
+ extern pg_nodiscard List *list_delete_oid(List *list, Oid datum);
565
+ extern pg_nodiscard List *list_delete_first(List *list);
566
+ extern pg_nodiscard List *list_delete_last(List *list);
567
+ extern pg_nodiscard List *list_delete_first_n(List *list, int n);
568
+ extern pg_nodiscard List *list_delete_nth_cell(List *list, int n);
569
+ extern pg_nodiscard List *list_delete_cell(List *list, ListCell *cell);
565
570
 
566
571
  extern List *list_union(const List *list1, const List *list2);
567
572
  extern List *list_union_ptr(const List *list1, const List *list2);
@@ -578,28 +583,30 @@ extern List *list_difference_ptr(const List *list1, const List *list2);
578
583
  extern List *list_difference_int(const List *list1, const List *list2);
579
584
  extern List *list_difference_oid(const List *list1, const List *list2);
580
585
 
581
- extern List *list_append_unique(List *list, void *datum);
582
- extern List *list_append_unique_ptr(List *list, void *datum);
583
- extern List *list_append_unique_int(List *list, int datum);
584
- extern List *list_append_unique_oid(List *list, Oid datum);
586
+ extern pg_nodiscard List *list_append_unique(List *list, void *datum);
587
+ extern pg_nodiscard List *list_append_unique_ptr(List *list, void *datum);
588
+ extern pg_nodiscard List *list_append_unique_int(List *list, int datum);
589
+ extern pg_nodiscard List *list_append_unique_oid(List *list, Oid datum);
585
590
 
586
- extern List *list_concat_unique(List *list1, const List *list2);
587
- extern List *list_concat_unique_ptr(List *list1, const List *list2);
588
- extern List *list_concat_unique_int(List *list1, const List *list2);
589
- extern List *list_concat_unique_oid(List *list1, const List *list2);
591
+ extern pg_nodiscard List *list_concat_unique(List *list1, const List *list2);
592
+ extern pg_nodiscard List *list_concat_unique_ptr(List *list1, const List *list2);
593
+ extern pg_nodiscard List *list_concat_unique_int(List *list1, const List *list2);
594
+ extern pg_nodiscard List *list_concat_unique_oid(List *list1, const List *list2);
590
595
 
591
596
  extern void list_deduplicate_oid(List *list);
592
597
 
593
598
  extern void list_free(List *list);
594
599
  extern void list_free_deep(List *list);
595
600
 
596
- extern List *list_copy(const List *list);
597
- extern List *list_copy_tail(const List *list, int nskip);
598
- extern List *list_copy_deep(const List *oldlist);
601
+ extern pg_nodiscard List *list_copy(const List *list);
602
+ extern pg_nodiscard List *list_copy_head(const List *oldlist, int len);
603
+ extern pg_nodiscard List *list_copy_tail(const List *list, int nskip);
604
+ extern pg_nodiscard List *list_copy_deep(const List *oldlist);
599
605
 
600
606
  typedef int (*list_sort_comparator) (const ListCell *a, const ListCell *b);
601
607
  extern void list_sort(List *list, list_sort_comparator cmp);
602
608
 
609
+ extern int list_int_cmp(const ListCell *p1, const ListCell *p2);
603
610
  extern int list_oid_cmp(const ListCell *p1, const ListCell *p2);
604
611
 
605
612
  #endif /* PG_LIST_H */
@@ -4,7 +4,7 @@
4
4
  * definitions for query plan 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/plannodes.h
@@ -19,6 +19,7 @@
19
19
  #include "lib/stringinfo.h"
20
20
  #include "nodes/bitmapset.h"
21
21
  #include "nodes/lockoptions.h"
22
+ #include "nodes/parsenodes.h"
22
23
  #include "nodes/primnodes.h"
23
24
 
24
25
 
@@ -43,7 +44,7 @@ typedef struct PlannedStmt
43
44
  {
44
45
  NodeTag type;
45
46
 
46
- CmdType commandType; /* select|insert|update|delete|utility */
47
+ CmdType commandType; /* select|insert|update|delete|merge|utility */
47
48
 
48
49
  uint64 queryId; /* query identifier (copied from Query) */
49
50
 
@@ -65,15 +66,9 @@ typedef struct PlannedStmt
65
66
 
66
67
  List *rtable; /* list of RangeTblEntry nodes */
67
68
 
68
- /* rtable indexes of target relations for INSERT/UPDATE/DELETE */
69
+ /* rtable indexes of target relations for INSERT/UPDATE/DELETE/MERGE */
69
70
  List *resultRelations; /* integer list of RT indexes, or NIL */
70
71
 
71
- /*
72
- * rtable indexes of partitioned table roots that are UPDATE/DELETE
73
- * targets; needed for trigger firing.
74
- */
75
- List *rootResultRelations;
76
-
77
72
  List *appendRelations; /* list of AppendRelInfo nodes */
78
73
 
79
74
  List *subplans; /* Plan trees for SubPlan expressions; note
@@ -126,7 +121,7 @@ typedef struct Plan
126
121
  /*
127
122
  * planner's estimate of result size of this plan step
128
123
  */
129
- double plan_rows; /* number of rows plan is expected to emit */
124
+ Cardinality plan_rows; /* number of rows plan is expected to emit */
130
125
  int plan_width; /* average row width in bytes */
131
126
 
132
127
  /*
@@ -135,6 +130,11 @@ typedef struct Plan
135
130
  bool parallel_aware; /* engage parallel-aware logic? */
136
131
  bool parallel_safe; /* OK to use as part of parallel plan? */
137
132
 
133
+ /*
134
+ * information needed for asynchronous execution
135
+ */
136
+ bool async_capable; /* engage asynchronous-capable logic? */
137
+
138
138
  /*
139
139
  * Common structural data for all Plan types.
140
140
  */
@@ -202,31 +202,29 @@ typedef struct ProjectSet
202
202
 
203
203
  /* ----------------
204
204
  * ModifyTable node -
205
- * Apply rows produced by subplan(s) to result table(s),
205
+ * Apply rows produced by outer plan to result table(s),
206
206
  * by inserting, updating, or deleting.
207
207
  *
208
208
  * If the originally named target table is a partitioned table, both
209
209
  * nominalRelation and rootRelation contain the RT index of the partition
210
210
  * root, which is not otherwise mentioned in the plan. Otherwise rootRelation
211
211
  * is zero. However, nominalRelation will always be set, as it's the rel that
212
- * EXPLAIN should claim is the INSERT/UPDATE/DELETE target.
212
+ * EXPLAIN should claim is the INSERT/UPDATE/DELETE/MERGE target.
213
213
  *
214
214
  * Note that rowMarks and epqParam are presumed to be valid for all the
215
- * subplan(s); they can't contain any info that varies across subplans.
215
+ * table(s); they can't contain any info that varies across tables.
216
216
  * ----------------
217
217
  */
218
218
  typedef struct ModifyTable
219
219
  {
220
220
  Plan plan;
221
- CmdType operation; /* INSERT, UPDATE, or DELETE */
221
+ CmdType operation; /* INSERT, UPDATE, DELETE, or MERGE */
222
222
  bool canSetTag; /* do we set the command tag/es_processed? */
223
223
  Index nominalRelation; /* Parent RT index for use of EXPLAIN */
224
224
  Index rootRelation; /* Root RT index, if target is partitioned */
225
- bool partColsUpdated; /* some part key in hierarchy updated */
225
+ bool partColsUpdated; /* some part key in hierarchy updated? */
226
226
  List *resultRelations; /* integer list of RT indexes */
227
- int resultRelIndex; /* index of first resultRel in plan's list */
228
- int rootResultRelIndex; /* index of the partitioned table root */
229
- List *plans; /* plan(s) producing source data */
227
+ List *updateColnosLists; /* per-target-table update_colnos lists */
230
228
  List *withCheckOptionLists; /* per-target-table WCO lists */
231
229
  List *returningLists; /* per-target-table RETURNING tlists */
232
230
  List *fdwPrivLists; /* per-target-table FDW private data lists */
@@ -235,10 +233,13 @@ typedef struct ModifyTable
235
233
  int epqParam; /* ID of Param for EvalPlanQual re-eval */
236
234
  OnConflictAction onConflictAction; /* ON CONFLICT action */
237
235
  List *arbiterIndexes; /* List of ON CONFLICT arbiter index OIDs */
238
- List *onConflictSet; /* SET for INSERT ON CONFLICT DO UPDATE */
236
+ List *onConflictSet; /* INSERT ON CONFLICT DO UPDATE targetlist */
237
+ List *onConflictCols; /* target column numbers for onConflictSet */
239
238
  Node *onConflictWhere; /* WHERE for ON CONFLICT UPDATE */
240
239
  Index exclRelRTI; /* RTI of the EXCLUDED pseudo relation */
241
240
  List *exclRelTlist; /* tlist of the EXCLUDED pseudo relation */
241
+ List *mergeActionLists; /* per-target-table lists of actions for
242
+ * MERGE */
242
243
  } ModifyTable;
243
244
 
244
245
  struct PartitionPruneInfo; /* forward reference to struct below */
@@ -253,6 +254,7 @@ typedef struct Append
253
254
  Plan plan;
254
255
  Bitmapset *apprelids; /* RTIs of appendrel(s) formed by this node */
255
256
  List *appendplans;
257
+ int nasyncplans; /* # of asynchronous plans */
256
258
 
257
259
  /*
258
260
  * All 'appendplans' preceding this index are non-partial plans. All
@@ -349,7 +351,10 @@ typedef struct Scan
349
351
  * sequential scan node
350
352
  * ----------------
351
353
  */
352
- typedef Scan SeqScan;
354
+ typedef struct SeqScan
355
+ {
356
+ Scan scan;
357
+ } SeqScan;
353
358
 
354
359
  /* ----------------
355
360
  * table sample scan node
@@ -418,14 +423,28 @@ typedef struct IndexScan
418
423
  * index-only scan, in which the data comes from the index not the heap.
419
424
  * Because of this, *all* Vars in the plan node's targetlist, qual, and
420
425
  * index expressions reference index columns and have varno = INDEX_VAR.
421
- * Hence we do not need separate indexqualorig and indexorderbyorig lists,
422
- * since their contents would be equivalent to indexqual and indexorderby.
426
+ *
427
+ * We could almost use indexqual directly against the index's output tuple
428
+ * when rechecking lossy index operators, but that won't work for quals on
429
+ * index columns that are not retrievable. Hence, recheckqual is needed
430
+ * for rechecks: it expresses the same condition as indexqual, but using
431
+ * only index columns that are retrievable. (We will not generate an
432
+ * index-only scan if this is not possible. An example is that if an
433
+ * index has table column "x" in a retrievable index column "ind1", plus
434
+ * an expression f(x) in a non-retrievable column "ind2", an indexable
435
+ * query on f(x) will use "ind2" in indexqual and f(ind1) in recheckqual.
436
+ * Without the "ind1" column, an index-only scan would be disallowed.)
437
+ *
438
+ * We don't currently need a recheckable equivalent of indexorderby,
439
+ * because we don't support lossy operators in index ORDER BY.
423
440
  *
424
441
  * To help EXPLAIN interpret the index Vars for display, we provide
425
442
  * indextlist, which represents the contents of the index as a targetlist
426
443
  * with one TLE per index column. Vars appearing in this list reference
427
444
  * the base table, and this is the only field in the plan node that may
428
- * contain such Vars.
445
+ * contain such Vars. Also, for the convenience of setrefs.c, TLEs in
446
+ * indextlist are marked as resjunk if they correspond to columns that
447
+ * the index AM cannot reconstruct.
429
448
  * ----------------
430
449
  */
431
450
  typedef struct IndexOnlyScan
@@ -433,6 +452,7 @@ typedef struct IndexOnlyScan
433
452
  Scan scan;
434
453
  Oid indexid; /* OID of index to scan */
435
454
  List *indexqual; /* list of index quals (usually OpExprs) */
455
+ List *recheckqual; /* index quals in recheckable form */
436
456
  List *indexorderby; /* list of index ORDER BY exprs */
437
457
  List *indextlist; /* TargetEntry list describing index's cols */
438
458
  ScanDirection indexorderdir; /* forward or backward or don't care */
@@ -493,6 +513,19 @@ typedef struct TidScan
493
513
  List *tidquals; /* qual(s) involving CTID = something */
494
514
  } TidScan;
495
515
 
516
+ /* ----------------
517
+ * tid range scan node
518
+ *
519
+ * tidrangequals is an implicitly AND'ed list of qual expressions of the form
520
+ * "CTID relop pseudoconstant", where relop is one of >,>=,<,<=.
521
+ * ----------------
522
+ */
523
+ typedef struct TidRangeScan
524
+ {
525
+ Scan scan;
526
+ List *tidrangequals; /* qual(s) involving CTID op something */
527
+ } TidRangeScan;
528
+
496
529
  /* ----------------
497
530
  * subquery scan node
498
531
  *
@@ -503,16 +536,28 @@ typedef struct TidScan
503
536
  * relation, we make this a descendant of Scan anyway for code-sharing
504
537
  * purposes.
505
538
  *
539
+ * SubqueryScanStatus caches the trivial_subqueryscan property of the node.
540
+ * SUBQUERY_SCAN_UNKNOWN means not yet determined. This is only used during
541
+ * planning.
542
+ *
506
543
  * Note: we store the sub-plan in the type-specific subplan field, not in
507
544
  * the generic lefttree field as you might expect. This is because we do
508
545
  * not want plan-tree-traversal routines to recurse into the subplan without
509
546
  * knowing that they are changing Query contexts.
510
547
  * ----------------
511
548
  */
549
+ typedef enum SubqueryScanStatus
550
+ {
551
+ SUBQUERY_SCAN_UNKNOWN,
552
+ SUBQUERY_SCAN_TRIVIAL,
553
+ SUBQUERY_SCAN_NONTRIVIAL
554
+ } SubqueryScanStatus;
555
+
512
556
  typedef struct SubqueryScan
513
557
  {
514
558
  Scan scan;
515
559
  Plan *subplan;
560
+ SubqueryScanStatus scanstatus;
516
561
  } SubqueryScan;
517
562
 
518
563
  /* ----------------
@@ -607,12 +652,20 @@ typedef struct WorkTableScan
607
652
  * When the plan node represents a foreign join, scan.scanrelid is zero and
608
653
  * fs_relids must be consulted to identify the join relation. (fs_relids
609
654
  * is valid for simple scans as well, but will always match scan.scanrelid.)
655
+ *
656
+ * If the FDW's PlanDirectModify() callback decides to repurpose a ForeignScan
657
+ * node to perform the UPDATE or DELETE operation directly in the remote
658
+ * server, it sets 'operation' and 'resultRelation' to identify the operation
659
+ * type and target relation. Note that these fields are only set if the
660
+ * modification is performed *fully* remotely; otherwise, the modification is
661
+ * driven by a local ModifyTable node and 'operation' is left to CMD_SELECT.
610
662
  * ----------------
611
663
  */
612
664
  typedef struct ForeignScan
613
665
  {
614
666
  Scan scan;
615
667
  CmdType operation; /* SELECT/INSERT/UPDATE/DELETE */
668
+ Index resultRelation; /* direct modification target's RT index */
616
669
  Oid fs_server; /* OID of foreign server */
617
670
  List *fdw_exprs; /* expressions that FDW may evaluate */
618
671
  List *fdw_private; /* private data for FDW */
@@ -760,6 +813,31 @@ typedef struct Material
760
813
  Plan plan;
761
814
  } Material;
762
815
 
816
+ /* ----------------
817
+ * memoize node
818
+ * ----------------
819
+ */
820
+ typedef struct Memoize
821
+ {
822
+ Plan plan;
823
+
824
+ int numKeys; /* size of the two arrays below */
825
+
826
+ Oid *hashOperators; /* hash operators for each key */
827
+ Oid *collations; /* collations for each key */
828
+ List *param_exprs; /* cache keys in the form of exprs containing
829
+ * parameters */
830
+ bool singlerow; /* true if the cache entry should be marked as
831
+ * complete after we store the first tuple in
832
+ * it. */
833
+ bool binary_mode; /* true when cache key should be compared bit
834
+ * by bit, false when using hash equality ops */
835
+ uint32 est_entries; /* The maximum number of entries that the
836
+ * planner expects will fit in the cache, or 0
837
+ * if unknown */
838
+ Bitmapset *keyparamids; /* paramids from param_exprs */
839
+ } Memoize;
840
+
763
841
  /* ----------------
764
842
  * sort node
765
843
  * ----------------
@@ -849,12 +927,16 @@ typedef struct WindowAgg
849
927
  int frameOptions; /* frame_clause options, see WindowDef */
850
928
  Node *startOffset; /* expression for starting bound, if any */
851
929
  Node *endOffset; /* expression for ending bound, if any */
930
+ List *runCondition; /* qual to help short-circuit execution */
931
+ List *runConditionOrig; /* runCondition for display in EXPLAIN */
852
932
  /* these fields are used with RANGE offset PRECEDING/FOLLOWING: */
853
933
  Oid startInRangeFunc; /* in_range function for startOffset */
854
934
  Oid endInRangeFunc; /* in_range function for endOffset */
855
935
  Oid inRangeColl; /* collation for in_range tests */
856
936
  bool inRangeAsc; /* use ASC sort order for in_range tests? */
857
937
  bool inRangeNullsFirst; /* nulls sort first for in_range tests? */
938
+ bool topWindow; /* false for all apart from the WindowAgg
939
+ * that's closest to the root of the plan */
858
940
  } WindowAgg;
859
941
 
860
942
  /* ----------------
@@ -932,7 +1014,7 @@ typedef struct Hash
932
1014
  AttrNumber skewColumn; /* outer join key's column #, or zero */
933
1015
  bool skewInherit; /* is outer join rel an inheritance tree? */
934
1016
  /* all other info is in the parent HashJoin node */
935
- double rows_total; /* estimate total rows if parallel_aware */
1017
+ Cardinality rows_total; /* estimate total rows if parallel_aware */
936
1018
  } Hash;
937
1019
 
938
1020
  /* ----------------
@@ -1045,9 +1127,9 @@ typedef enum RowMarkType
1045
1127
  * When the planner discovers that a relation is the root of an inheritance
1046
1128
  * tree, it sets isParent true, and adds an additional PlanRowMark to the
1047
1129
  * list for each child relation (including the target rel itself in its role
1048
- * as a child). isParent is also set to true for the partitioned child
1049
- * relations, which are not scanned just like the root parent. The child
1050
- * entries have rti == child rel's RT index and prti == parent's RT index,
1130
+ * as a child, if it is not a partitioned table). Any non-leaf partitioned
1131
+ * child relations will also have entries with isParent = true. The child
1132
+ * entries have rti == child rel's RT index and prti == top parent's RT index,
1051
1133
  * and can therefore be recognized as children by the fact that prti != rti.
1052
1134
  * The parent's allMarkTypes field gets the OR of (1<<markType) across all
1053
1135
  * its children (this definition allows children to use different markTypes).
@@ -1068,8 +1150,7 @@ typedef enum RowMarkType
1068
1150
  * means we needn't renumber rowmarkIds when flattening subqueries, which
1069
1151
  * would require finding and renaming the resjunk columns as well.)
1070
1152
  * Note this means that all tables in an inheritance hierarchy share the
1071
- * same resjunk column names. However, in an inherited UPDATE/DELETE the
1072
- * columns could have different physical column numbers in each subplan.
1153
+ * same resjunk column names.
1073
1154
  */
1074
1155
  typedef struct PlanRowMark
1075
1156
  {
@@ -1175,7 +1256,7 @@ typedef struct PartitionPruneStep
1175
1256
  } PartitionPruneStep;
1176
1257
 
1177
1258
  /*
1178
- * PartitionPruneStepOp - Information to prune using a set of mutually AND'd
1259
+ * PartitionPruneStepOp - Information to prune using a set of mutually ANDed
1179
1260
  * OpExpr clauses
1180
1261
  *
1181
1262
  * This contains information extracted from up to partnatts OpExpr clauses,
@@ -1248,4 +1329,21 @@ typedef struct PlanInvalItem
1248
1329
  uint32 hashValue; /* hash value of object's cache lookup key */
1249
1330
  } PlanInvalItem;
1250
1331
 
1332
+ /*
1333
+ * MonotonicFunction
1334
+ *
1335
+ * Allows the planner to track monotonic properties of functions. A function
1336
+ * is monotonically increasing if a subsequent call cannot yield a lower value
1337
+ * than the previous call. A monotonically decreasing function cannot yield a
1338
+ * higher value on subsequent calls, and a function which is both must return
1339
+ * the same value on each call.
1340
+ */
1341
+ typedef enum MonotonicFunction
1342
+ {
1343
+ MONOTONICFUNC_NONE = 0,
1344
+ MONOTONICFUNC_INCREASING = (1 << 0),
1345
+ MONOTONICFUNC_DECREASING = (1 << 1),
1346
+ MONOTONICFUNC_BOTH = MONOTONICFUNC_INCREASING | MONOTONICFUNC_DECREASING
1347
+ } MonotonicFunction;
1348
+
1251
1349
  #endif /* PLANNODES_H */