pg_query 2.1.0 → 4.2.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (472) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +104 -0
  3. data/README.md +59 -31
  4. data/Rakefile +2 -2
  5. data/ext/pg_query/extconf.rb +8 -2
  6. data/ext/pg_query/include/access/amapi.h +45 -1
  7. data/ext/pg_query/include/access/attmap.h +1 -1
  8. data/ext/pg_query/include/access/attnum.h +2 -2
  9. data/ext/pg_query/include/access/clog.h +4 -2
  10. data/ext/pg_query/include/access/commit_ts.h +6 -9
  11. data/ext/pg_query/include/access/detoast.h +1 -11
  12. data/ext/pg_query/include/access/genam.h +15 -12
  13. data/ext/pg_query/include/access/gin.h +2 -2
  14. data/ext/pg_query/include/access/htup.h +1 -1
  15. data/ext/pg_query/include/access/htup_details.h +75 -87
  16. data/ext/pg_query/include/access/itup.h +7 -1
  17. data/ext/pg_query/include/access/parallel.h +2 -2
  18. data/ext/pg_query/include/access/printtup.h +1 -1
  19. data/ext/pg_query/include/access/relation.h +1 -1
  20. data/ext/pg_query/include/access/relscan.h +17 -2
  21. data/ext/pg_query/include/access/rmgr.h +30 -3
  22. data/ext/pg_query/include/access/rmgrlist.h +23 -23
  23. data/ext/pg_query/include/access/sdir.h +1 -1
  24. data/ext/pg_query/include/access/skey.h +1 -1
  25. data/ext/pg_query/include/access/stratnum.h +4 -2
  26. data/ext/pg_query/include/access/sysattr.h +1 -1
  27. data/ext/pg_query/include/access/table.h +2 -1
  28. data/ext/pg_query/include/access/tableam.h +272 -20
  29. data/ext/pg_query/include/access/toast_compression.h +73 -0
  30. data/ext/pg_query/include/access/transam.h +123 -13
  31. data/ext/pg_query/include/access/tupconvert.h +1 -1
  32. data/ext/pg_query/include/access/tupdesc.h +1 -1
  33. data/ext/pg_query/include/access/tupmacs.h +3 -3
  34. data/ext/pg_query/include/access/twophase.h +5 -1
  35. data/ext/pg_query/include/access/xact.h +79 -19
  36. data/ext/pg_query/include/access/xlog.h +60 -155
  37. data/ext/pg_query/include/access/xlog_internal.h +50 -14
  38. data/ext/pg_query/include/access/xlogdefs.h +8 -16
  39. data/ext/pg_query/include/access/xlogprefetcher.h +55 -0
  40. data/ext/pg_query/include/access/xlogreader.h +148 -32
  41. data/ext/pg_query/include/access/xlogrecord.h +18 -9
  42. data/ext/pg_query/include/access/xlogrecovery.h +157 -0
  43. data/ext/pg_query/include/c.h +101 -44
  44. data/ext/pg_query/include/catalog/catalog.h +3 -1
  45. data/ext/pg_query/include/catalog/catversion.h +2 -2
  46. data/ext/pg_query/include/catalog/dependency.h +10 -16
  47. data/ext/pg_query/include/catalog/genbki.h +83 -5
  48. data/ext/pg_query/include/catalog/index.h +18 -3
  49. data/ext/pg_query/include/catalog/indexing.h +12 -324
  50. data/ext/pg_query/include/catalog/namespace.h +4 -2
  51. data/ext/pg_query/include/catalog/objectaccess.h +70 -2
  52. data/ext/pg_query/include/catalog/objectaddress.h +11 -6
  53. data/ext/pg_query/include/catalog/pg_aggregate.h +14 -10
  54. data/ext/pg_query/include/catalog/pg_aggregate_d.h +2 -1
  55. data/ext/pg_query/include/catalog/pg_am.h +4 -1
  56. data/ext/pg_query/include/catalog/pg_am_d.h +3 -1
  57. data/ext/pg_query/include/catalog/pg_attribute.h +27 -10
  58. data/ext/pg_query/include/catalog/pg_attribute_d.h +21 -18
  59. data/ext/pg_query/include/catalog/pg_authid.h +7 -2
  60. data/ext/pg_query/include/catalog/pg_authid_d.h +17 -9
  61. data/ext/pg_query/include/catalog/pg_class.h +45 -15
  62. data/ext/pg_query/include/catalog/pg_class_d.h +31 -2
  63. data/ext/pg_query/include/catalog/pg_collation.h +33 -8
  64. data/ext/pg_query/include/catalog/pg_collation_d.h +20 -3
  65. data/ext/pg_query/include/catalog/pg_constraint.h +38 -12
  66. data/ext/pg_query/include/catalog/pg_constraint_d.h +10 -4
  67. data/ext/pg_query/include/catalog/pg_control.h +5 -5
  68. data/ext/pg_query/include/catalog/pg_conversion.h +7 -4
  69. data/ext/pg_query/include/catalog/pg_conversion_d.h +4 -1
  70. data/ext/pg_query/include/catalog/pg_depend.h +11 -7
  71. data/ext/pg_query/include/catalog/pg_depend_d.h +3 -1
  72. data/ext/pg_query/include/catalog/pg_event_trigger.h +9 -3
  73. data/ext/pg_query/include/catalog/pg_event_trigger_d.h +3 -1
  74. data/ext/pg_query/include/catalog/pg_index.h +17 -7
  75. data/ext/pg_query/include/catalog/pg_index_d.h +20 -17
  76. data/ext/pg_query/include/catalog/pg_language.h +10 -5
  77. data/ext/pg_query/include/catalog/pg_language_d.h +3 -1
  78. data/ext/pg_query/include/catalog/pg_namespace.h +7 -2
  79. data/ext/pg_query/include/catalog/pg_namespace_d.h +3 -1
  80. data/ext/pg_query/include/catalog/pg_opclass.h +8 -5
  81. data/ext/pg_query/include/catalog/pg_opclass_d.h +3 -1
  82. data/ext/pg_query/include/catalog/pg_operator.h +21 -16
  83. data/ext/pg_query/include/catalog/pg_operator_d.h +37 -1
  84. data/ext/pg_query/include/catalog/pg_opfamily.h +6 -3
  85. data/ext/pg_query/include/catalog/pg_opfamily_d.h +3 -1
  86. data/ext/pg_query/include/catalog/pg_parameter_acl.h +60 -0
  87. data/ext/pg_query/include/catalog/pg_parameter_acl_d.h +34 -0
  88. data/ext/pg_query/include/catalog/pg_partitioned_table.h +20 -9
  89. data/ext/pg_query/include/catalog/pg_partitioned_table_d.h +2 -1
  90. data/ext/pg_query/include/catalog/pg_proc.h +20 -11
  91. data/ext/pg_query/include/catalog/pg_proc_d.h +10 -8
  92. data/ext/pg_query/include/catalog/pg_publication.h +50 -4
  93. data/ext/pg_query/include/catalog/pg_publication_d.h +3 -1
  94. data/ext/pg_query/include/catalog/pg_replication_origin.h +6 -1
  95. data/ext/pg_query/include/catalog/pg_replication_origin_d.h +5 -1
  96. data/ext/pg_query/include/catalog/pg_statistic.h +19 -12
  97. data/ext/pg_query/include/catalog/pg_statistic_d.h +2 -1
  98. data/ext/pg_query/include/catalog/pg_statistic_ext.h +19 -5
  99. data/ext/pg_query/include/catalog/pg_statistic_ext_d.h +7 -2
  100. data/ext/pg_query/include/catalog/pg_transform.h +8 -5
  101. data/ext/pg_query/include/catalog/pg_transform_d.h +3 -1
  102. data/ext/pg_query/include/catalog/pg_trigger.h +24 -8
  103. data/ext/pg_query/include/catalog/pg_trigger_d.h +4 -1
  104. data/ext/pg_query/include/catalog/pg_ts_config.h +6 -3
  105. data/ext/pg_query/include/catalog/pg_ts_config_d.h +3 -1
  106. data/ext/pg_query/include/catalog/pg_ts_dict.h +8 -3
  107. data/ext/pg_query/include/catalog/pg_ts_dict_d.h +3 -1
  108. data/ext/pg_query/include/catalog/pg_ts_parser.h +6 -3
  109. data/ext/pg_query/include/catalog/pg_ts_parser_d.h +3 -1
  110. data/ext/pg_query/include/catalog/pg_ts_template.h +6 -3
  111. data/ext/pg_query/include/catalog/pg_ts_template_d.h +3 -1
  112. data/ext/pg_query/include/catalog/pg_type.h +56 -24
  113. data/ext/pg_query/include/catalog/pg_type_d.h +70 -31
  114. data/ext/pg_query/include/catalog/storage.h +5 -3
  115. data/ext/pg_query/include/commands/async.h +4 -5
  116. data/ext/pg_query/include/commands/dbcommands.h +2 -1
  117. data/ext/pg_query/include/commands/defrem.h +11 -24
  118. data/ext/pg_query/include/commands/event_trigger.h +2 -2
  119. data/ext/pg_query/include/commands/explain.h +1 -1
  120. data/ext/pg_query/include/commands/prepare.h +1 -1
  121. data/ext/pg_query/include/commands/tablespace.h +3 -1
  122. data/ext/pg_query/include/commands/trigger.h +27 -17
  123. data/ext/pg_query/include/commands/user.h +2 -2
  124. data/ext/pg_query/include/commands/vacuum.h +88 -41
  125. data/ext/pg_query/include/commands/variable.h +1 -1
  126. data/ext/pg_query/include/common/file_perm.h +4 -4
  127. data/ext/pg_query/include/common/hashfn.h +1 -1
  128. data/ext/pg_query/include/common/ip.h +1 -7
  129. data/ext/pg_query/include/common/keywords.h +2 -6
  130. data/ext/pg_query/include/common/kwlookup.h +1 -1
  131. data/ext/pg_query/include/common/pg_prng.h +60 -0
  132. data/ext/pg_query/include/common/relpath.h +2 -2
  133. data/ext/pg_query/include/common/string.h +24 -1
  134. data/ext/pg_query/include/common/unicode_combining_table.h +114 -2
  135. data/ext/pg_query/include/common/unicode_east_asian_fw_table.h +125 -0
  136. data/ext/pg_query/include/datatype/timestamp.h +40 -1
  137. data/ext/pg_query/include/executor/execdesc.h +1 -1
  138. data/ext/pg_query/include/executor/executor.h +65 -22
  139. data/ext/pg_query/include/executor/functions.h +17 -3
  140. data/ext/pg_query/include/executor/instrument.h +33 -16
  141. data/ext/pg_query/include/executor/spi.h +41 -3
  142. data/ext/pg_query/include/executor/tablefunc.h +1 -1
  143. data/ext/pg_query/include/executor/tuptable.h +1 -1
  144. data/ext/pg_query/include/fmgr.h +13 -7
  145. data/ext/pg_query/include/funcapi.h +16 -4
  146. data/ext/pg_query/include/getaddrinfo.h +1 -1
  147. data/ext/pg_query/include/jit/jit.h +11 -11
  148. data/ext/pg_query/include/kwlist_d.h +517 -494
  149. data/ext/pg_query/include/lib/dshash.h +112 -0
  150. data/ext/pg_query/include/lib/ilist.h +20 -1
  151. data/ext/pg_query/include/lib/pairingheap.h +1 -1
  152. data/ext/pg_query/include/lib/simplehash.h +150 -25
  153. data/ext/pg_query/include/lib/sort_template.h +432 -0
  154. data/ext/pg_query/include/lib/stringinfo.h +1 -1
  155. data/ext/pg_query/include/libpq/auth.h +6 -4
  156. data/ext/pg_query/include/libpq/crypt.h +5 -4
  157. data/ext/pg_query/include/libpq/hba.h +43 -4
  158. data/ext/pg_query/include/libpq/libpq-be.h +23 -6
  159. data/ext/pg_query/include/libpq/libpq.h +31 -20
  160. data/ext/pg_query/include/libpq/pqcomm.h +17 -31
  161. data/ext/pg_query/include/libpq/pqformat.h +1 -1
  162. data/ext/pg_query/include/libpq/pqsignal.h +4 -4
  163. data/ext/pg_query/include/mb/pg_wchar.h +106 -23
  164. data/ext/pg_query/include/mb/stringinfo_mb.h +1 -1
  165. data/ext/pg_query/include/miscadmin.h +71 -52
  166. data/ext/pg_query/include/nodes/bitmapset.h +1 -1
  167. data/ext/pg_query/include/nodes/execnodes.h +272 -80
  168. data/ext/pg_query/include/nodes/extensible.h +4 -2
  169. data/ext/pg_query/include/nodes/lockoptions.h +1 -1
  170. data/ext/pg_query/include/nodes/makefuncs.h +7 -6
  171. data/ext/pg_query/include/nodes/memnodes.h +5 -3
  172. data/ext/pg_query/include/nodes/nodeFuncs.h +1 -1
  173. data/ext/pg_query/include/nodes/nodes.h +30 -11
  174. data/ext/pg_query/include/nodes/params.h +1 -1
  175. data/ext/pg_query/include/nodes/parsenodes.h +327 -94
  176. data/ext/pg_query/include/nodes/pathnodes.h +245 -67
  177. data/ext/pg_query/include/nodes/pg_list.h +75 -68
  178. data/ext/pg_query/include/nodes/plannodes.h +128 -30
  179. data/ext/pg_query/include/nodes/primnodes.h +99 -47
  180. data/ext/pg_query/include/nodes/print.h +1 -1
  181. data/ext/pg_query/include/nodes/tidbitmap.h +1 -1
  182. data/ext/pg_query/include/nodes/value.h +58 -39
  183. data/ext/pg_query/include/optimizer/cost.h +9 -2
  184. data/ext/pg_query/include/optimizer/geqo.h +9 -7
  185. data/ext/pg_query/include/optimizer/geqo_gene.h +1 -1
  186. data/ext/pg_query/include/optimizer/optimizer.h +25 -22
  187. data/ext/pg_query/include/optimizer/paths.h +6 -6
  188. data/ext/pg_query/include/optimizer/planmain.h +15 -14
  189. data/ext/pg_query/include/parser/analyze.h +19 -5
  190. data/ext/pg_query/include/parser/gram.h +947 -913
  191. data/ext/pg_query/include/parser/gramparse.h +1 -1
  192. data/ext/pg_query/include/parser/kwlist.h +463 -453
  193. data/ext/pg_query/include/parser/parse_agg.h +2 -7
  194. data/ext/pg_query/include/parser/parse_coerce.h +4 -1
  195. data/ext/pg_query/include/parser/parse_expr.h +2 -3
  196. data/ext/pg_query/include/parser/parse_func.h +2 -1
  197. data/ext/pg_query/include/parser/parse_node.h +21 -9
  198. data/ext/pg_query/include/parser/parse_oper.h +1 -3
  199. data/ext/pg_query/include/parser/parse_relation.h +5 -4
  200. data/ext/pg_query/include/parser/parse_type.h +1 -1
  201. data/ext/pg_query/include/parser/parser.h +31 -4
  202. data/ext/pg_query/include/parser/parsetree.h +1 -1
  203. data/ext/pg_query/include/parser/scanner.h +1 -1
  204. data/ext/pg_query/include/parser/scansup.h +2 -5
  205. data/ext/pg_query/include/partitioning/partdefs.h +1 -1
  206. data/ext/pg_query/include/pg_config.h +94 -46
  207. data/ext/pg_query/include/pg_config_manual.h +74 -21
  208. data/ext/pg_query/include/pg_getopt.h +6 -6
  209. data/ext/pg_query/include/pg_query.h +5 -4
  210. data/ext/pg_query/include/pg_query_enum_defs.c +358 -241
  211. data/ext/pg_query/include/pg_query_fingerprint_conds.c +44 -7
  212. data/ext/pg_query/include/pg_query_fingerprint_defs.c +1220 -422
  213. data/ext/pg_query/include/pg_query_outfuncs_conds.c +43 -13
  214. data/ext/pg_query/include/pg_query_outfuncs_defs.c +152 -26
  215. data/ext/pg_query/include/pg_query_readfuncs_conds.c +11 -2
  216. data/ext/pg_query/include/pg_query_readfuncs_defs.c +174 -30
  217. data/ext/pg_query/include/pg_trace.h +1 -1
  218. data/ext/pg_query/include/pgstat.h +449 -1237
  219. data/ext/pg_query/include/pgtime.h +14 -4
  220. data/ext/pg_query/include/pl_gram.h +126 -128
  221. data/ext/pg_query/include/pl_reserved_kwlist.h +1 -1
  222. data/ext/pg_query/include/pl_reserved_kwlist_d.h +10 -10
  223. data/ext/pg_query/include/pl_unreserved_kwlist.h +2 -3
  224. data/ext/pg_query/include/pl_unreserved_kwlist_d.h +54 -56
  225. data/ext/pg_query/include/plerrcodes.h +9 -1
  226. data/ext/pg_query/include/plpgsql.h +52 -54
  227. data/ext/pg_query/include/port/atomics/arch-arm.h +7 -1
  228. data/ext/pg_query/include/port/atomics/arch-ppc.h +1 -1
  229. data/ext/pg_query/include/port/atomics/arch-x86.h +1 -1
  230. data/ext/pg_query/include/port/atomics/fallback.h +1 -1
  231. data/ext/pg_query/include/port/atomics/generic-gcc.h +3 -3
  232. data/ext/pg_query/include/port/atomics/generic.h +1 -1
  233. data/ext/pg_query/include/port/atomics.h +1 -1
  234. data/ext/pg_query/include/port/pg_bitutils.h +88 -12
  235. data/ext/pg_query/include/port/pg_bswap.h +1 -1
  236. data/ext/pg_query/include/port/pg_crc32c.h +1 -1
  237. data/ext/pg_query/include/port.h +72 -43
  238. data/ext/pg_query/include/portability/instr_time.h +1 -1
  239. data/ext/pg_query/include/postgres.h +60 -16
  240. data/ext/pg_query/include/postmaster/autovacuum.h +17 -17
  241. data/ext/pg_query/include/postmaster/auxprocess.h +20 -0
  242. data/ext/pg_query/include/postmaster/bgworker.h +2 -1
  243. data/ext/pg_query/include/postmaster/bgworker_internals.h +2 -2
  244. data/ext/pg_query/include/postmaster/bgwriter.h +5 -5
  245. data/ext/pg_query/include/postmaster/fork_process.h +1 -1
  246. data/ext/pg_query/include/postmaster/interrupt.h +1 -1
  247. data/ext/pg_query/include/postmaster/pgarch.h +42 -8
  248. data/ext/pg_query/include/postmaster/postmaster.h +18 -17
  249. data/ext/pg_query/include/postmaster/startup.h +39 -0
  250. data/ext/pg_query/include/postmaster/syslogger.h +15 -10
  251. data/ext/pg_query/include/postmaster/walwriter.h +3 -3
  252. data/ext/pg_query/include/protobuf/pg_query.pb-c.h +1422 -916
  253. data/ext/pg_query/include/protobuf/pg_query.pb.h +43678 -32769
  254. data/ext/pg_query/include/regex/regex.h +18 -16
  255. data/ext/pg_query/include/replication/logicallauncher.h +3 -5
  256. data/ext/pg_query/include/replication/logicalproto.h +161 -17
  257. data/ext/pg_query/include/replication/logicalworker.h +1 -1
  258. data/ext/pg_query/include/replication/origin.h +7 -7
  259. data/ext/pg_query/include/replication/reorderbuffer.h +262 -44
  260. data/ext/pg_query/include/replication/slot.h +23 -12
  261. data/ext/pg_query/include/replication/syncrep.h +5 -5
  262. data/ext/pg_query/include/replication/walreceiver.h +145 -13
  263. data/ext/pg_query/include/replication/walsender.h +8 -8
  264. data/ext/pg_query/include/rewrite/prs2lock.h +1 -1
  265. data/ext/pg_query/include/rewrite/rewriteHandler.h +1 -3
  266. data/ext/pg_query/include/rewrite/rewriteManip.h +1 -1
  267. data/ext/pg_query/include/rewrite/rewriteSupport.h +1 -1
  268. data/ext/pg_query/include/storage/backendid.h +3 -3
  269. data/ext/pg_query/include/storage/block.h +4 -10
  270. data/ext/pg_query/include/storage/buf.h +1 -1
  271. data/ext/pg_query/include/storage/bufmgr.h +19 -14
  272. data/ext/pg_query/include/storage/bufpage.h +6 -8
  273. data/ext/pg_query/include/storage/condition_variable.h +13 -2
  274. data/ext/pg_query/include/storage/dsm.h +4 -1
  275. data/ext/pg_query/include/storage/dsm_impl.h +3 -2
  276. data/ext/pg_query/include/storage/fd.h +33 -3
  277. data/ext/pg_query/include/storage/fileset.h +40 -0
  278. data/ext/pg_query/include/storage/ipc.h +4 -1
  279. data/ext/pg_query/include/storage/item.h +1 -1
  280. data/ext/pg_query/include/storage/itemid.h +1 -1
  281. data/ext/pg_query/include/storage/itemptr.h +3 -1
  282. data/ext/pg_query/include/storage/large_object.h +2 -2
  283. data/ext/pg_query/include/storage/latch.h +9 -13
  284. data/ext/pg_query/include/storage/lmgr.h +2 -1
  285. data/ext/pg_query/include/storage/lock.h +17 -13
  286. data/ext/pg_query/include/storage/lockdefs.h +2 -2
  287. data/ext/pg_query/include/storage/lwlock.h +6 -32
  288. data/ext/pg_query/include/storage/lwlocknames.h +0 -1
  289. data/ext/pg_query/include/storage/off.h +1 -1
  290. data/ext/pg_query/include/storage/pg_sema.h +1 -1
  291. data/ext/pg_query/include/storage/pg_shmem.h +9 -7
  292. data/ext/pg_query/include/storage/pmsignal.h +15 -4
  293. data/ext/pg_query/include/storage/predicate.h +4 -4
  294. data/ext/pg_query/include/storage/proc.h +183 -55
  295. data/ext/pg_query/include/storage/procarray.h +98 -0
  296. data/ext/pg_query/include/storage/proclist_types.h +1 -1
  297. data/ext/pg_query/include/storage/procsignal.h +3 -7
  298. data/ext/pg_query/include/storage/relfilenode.h +1 -1
  299. data/ext/pg_query/include/storage/s_lock.h +67 -4
  300. data/ext/pg_query/include/storage/sharedfileset.h +3 -11
  301. data/ext/pg_query/include/storage/shm_mq.h +5 -4
  302. data/ext/pg_query/include/storage/shm_toc.h +1 -1
  303. data/ext/pg_query/include/storage/shmem.h +1 -1
  304. data/ext/pg_query/include/storage/sinval.h +3 -3
  305. data/ext/pg_query/include/storage/sinvaladt.h +1 -1
  306. data/ext/pg_query/include/storage/smgr.h +10 -8
  307. data/ext/pg_query/include/storage/spin.h +2 -2
  308. data/ext/pg_query/include/storage/standby.h +13 -6
  309. data/ext/pg_query/include/storage/standbydefs.h +2 -2
  310. data/ext/pg_query/include/storage/sync.h +7 -3
  311. data/ext/pg_query/include/tcop/cmdtag.h +1 -1
  312. data/ext/pg_query/include/tcop/cmdtaglist.h +3 -2
  313. data/ext/pg_query/include/tcop/deparse_utility.h +1 -1
  314. data/ext/pg_query/include/tcop/dest.h +1 -1
  315. data/ext/pg_query/include/tcop/fastpath.h +1 -2
  316. data/ext/pg_query/include/tcop/pquery.h +7 -1
  317. data/ext/pg_query/include/tcop/tcopprot.h +19 -11
  318. data/ext/pg_query/include/tcop/utility.h +7 -3
  319. data/ext/pg_query/include/tsearch/ts_cache.h +2 -2
  320. data/ext/pg_query/include/utils/acl.h +24 -3
  321. data/ext/pg_query/include/utils/aclchk_internal.h +1 -1
  322. data/ext/pg_query/include/utils/array.h +7 -2
  323. data/ext/pg_query/include/utils/backend_progress.h +44 -0
  324. data/ext/pg_query/include/utils/backend_status.h +321 -0
  325. data/ext/pg_query/include/utils/builtins.h +11 -11
  326. data/ext/pg_query/include/utils/bytea.h +3 -2
  327. data/ext/pg_query/include/utils/catcache.h +1 -1
  328. data/ext/pg_query/include/utils/date.h +1 -1
  329. data/ext/pg_query/include/utils/datetime.h +8 -7
  330. data/ext/pg_query/include/utils/datum.h +9 -1
  331. data/ext/pg_query/include/utils/dsa.h +1 -1
  332. data/ext/pg_query/include/utils/dynahash.h +4 -3
  333. data/ext/pg_query/include/utils/elog.h +52 -21
  334. data/ext/pg_query/include/utils/errcodes.h +2 -0
  335. data/ext/pg_query/include/utils/expandeddatum.h +1 -1
  336. data/ext/pg_query/include/utils/expandedrecord.h +1 -1
  337. data/ext/pg_query/include/utils/float.h +7 -7
  338. data/ext/pg_query/include/utils/fmgroids.h +1300 -696
  339. data/ext/pg_query/include/utils/fmgrprotos.h +199 -16
  340. data/ext/pg_query/include/utils/fmgrtab.h +6 -5
  341. data/ext/pg_query/include/utils/guc.h +69 -43
  342. data/ext/pg_query/include/utils/guc_tables.h +23 -19
  343. data/ext/pg_query/include/utils/hsearch.h +15 -11
  344. data/ext/pg_query/include/utils/inval.h +5 -1
  345. data/ext/pg_query/include/utils/lsyscache.h +11 -1
  346. data/ext/pg_query/include/utils/memdebug.h +1 -1
  347. data/ext/pg_query/include/utils/memutils.h +8 -3
  348. data/ext/pg_query/include/utils/numeric.h +19 -5
  349. data/ext/pg_query/include/utils/palloc.h +25 -3
  350. data/ext/pg_query/include/utils/partcache.h +1 -1
  351. data/ext/pg_query/include/utils/pg_locale.h +17 -9
  352. data/ext/pg_query/include/utils/pg_lsn.h +1 -1
  353. data/ext/pg_query/include/utils/pgstat_internal.h +784 -0
  354. data/ext/pg_query/include/utils/pidfile.h +1 -1
  355. data/ext/pg_query/include/utils/plancache.h +6 -5
  356. data/ext/pg_query/include/utils/portal.h +12 -1
  357. data/ext/pg_query/include/utils/ps_status.h +1 -1
  358. data/ext/pg_query/include/utils/queryenvironment.h +1 -1
  359. data/ext/pg_query/include/utils/queryjumble.h +88 -0
  360. data/ext/pg_query/include/utils/regproc.h +14 -3
  361. data/ext/pg_query/include/utils/rel.h +71 -20
  362. data/ext/pg_query/include/utils/relcache.h +9 -7
  363. data/ext/pg_query/include/utils/reltrigger.h +1 -1
  364. data/ext/pg_query/include/utils/resowner.h +1 -1
  365. data/ext/pg_query/include/utils/rls.h +2 -2
  366. data/ext/pg_query/include/utils/ruleutils.h +4 -1
  367. data/ext/pg_query/include/utils/sharedtuplestore.h +1 -1
  368. data/ext/pg_query/include/utils/snapmgr.h +35 -14
  369. data/ext/pg_query/include/utils/snapshot.h +14 -1
  370. data/ext/pg_query/include/utils/sortsupport.h +117 -2
  371. data/ext/pg_query/include/utils/syscache.h +6 -1
  372. data/ext/pg_query/include/utils/timeout.h +11 -4
  373. data/ext/pg_query/include/utils/timestamp.h +6 -5
  374. data/ext/pg_query/include/utils/tuplesort.h +25 -11
  375. data/ext/pg_query/include/utils/tuplestore.h +2 -2
  376. data/ext/pg_query/include/utils/typcache.h +24 -17
  377. data/ext/pg_query/include/utils/tzparser.h +1 -1
  378. data/ext/pg_query/include/utils/varlena.h +5 -3
  379. data/ext/pg_query/include/utils/wait_event.h +289 -0
  380. data/ext/pg_query/include/utils/xml.h +4 -4
  381. data/ext/pg_query/pg_query.pb-c.c +4318 -2307
  382. data/ext/pg_query/pg_query_deparse.c +1114 -381
  383. data/ext/pg_query/pg_query_fingerprint.c +46 -10
  384. data/ext/pg_query/pg_query_fingerprint.h +3 -1
  385. data/ext/pg_query/pg_query_json_plpgsql.c +55 -12
  386. data/ext/pg_query/pg_query_normalize.c +163 -20
  387. data/ext/pg_query/pg_query_outfuncs.h +1 -0
  388. data/ext/pg_query/pg_query_outfuncs_json.c +65 -16
  389. data/ext/pg_query/pg_query_outfuncs_protobuf.c +70 -10
  390. data/ext/pg_query/pg_query_parse.c +1 -1
  391. data/ext/pg_query/pg_query_parse_plpgsql.c +79 -16
  392. data/ext/pg_query/pg_query_readfuncs_protobuf.c +42 -8
  393. data/ext/pg_query/pg_query_ruby.c +1 -1
  394. data/ext/pg_query/pg_query_scan.c +2 -1
  395. data/ext/pg_query/pg_query_split.c +3 -2
  396. data/ext/pg_query/src_backend_catalog_namespace.c +21 -9
  397. data/ext/pg_query/src_backend_catalog_pg_proc.c +4 -1
  398. data/ext/pg_query/src_backend_commands_define.c +11 -1
  399. data/ext/pg_query/src_backend_nodes_bitmapset.c +3 -1
  400. data/ext/pg_query/src_backend_nodes_copyfuncs.c +424 -109
  401. data/ext/pg_query/src_backend_nodes_equalfuncs.c +291 -46
  402. data/ext/pg_query/src_backend_nodes_extensible.c +1 -1
  403. data/ext/pg_query/src_backend_nodes_list.c +86 -11
  404. data/ext/pg_query/src_backend_nodes_makefuncs.c +5 -4
  405. data/ext/pg_query/src_backend_nodes_nodeFuncs.c +55 -12
  406. data/ext/pg_query/src_backend_nodes_value.c +28 -19
  407. data/ext/pg_query/src_backend_parser_gram.c +33890 -31262
  408. data/ext/pg_query/src_backend_parser_parser.c +26 -7
  409. data/ext/pg_query/src_backend_parser_scan.c +644 -441
  410. data/ext/pg_query/src_backend_parser_scansup.c +4 -28
  411. data/ext/pg_query/src_backend_postmaster_postmaster.c +77 -106
  412. data/ext/pg_query/src_backend_storage_ipc_ipc.c +13 -4
  413. data/ext/pg_query/src_backend_storage_lmgr_s_lock.c +5 -4
  414. data/ext/pg_query/src_backend_tcop_postgres.c +73 -24
  415. data/ext/pg_query/src_backend_utils_activity_pgstat_database.c +140 -0
  416. data/ext/pg_query/src_backend_utils_adt_datum.c +13 -1
  417. data/ext/pg_query/src_backend_utils_adt_expandeddatum.c +1 -1
  418. data/ext/pg_query/src_backend_utils_adt_format_type.c +6 -2
  419. data/ext/pg_query/src_backend_utils_adt_ruleutils.c +109 -15
  420. data/ext/pg_query/src_backend_utils_error_assert.c +16 -14
  421. data/ext/pg_query/src_backend_utils_error_elog.c +172 -99
  422. data/ext/pg_query/src_backend_utils_fmgr_fmgr.c +12 -17
  423. data/ext/pg_query/src_backend_utils_hash_dynahash.c +40 -10
  424. data/ext/pg_query/src_backend_utils_init_globals.c +5 -5
  425. data/ext/pg_query/src_backend_utils_mb_mbutils.c +55 -66
  426. data/ext/pg_query/src_backend_utils_misc_guc.c +207 -45
  427. data/ext/pg_query/src_backend_utils_mmgr_aset.c +7 -5
  428. data/ext/pg_query/src_backend_utils_mmgr_mcxt.c +123 -35
  429. data/ext/pg_query/src_common_encnames.c +1 -1
  430. data/ext/pg_query/src_common_hashfn.c +3 -3
  431. data/ext/pg_query/src_common_keywords.c +15 -2
  432. data/ext/pg_query/src_common_kwlist_d.h +517 -494
  433. data/ext/pg_query/src_common_kwlookup.c +1 -1
  434. data/ext/pg_query/src_common_pg_prng.c +152 -0
  435. data/ext/pg_query/src_common_psprintf.c +1 -1
  436. data/ext/pg_query/src_common_string.c +7 -1
  437. data/ext/pg_query/src_common_stringinfo.c +1 -1
  438. data/ext/pg_query/src_common_wchar.c +712 -109
  439. data/ext/pg_query/src_pl_plpgsql_src_pl_comp.c +49 -22
  440. data/ext/pg_query/src_pl_plpgsql_src_pl_funcs.c +1 -18
  441. data/ext/pg_query/src_pl_plpgsql_src_pl_gram.c +1235 -1261
  442. data/ext/pg_query/src_pl_plpgsql_src_pl_handler.c +1 -1
  443. data/ext/pg_query/src_pl_plpgsql_src_pl_reserved_kwlist_d.h +10 -10
  444. data/ext/pg_query/src_pl_plpgsql_src_pl_scanner.c +2 -2
  445. data/ext/pg_query/src_pl_plpgsql_src_pl_unreserved_kwlist_d.h +54 -56
  446. data/ext/pg_query/src_port_pg_bitutils.c +41 -52
  447. data/ext/pg_query/src_port_pgsleep.c +1 -1
  448. data/ext/pg_query/src_port_pgstrcasecmp.c +1 -1
  449. data/ext/pg_query/src_port_qsort.c +12 -224
  450. data/ext/pg_query/src_port_snprintf.c +46 -20
  451. data/ext/pg_query/src_port_strerror.c +9 -19
  452. data/ext/pg_query/src_port_strnlen.c +1 -1
  453. data/lib/pg_query/deparse.rb +7 -1
  454. data/lib/pg_query/filter_columns.rb +6 -4
  455. data/lib/pg_query/fingerprint.rb +18 -3
  456. data/lib/pg_query/node.rb +2 -2
  457. data/lib/pg_query/param_refs.rb +1 -1
  458. data/lib/pg_query/parse.rb +87 -51
  459. data/lib/pg_query/pg_query_pb.rb +1109 -942
  460. data/lib/pg_query/treewalker.rb +6 -0
  461. data/lib/pg_query/truncate.rb +54 -8
  462. data/lib/pg_query/version.rb +1 -1
  463. metadata +29 -18
  464. data/ext/pg_query/include/access/xloginsert.h +0 -64
  465. data/ext/pg_query/include/bootstrap/bootstrap.h +0 -62
  466. data/ext/pg_query/include/parser/parse_clause.h +0 -54
  467. data/ext/pg_query/include/parser/parse_collate.h +0 -27
  468. data/ext/pg_query/include/parser/parse_target.h +0 -46
  469. data/ext/pg_query/src_backend_libpq_pqcomm.c +0 -651
  470. data/ext/pg_query/src_backend_parser_parse_expr.c +0 -313
  471. data/ext/pg_query/src_port_erand48.c +0 -127
  472. data/ext/pg_query/src_port_random.c +0 -31
@@ -4,7 +4,7 @@
4
4
  * Definitions for planner's internal data structures, especially Paths.
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/pathnodes.h
@@ -55,10 +55,6 @@ typedef struct QualCost
55
55
  */
56
56
  typedef struct AggClauseCosts
57
57
  {
58
- int numAggs; /* total number of aggregate functions */
59
- int numOrderedAggs; /* number w/ DISTINCT/ORDER BY/WITHIN GROUP */
60
- bool hasNonPartial; /* does any agg not support partial mode? */
61
- bool hasNonSerial; /* is any partial agg non-serializable? */
62
58
  QualCost transCost; /* total per-input-row execution costs */
63
59
  QualCost finalCost; /* total per-aggregated-row costs */
64
60
  Size transitionSpace; /* space for pass-by-ref transition data */
@@ -75,24 +71,13 @@ typedef enum UpperRelationKind
75
71
  * any */
76
72
  UPPERREL_GROUP_AGG, /* result of grouping/aggregation, if any */
77
73
  UPPERREL_WINDOW, /* result of window functions, if any */
74
+ UPPERREL_PARTIAL_DISTINCT, /* result of partial "SELECT DISTINCT", if any */
78
75
  UPPERREL_DISTINCT, /* result of "SELECT DISTINCT", if any */
79
76
  UPPERREL_ORDERED, /* result of ORDER BY, if any */
80
77
  UPPERREL_FINAL /* result of any remaining top-level actions */
81
78
  /* NB: UPPERREL_FINAL must be last enum entry; it's used to size arrays */
82
79
  } UpperRelationKind;
83
80
 
84
- /*
85
- * This enum identifies which type of relation is being planned through the
86
- * inheritance planner. INHKIND_NONE indicates the inheritance planner
87
- * was not used.
88
- */
89
- typedef enum InheritanceKind
90
- {
91
- INHKIND_NONE,
92
- INHKIND_INHERITED,
93
- INHKIND_PARTITIONED
94
- } InheritanceKind;
95
-
96
81
  /*----------
97
82
  * PlannerGlobal
98
83
  * Global information for planning/optimization
@@ -120,8 +105,6 @@ typedef struct PlannerGlobal
120
105
 
121
106
  List *resultRelations; /* "flat" list of integer RT indexes */
122
107
 
123
- List *rootResultRelations; /* "flat" list of integer RT indexes */
124
-
125
108
  List *appendRelations; /* "flat" list of AppendRelInfos */
126
109
 
127
110
  List *relationOids; /* OIDs of relations the plan depends on */
@@ -258,7 +241,8 @@ struct PlannerInfo
258
241
 
259
242
  List *init_plans; /* init SubPlans for query */
260
243
 
261
- List *cte_plan_ids; /* per-CTE-item list of subplan IDs */
244
+ List *cte_plan_ids; /* per-CTE-item list of subplan IDs (or -1 if
245
+ * no subplan was made for that CTE) */
262
246
 
263
247
  List *multiexpr_params; /* List of Lists of Params for MULTIEXPR
264
248
  * subquery outputs */
@@ -282,6 +266,17 @@ struct PlannerInfo
282
266
 
283
267
  List *join_info_list; /* list of SpecialJoinInfos */
284
268
 
269
+ /*
270
+ * all_result_relids is empty for SELECT, otherwise it contains at least
271
+ * parse->resultRelation. For UPDATE/DELETE/MERGE across an inheritance
272
+ * or partitioning tree, the result rel's child relids are added. When
273
+ * using multi-level partitioning, intermediate partitioned rels are
274
+ * included. leaf_result_relids is similar except that only actual result
275
+ * tables, not partitioned tables, are included in it.
276
+ */
277
+ Relids all_result_relids; /* set of all result relids */
278
+ Relids leaf_result_relids; /* set of all leaf relids */
279
+
285
280
  /*
286
281
  * Note: for AppendRelInfos describing partitions of a partitioned table,
287
282
  * we guarantee that partitions that come earlier in the partitioned
@@ -289,6 +284,8 @@ struct PlannerInfo
289
284
  */
290
285
  List *append_rel_list; /* list of AppendRelInfos */
291
286
 
287
+ List *row_identity_vars; /* list of RowIdentityVarInfos */
288
+
292
289
  List *rowMarks; /* list of PlanRowMarks */
293
290
 
294
291
  List *placeholder_list; /* list of PlaceHolderInfos */
@@ -315,40 +312,55 @@ struct PlannerInfo
315
312
 
316
313
  /*
317
314
  * The fully-processed targetlist is kept here. It differs from
318
- * parse->targetList in that (for INSERT and UPDATE) it's been reordered
319
- * to match the target table, and defaults have been filled in. Also,
320
- * additional resjunk targets may be present. preprocess_targetlist()
321
- * does most of this work, but note that more resjunk targets can get
322
- * added during appendrel expansion. (Hence, upper_targets mustn't get
323
- * set up till after that.)
315
+ * parse->targetList in that (for INSERT) it's been reordered to match the
316
+ * target table, and defaults have been filled in. Also, additional
317
+ * resjunk targets may be present. preprocess_targetlist() does most of
318
+ * that work, but note that more resjunk targets can get added during
319
+ * appendrel expansion. (Hence, upper_targets mustn't get set up till
320
+ * after that.)
324
321
  */
325
322
  List *processed_tlist;
326
323
 
324
+ /*
325
+ * For UPDATE, this list contains the target table's attribute numbers to
326
+ * which the first N entries of processed_tlist are to be assigned. (Any
327
+ * additional entries in processed_tlist must be resjunk.) DO NOT use the
328
+ * resnos in processed_tlist to identify the UPDATE target columns.
329
+ */
330
+ List *update_colnos;
331
+
327
332
  /* Fields filled during create_plan() for use in setrefs.c */
328
333
  AttrNumber *grouping_map; /* for GroupingFunc fixup */
329
334
  List *minmax_aggs; /* List of MinMaxAggInfos */
330
335
 
331
336
  MemoryContext planner_cxt; /* context holding PlannerInfo */
332
337
 
333
- double total_table_pages; /* # of pages in all non-dummy tables of
338
+ Cardinality total_table_pages; /* # of pages in all non-dummy tables of
334
339
  * query */
335
340
 
336
- double tuple_fraction; /* tuple_fraction passed to query_planner */
337
- double limit_tuples; /* limit_tuples passed to query_planner */
341
+ Selectivity tuple_fraction; /* tuple_fraction passed to query_planner */
342
+ Cardinality limit_tuples; /* limit_tuples passed to query_planner */
338
343
 
339
344
  Index qual_security_level; /* minimum security_level for quals */
340
345
  /* Note: qual_security_level is zero if there are no securityQuals */
341
346
 
342
- InheritanceKind inhTargetKind; /* indicates if the target relation is an
343
- * inheritance child or partition or a
344
- * partitioned table */
345
347
  bool hasJoinRTEs; /* true if any RTEs are RTE_JOIN kind */
346
348
  bool hasLateralRTEs; /* true if any RTEs are marked LATERAL */
347
349
  bool hasHavingQual; /* true if havingQual was non-null */
348
350
  bool hasPseudoConstantQuals; /* true if any RestrictInfo has
349
351
  * pseudoconstant = true */
352
+ bool hasAlternativeSubPlans; /* true if we've made any of those */
350
353
  bool hasRecursion; /* true if planning a recursive WITH item */
351
354
 
355
+ /*
356
+ * Information about aggregates. Filled by preprocess_aggrefs().
357
+ */
358
+ List *agginfos; /* AggInfo structs */
359
+ List *aggtransinfos; /* AggTransInfo structs */
360
+ int numOrderedAggs; /* number w/ DISTINCT/ORDER BY/WITHIN GROUP */
361
+ bool hasNonPartialAggs; /* does any agg not support partial mode? */
362
+ bool hasNonSerialAggs; /* is any partial agg non-serializable? */
363
+
352
364
  /* These fields are used only when hasRecursion is true: */
353
365
  int wt_param_id; /* PARAM_EXEC ID for the work table */
354
366
  struct Path *non_recursive_path; /* a path for non-recursive term */
@@ -357,6 +369,10 @@ struct PlannerInfo
357
369
  Relids curOuterRels; /* outer rels above current node */
358
370
  List *curOuterParams; /* not-yet-assigned NestLoopParams */
359
371
 
372
+ /* These fields are workspace for setrefs.c */
373
+ bool *isAltSubplan; /* array corresponding to glob->subplans */
374
+ bool *isUsedSubplan; /* array corresponding to glob->subplans */
375
+
360
376
  /* optional private data for join_search_hook, e.g., GEQO */
361
377
  void *join_search_private;
362
378
 
@@ -602,9 +618,6 @@ typedef struct PartitionSchemeData *PartitionScheme;
602
618
  * part_rels - RelOptInfos for each partition
603
619
  * all_partrels - Relids set of all partition relids
604
620
  * partexprs, nullable_partexprs - Partition key expressions
605
- * partitioned_child_rels - RT indexes of unpruned partitions of
606
- * this relation that are partitioned tables
607
- * themselves, in hierarchical order
608
621
  *
609
622
  * The partexprs and nullable_partexprs arrays each contain
610
623
  * part_scheme->partnatts elements. Each of the elements is a list of
@@ -620,6 +633,10 @@ typedef struct PartitionSchemeData *PartitionScheme;
620
633
  * to simplify matching join clauses to those lists.
621
634
  *----------
622
635
  */
636
+
637
+ /* Bitmask of flags supported by table AMs */
638
+ #define AMFLAG_HAS_TID_RANGE (1 << 0)
639
+
623
640
  typedef enum RelOptKind
624
641
  {
625
642
  RELOPT_BASEREL,
@@ -665,7 +682,7 @@ typedef struct RelOptInfo
665
682
  Relids relids; /* set of base relids (rangetable indexes) */
666
683
 
667
684
  /* size estimates generated by planner */
668
- double rows; /* estimated number of result tuples */
685
+ Cardinality rows; /* estimated number of result tuples */
669
686
 
670
687
  /* per-relation planner control flags */
671
688
  bool consider_startup; /* keep cheap-startup-cost paths? */
@@ -702,13 +719,15 @@ typedef struct RelOptInfo
702
719
  List *indexlist; /* list of IndexOptInfo */
703
720
  List *statlist; /* list of StatisticExtInfo */
704
721
  BlockNumber pages; /* size estimates derived from pg_class */
705
- double tuples;
722
+ Cardinality tuples;
706
723
  double allvisfrac;
707
724
  Bitmapset *eclass_indexes; /* Indexes in PlannerInfo's eq_classes list of
708
725
  * ECs that mention this rel */
709
726
  PlannerInfo *subroot; /* if subquery */
710
727
  List *subplan_params; /* if subquery */
711
728
  int rel_parallel_workers; /* wanted number of parallel workers */
729
+ uint32 amflags; /* Bitmask of optional features supported by
730
+ * the table AM */
712
731
 
713
732
  /* Information about foreign tables and foreign joins */
714
733
  Oid serverid; /* identifies server for the table or join */
@@ -749,10 +768,12 @@ typedef struct RelOptInfo
749
768
  List *partition_qual; /* Partition constraint, if not the root */
750
769
  struct RelOptInfo **part_rels; /* Array of RelOptInfos of partitions,
751
770
  * stored in the same order as bounds */
771
+ Bitmapset *live_parts; /* Bitmap with members acting as indexes into
772
+ * the part_rels[] array to indicate which
773
+ * partitions survived partition pruning. */
752
774
  Relids all_partrels; /* Relids set of all partition relids */
753
775
  List **partexprs; /* Non-nullable partition key expressions */
754
776
  List **nullable_partexprs; /* Nullable partition key expressions */
755
- List *partitioned_child_rels; /* List of RT indexes */
756
777
  } RelOptInfo;
757
778
 
758
779
  /*
@@ -821,7 +842,7 @@ struct IndexOptInfo
821
842
 
822
843
  /* index-size statistics (from pg_class and elsewhere) */
823
844
  BlockNumber pages; /* number of disk pages in index */
824
- double tuples; /* number of index tuples in index */
845
+ Cardinality tuples; /* number of index tuples in index */
825
846
  int tree_height; /* index tree height, or -1 if unknown */
826
847
 
827
848
  /* index descriptor information */
@@ -891,10 +912,13 @@ typedef struct ForeignKeyOptInfo
891
912
 
892
913
  /* Derived info about whether FK's equality conditions match the query: */
893
914
  int nmatched_ec; /* # of FK cols matched by ECs */
915
+ int nconst_ec; /* # of these ECs that are ec_has_const */
894
916
  int nmatched_rcols; /* # of FK cols matched by non-EC rinfos */
895
917
  int nmatched_ri; /* total # of non-EC rinfos matched to FK */
896
918
  /* Pointer to eclass matching each column's condition, if there is one */
897
919
  struct EquivalenceClass *eclass[INDEX_MAX_KEYS];
920
+ /* Pointer to eclass member for the referencing Var, if there is one */
921
+ struct EquivalenceMember *fk_eclass_member[INDEX_MAX_KEYS];
898
922
  /* List of non-EC RestrictInfos matching each column's condition */
899
923
  List *rinfos[INDEX_MAX_KEYS];
900
924
  } ForeignKeyOptInfo;
@@ -911,9 +935,11 @@ typedef struct StatisticExtInfo
911
935
  NodeTag type;
912
936
 
913
937
  Oid statOid; /* OID of the statistics row */
938
+ bool inherit; /* includes child relations */
914
939
  RelOptInfo *rel; /* back-link to statistic's table */
915
940
  char kind; /* statistics kind of this entry */
916
941
  Bitmapset *keys; /* attnums of the columns covered */
942
+ List *exprs; /* expressions */
917
943
  } StatisticExtInfo;
918
944
 
919
945
  /*
@@ -1045,6 +1071,17 @@ typedef struct PathKey
1045
1071
  bool pk_nulls_first; /* do NULLs come before normal values? */
1046
1072
  } PathKey;
1047
1073
 
1074
+ /*
1075
+ * VolatileFunctionStatus -- allows nodes to cache their
1076
+ * contain_volatile_functions properties. VOLATILITY_UNKNOWN means not yet
1077
+ * determined.
1078
+ */
1079
+ typedef enum VolatileFunctionStatus
1080
+ {
1081
+ VOLATILITY_UNKNOWN = 0,
1082
+ VOLATILITY_VOLATILE,
1083
+ VOLATILITY_NOVOLATILE
1084
+ } VolatileFunctionStatus;
1048
1085
 
1049
1086
  /*
1050
1087
  * PathTarget
@@ -1076,6 +1113,8 @@ typedef struct PathTarget
1076
1113
  Index *sortgrouprefs; /* corresponding sort/group refnos, or 0 */
1077
1114
  QualCost cost; /* cost of evaluating the expressions */
1078
1115
  int width; /* estimated avg width of result tuples */
1116
+ VolatileFunctionStatus has_volatile_expr; /* indicates if exprs contain
1117
+ * any volatile functions. */
1079
1118
  } PathTarget;
1080
1119
 
1081
1120
  /* Convenience macro to get a sort/group refno from a PathTarget */
@@ -1102,7 +1141,7 @@ typedef struct ParamPathInfo
1102
1141
  NodeTag type;
1103
1142
 
1104
1143
  Relids ppi_req_outer; /* rels supplying parameters used by path */
1105
- double ppi_rows; /* estimated number of result tuples */
1144
+ Cardinality ppi_rows; /* estimated number of result tuples */
1106
1145
  List *ppi_clauses; /* join clauses available from outer rels */
1107
1146
  } ParamPathInfo;
1108
1147
 
@@ -1152,7 +1191,7 @@ typedef struct Path
1152
1191
  int parallel_workers; /* desired # of workers; 0 = not parallel */
1153
1192
 
1154
1193
  /* estimated size/costs for path (see costsize.c for more info) */
1155
- double rows; /* estimated number of result tuples */
1194
+ Cardinality rows; /* estimated number of result tuples */
1156
1195
  Cost startup_cost; /* cost expended before fetching any tuples */
1157
1196
  Cost total_cost; /* total cost (assuming all tuples fetched) */
1158
1197
 
@@ -1320,6 +1359,18 @@ typedef struct TidPath
1320
1359
  List *tidquals; /* qual(s) involving CTID = something */
1321
1360
  } TidPath;
1322
1361
 
1362
+ /*
1363
+ * TidRangePath represents a scan by a contiguous range of TIDs
1364
+ *
1365
+ * tidrangequals is an implicitly AND'ed list of qual expressions of the form
1366
+ * "CTID relop pseudoconstant", where relop is one of >,>=,<,<=.
1367
+ */
1368
+ typedef struct TidRangePath
1369
+ {
1370
+ Path path;
1371
+ List *tidrangequals;
1372
+ } TidRangePath;
1373
+
1323
1374
  /*
1324
1375
  * SubqueryScanPath represents a scan of an unflattened subquery-in-FROM
1325
1376
  *
@@ -1400,12 +1451,10 @@ typedef struct CustomPath
1400
1451
  typedef struct AppendPath
1401
1452
  {
1402
1453
  Path path;
1403
- /* RT indexes of non-leaf tables in a partition tree */
1404
- List *partitioned_rels;
1405
1454
  List *subpaths; /* list of component Paths */
1406
1455
  /* Index of first partial path in subpaths; list_length(subpaths) if none */
1407
1456
  int first_partial_path;
1408
- double limit_tuples; /* hard limit on output tuples, or -1 */
1457
+ Cardinality limit_tuples; /* hard limit on output tuples, or -1 */
1409
1458
  } AppendPath;
1410
1459
 
1411
1460
  #define IS_DUMMY_APPEND(p) \
@@ -1426,10 +1475,8 @@ extern bool is_dummy_rel(RelOptInfo *rel);
1426
1475
  typedef struct MergeAppendPath
1427
1476
  {
1428
1477
  Path path;
1429
- /* RT indexes of non-leaf tables in a partition tree */
1430
- List *partitioned_rels;
1431
1478
  List *subpaths; /* list of component Paths */
1432
- double limit_tuples; /* hard limit on output tuples, or -1 */
1479
+ Cardinality limit_tuples; /* hard limit on output tuples, or -1 */
1433
1480
  } MergeAppendPath;
1434
1481
 
1435
1482
  /*
@@ -1457,6 +1504,27 @@ typedef struct MaterialPath
1457
1504
  Path *subpath;
1458
1505
  } MaterialPath;
1459
1506
 
1507
+ /*
1508
+ * MemoizePath represents a Memoize plan node, i.e., a cache that caches
1509
+ * tuples from parameterized paths to save the underlying node from having to
1510
+ * be rescanned for parameter values which are already cached.
1511
+ */
1512
+ typedef struct MemoizePath
1513
+ {
1514
+ Path path;
1515
+ Path *subpath; /* outerpath to cache tuples from */
1516
+ List *hash_operators; /* hash operators for each key */
1517
+ List *param_exprs; /* cache keys */
1518
+ bool singlerow; /* true if the cache entry is to be marked as
1519
+ * complete after caching the first record. */
1520
+ bool binary_mode; /* true when cache key should be compared bit
1521
+ * by bit, false when using hash equality ops */
1522
+ Cardinality calls; /* expected number of rescans */
1523
+ uint32 est_entries; /* The maximum number of entries that the
1524
+ * planner expects will fit in the cache, or 0
1525
+ * if unknown */
1526
+ } MemoizePath;
1527
+
1460
1528
  /*
1461
1529
  * UniquePath represents elimination of distinct rows from the output of
1462
1530
  * its subpath.
@@ -1469,7 +1537,7 @@ typedef struct MaterialPath
1469
1537
  * it's convenient to have a UniquePath in the path tree to signal upper-level
1470
1538
  * routines that the input is known distinct.)
1471
1539
  */
1472
- typedef enum
1540
+ typedef enum UniquePathMethod
1473
1541
  {
1474
1542
  UNIQUE_PATH_NOOP, /* input is known unique already */
1475
1543
  UNIQUE_PATH_HASH, /* use hashing */
@@ -1539,7 +1607,10 @@ typedef struct JoinPath
1539
1607
  * A nested-loop path needs no special fields.
1540
1608
  */
1541
1609
 
1542
- typedef JoinPath NestPath;
1610
+ typedef struct NestPath
1611
+ {
1612
+ JoinPath jpath;
1613
+ } NestPath;
1543
1614
 
1544
1615
  /*
1545
1616
  * A mergejoin path has these fields.
@@ -1600,7 +1671,7 @@ typedef struct HashPath
1600
1671
  JoinPath jpath;
1601
1672
  List *path_hashclauses; /* join clauses used for hashing */
1602
1673
  int num_batches; /* number of batches expected */
1603
- double inner_rows_total; /* total inner rows expected */
1674
+ Cardinality inner_rows_total; /* total inner rows expected */
1604
1675
  } HashPath;
1605
1676
 
1606
1677
  /*
@@ -1703,7 +1774,7 @@ typedef struct AggPath
1703
1774
  Path *subpath; /* path representing input source */
1704
1775
  AggStrategy aggstrategy; /* basic strategy, see nodes.h */
1705
1776
  AggSplit aggsplit; /* agg-splitting mode, see nodes.h */
1706
- double numGroups; /* estimated number of groups in input */
1777
+ Cardinality numGroups; /* estimated number of groups in input */
1707
1778
  uint64 transitionSpace; /* for pass-by-ref transition data */
1708
1779
  List *groupClause; /* a list of SortGroupClause's */
1709
1780
  List *qual; /* quals (HAVING quals), if any */
@@ -1717,7 +1788,7 @@ typedef struct GroupingSetData
1717
1788
  {
1718
1789
  NodeTag type;
1719
1790
  List *set; /* grouping set as list of sortgrouprefs */
1720
- double numGroups; /* est. number of result groups */
1791
+ Cardinality numGroups; /* est. number of result groups */
1721
1792
  } GroupingSetData;
1722
1793
 
1723
1794
  typedef struct RollupData
@@ -1726,7 +1797,7 @@ typedef struct RollupData
1726
1797
  List *groupClause; /* applicable subset of parse->groupClause */
1727
1798
  List *gsets; /* lists of integer indexes into groupClause */
1728
1799
  List *gsets_data; /* list of GroupingSetData */
1729
- double numGroups; /* est. number of result groups */
1800
+ Cardinality numGroups; /* est. number of result groups */
1730
1801
  bool hashable; /* can be hashed */
1731
1802
  bool is_hashed; /* to be implemented as a hashagg */
1732
1803
  } RollupData;
@@ -1763,6 +1834,9 @@ typedef struct WindowAggPath
1763
1834
  Path path;
1764
1835
  Path *subpath; /* path representing input source */
1765
1836
  WindowClause *winclause; /* WindowClause we'll be using */
1837
+ List *qual; /* lower-level WindowAgg runconditions */
1838
+ bool topwindow; /* false for all apart from the WindowAgg
1839
+ * that's closest to the root of the plan */
1766
1840
  } WindowAggPath;
1767
1841
 
1768
1842
  /*
@@ -1777,7 +1851,7 @@ typedef struct SetOpPath
1777
1851
  List *distinctList; /* SortGroupClauses identifying target cols */
1778
1852
  AttrNumber flagColIdx; /* where is the flag column, if any */
1779
1853
  int firstFlag; /* flag value for first input relation */
1780
- double numGroups; /* estimated number of groups in input */
1854
+ Cardinality numGroups; /* estimated number of groups in input */
1781
1855
  } SetOpPath;
1782
1856
 
1783
1857
  /*
@@ -1790,7 +1864,7 @@ typedef struct RecursiveUnionPath
1790
1864
  Path *rightpath;
1791
1865
  List *distinctList; /* SortGroupClauses identifying target cols */
1792
1866
  int wtParam; /* ID of Param representing work table */
1793
- double numGroups; /* estimated number of groups in input */
1867
+ Cardinality numGroups; /* estimated number of groups in input */
1794
1868
  } RecursiveUnionPath;
1795
1869
 
1796
1870
  /*
@@ -1805,28 +1879,30 @@ typedef struct LockRowsPath
1805
1879
  } LockRowsPath;
1806
1880
 
1807
1881
  /*
1808
- * ModifyTablePath represents performing INSERT/UPDATE/DELETE modifications
1882
+ * ModifyTablePath represents performing INSERT/UPDATE/DELETE/MERGE
1809
1883
  *
1810
1884
  * We represent most things that will be in the ModifyTable plan node
1811
- * literally, except we have child Path(s) not Plan(s). But analysis of the
1885
+ * literally, except we have a child Path not Plan. But analysis of the
1812
1886
  * OnConflictExpr is deferred to createplan.c, as is collection of FDW data.
1813
1887
  */
1814
1888
  typedef struct ModifyTablePath
1815
1889
  {
1816
1890
  Path path;
1817
- CmdType operation; /* INSERT, UPDATE, or DELETE */
1891
+ Path *subpath; /* Path producing source data */
1892
+ CmdType operation; /* INSERT, UPDATE, DELETE, or MERGE */
1818
1893
  bool canSetTag; /* do we set the command tag/es_processed? */
1819
1894
  Index nominalRelation; /* Parent RT index for use of EXPLAIN */
1820
1895
  Index rootRelation; /* Root RT index, if target is partitioned */
1821
- bool partColsUpdated; /* some part key in hierarchy updated */
1896
+ bool partColsUpdated; /* some part key in hierarchy updated? */
1822
1897
  List *resultRelations; /* integer list of RT indexes */
1823
- List *subpaths; /* Path(s) producing source data */
1824
- List *subroots; /* per-target-table PlannerInfos */
1898
+ List *updateColnosLists; /* per-target-table update_colnos lists */
1825
1899
  List *withCheckOptionLists; /* per-target-table WCO lists */
1826
1900
  List *returningLists; /* per-target-table RETURNING tlists */
1827
1901
  List *rowMarks; /* PlanRowMarks (non-locking only) */
1828
1902
  OnConflictExpr *onconflict; /* ON CONFLICT clause, or NULL */
1829
1903
  int epqParam; /* ID of Param for EvalPlanQual re-eval */
1904
+ List *mergeActionLists; /* per-target-table lists of actions for
1905
+ * MERGE */
1830
1906
  } ModifyTablePath;
1831
1907
 
1832
1908
  /*
@@ -1998,6 +2074,9 @@ typedef struct RestrictInfo
1998
2074
 
1999
2075
  bool leakproof; /* true if known to contain no leaked Vars */
2000
2076
 
2077
+ VolatileFunctionStatus has_volatile; /* to indicate if clause contains
2078
+ * any volatile functions. */
2079
+
2001
2080
  Index security_level; /* see comment above */
2002
2081
 
2003
2082
  /* The set of relids (varnos) actually referenced in the clause: */
@@ -2051,6 +2130,10 @@ typedef struct RestrictInfo
2051
2130
  Selectivity right_bucketsize; /* avg bucketsize of right side */
2052
2131
  Selectivity left_mcvfreq; /* left side's most common val's freq */
2053
2132
  Selectivity right_mcvfreq; /* right side's most common val's freq */
2133
+
2134
+ /* hash equality operators used for memoize nodes, else InvalidOid */
2135
+ Oid left_hasheqoperator;
2136
+ Oid right_hasheqoperator;
2054
2137
  } RestrictInfo;
2055
2138
 
2056
2139
  /*
@@ -2277,6 +2360,34 @@ typedef struct AppendRelInfo
2277
2360
  Oid parent_reloid; /* OID of parent relation */
2278
2361
  } AppendRelInfo;
2279
2362
 
2363
+ /*
2364
+ * Information about a row-identity "resjunk" column in UPDATE/DELETE/MERGE.
2365
+ *
2366
+ * In partitioned UPDATE/DELETE/MERGE it's important for child partitions to
2367
+ * share row-identity columns whenever possible, so as not to chew up too many
2368
+ * targetlist columns. We use these structs to track which identity columns
2369
+ * have been requested. In the finished plan, each of these will give rise
2370
+ * to one resjunk entry in the targetlist of the ModifyTable's subplan node.
2371
+ *
2372
+ * All the Vars stored in RowIdentityVarInfos must have varno ROWID_VAR, for
2373
+ * convenience of detecting duplicate requests. We'll replace that, in the
2374
+ * final plan, with the varno of the generating rel.
2375
+ *
2376
+ * Outside this list, a Var with varno ROWID_VAR and varattno k is a reference
2377
+ * to the k-th element of the row_identity_vars list (k counting from 1).
2378
+ * We add such a reference to root->processed_tlist when creating the entry,
2379
+ * and it propagates into the plan tree from there.
2380
+ */
2381
+ typedef struct RowIdentityVarInfo
2382
+ {
2383
+ NodeTag type;
2384
+
2385
+ Var *rowidvar; /* Var to be evaluated (but varno=ROWID_VAR) */
2386
+ int32 rowidwidth; /* estimated average width */
2387
+ char *rowidname; /* name of the resjunk column */
2388
+ Relids rowidrels; /* RTE indexes of target rels using this */
2389
+ } RowIdentityVarInfo;
2390
+
2280
2391
  /*
2281
2392
  * For each distinct placeholder expression generated during planning, we
2282
2393
  * store a PlaceHolderInfo node in the PlannerInfo node's placeholder_list.
@@ -2511,7 +2622,7 @@ typedef struct
2511
2622
  typedef struct
2512
2623
  {
2513
2624
  bool limit_needed;
2514
- double limit_tuples;
2625
+ Cardinality limit_tuples;
2515
2626
  int64 count_est;
2516
2627
  int64 offset_est;
2517
2628
  } FinalPathExtraData;
@@ -2542,15 +2653,82 @@ typedef struct JoinCostWorkspace
2542
2653
  Cost inner_rescan_run_cost;
2543
2654
 
2544
2655
  /* private for cost_mergejoin code */
2545
- double outer_rows;
2546
- double inner_rows;
2547
- double outer_skip_rows;
2548
- double inner_skip_rows;
2656
+ Cardinality outer_rows;
2657
+ Cardinality inner_rows;
2658
+ Cardinality outer_skip_rows;
2659
+ Cardinality inner_skip_rows;
2549
2660
 
2550
2661
  /* private for cost_hashjoin code */
2551
2662
  int numbuckets;
2552
2663
  int numbatches;
2553
- double inner_rows_total;
2664
+ Cardinality inner_rows_total;
2554
2665
  } JoinCostWorkspace;
2555
2666
 
2667
+ /*
2668
+ * AggInfo holds information about an aggregate that needs to be computed.
2669
+ * Multiple Aggrefs in a query can refer to the same AggInfo by having the
2670
+ * same 'aggno' value, so that the aggregate is computed only once.
2671
+ */
2672
+ typedef struct AggInfo
2673
+ {
2674
+ /*
2675
+ * Link to an Aggref expr this state value is for.
2676
+ *
2677
+ * There can be multiple identical Aggref's sharing the same per-agg. This
2678
+ * points to the first one of them.
2679
+ */
2680
+ Aggref *representative_aggref;
2681
+
2682
+ int transno;
2683
+
2684
+ /*
2685
+ * "shareable" is false if this agg cannot share state values with other
2686
+ * aggregates because the final function is read-write.
2687
+ */
2688
+ bool shareable;
2689
+
2690
+ /* Oid of the final function or InvalidOid */
2691
+ Oid finalfn_oid;
2692
+
2693
+ } AggInfo;
2694
+
2695
+ /*
2696
+ * AggTransInfo holds information about transition state that is used by one
2697
+ * or more aggregates in the query. Multiple aggregates can share the same
2698
+ * transition state, if they have the same inputs and the same transition
2699
+ * function. Aggrefs that share the same transition info have the same
2700
+ * 'aggtransno' value.
2701
+ */
2702
+ typedef struct AggTransInfo
2703
+ {
2704
+ List *args;
2705
+ Expr *aggfilter;
2706
+
2707
+ /* Oid of the state transition function */
2708
+ Oid transfn_oid;
2709
+
2710
+ /* Oid of the serialization function or InvalidOid */
2711
+ Oid serialfn_oid;
2712
+
2713
+ /* Oid of the deserialization function or InvalidOid */
2714
+ Oid deserialfn_oid;
2715
+
2716
+ /* Oid of the combine function or InvalidOid */
2717
+ Oid combinefn_oid;
2718
+
2719
+ /* Oid of state value's datatype */
2720
+ Oid aggtranstype;
2721
+ int32 aggtranstypmod;
2722
+ int transtypeLen;
2723
+ bool transtypeByVal;
2724
+ int32 aggtransspace;
2725
+
2726
+ /*
2727
+ * initial value from pg_aggregate entry
2728
+ */
2729
+ Datum initValue;
2730
+ bool initValueIsNull;
2731
+
2732
+ } AggTransInfo;
2733
+
2556
2734
  #endif /* PATHNODES_H */