pg_query 5.0.0 → 6.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (898) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +27 -0
  3. data/README.md +1 -1
  4. data/Rakefile +3 -4
  5. data/ext/pg_query/extconf.rb +14 -4
  6. data/ext/pg_query/include/pg_query.h +4 -3
  7. data/ext/pg_query/include/pg_query_enum_defs.c +424 -154
  8. data/ext/pg_query/include/pg_query_fingerprint_conds.c +68 -4
  9. data/ext/pg_query/include/pg_query_fingerprint_defs.c +2901 -1794
  10. data/ext/pg_query/include/pg_query_outfuncs_conds.c +51 -3
  11. data/ext/pg_query/include/pg_query_outfuncs_defs.c +211 -24
  12. data/ext/pg_query/include/pg_query_readfuncs_conds.c +17 -1
  13. data/ext/pg_query/include/pg_query_readfuncs_defs.c +272 -53
  14. data/ext/pg_query/include/postgres/access/amapi.h +299 -0
  15. data/ext/pg_query/include/postgres/access/attmap.h +54 -0
  16. data/ext/pg_query/include/postgres/access/attnum.h +64 -0
  17. data/ext/pg_query/include/postgres/access/brin_internal.h +116 -0
  18. data/ext/pg_query/include/postgres/access/brin_tuple.h +112 -0
  19. data/ext/pg_query/include/postgres/access/clog.h +62 -0
  20. data/ext/pg_query/include/postgres/access/commit_ts.h +73 -0
  21. data/ext/pg_query/include/postgres/access/detoast.h +82 -0
  22. data/ext/pg_query/include/postgres/access/genam.h +237 -0
  23. data/ext/pg_query/include/postgres/access/gin.h +91 -0
  24. data/ext/pg_query/include/postgres/access/htup.h +89 -0
  25. data/ext/pg_query/include/postgres/access/htup_details.h +811 -0
  26. data/ext/pg_query/include/postgres/access/itup.h +170 -0
  27. data/ext/pg_query/include/postgres/access/parallel.h +81 -0
  28. data/ext/pg_query/include/postgres/access/printtup.h +35 -0
  29. data/ext/pg_query/include/postgres/access/relation.h +28 -0
  30. data/ext/pg_query/include/postgres/access/relscan.h +191 -0
  31. data/ext/pg_query/include/postgres/access/rmgrlist.h +49 -0
  32. data/ext/pg_query/include/postgres/access/sdir.h +67 -0
  33. data/ext/pg_query/include/postgres/access/skey.h +151 -0
  34. data/ext/pg_query/include/postgres/access/slru.h +221 -0
  35. data/ext/pg_query/include/postgres/access/stratnum.h +85 -0
  36. data/ext/pg_query/include/postgres/access/sysattr.h +29 -0
  37. data/ext/pg_query/include/postgres/access/table.h +28 -0
  38. data/ext/pg_query/include/postgres/access/tableam.h +2109 -0
  39. data/ext/pg_query/include/postgres/access/tidstore.h +50 -0
  40. data/ext/pg_query/include/postgres/access/toast_compression.h +73 -0
  41. data/ext/pg_query/include/postgres/access/transam.h +375 -0
  42. data/ext/pg_query/include/postgres/access/tsmapi.h +82 -0
  43. data/ext/pg_query/include/postgres/access/tupconvert.h +54 -0
  44. data/ext/pg_query/include/postgres/access/tupdesc.h +154 -0
  45. data/ext/pg_query/include/postgres/access/tupmacs.h +207 -0
  46. data/ext/pg_query/include/postgres/access/twophase.h +65 -0
  47. data/ext/pg_query/include/postgres/access/xact.h +530 -0
  48. data/ext/pg_query/include/postgres/access/xlog.h +310 -0
  49. data/ext/pg_query/include/postgres/access/xlog_internal.h +405 -0
  50. data/ext/pg_query/include/postgres/access/xlogbackup.h +43 -0
  51. data/ext/pg_query/include/postgres/access/xlogdefs.h +82 -0
  52. data/ext/pg_query/include/postgres/access/xlogprefetcher.h +55 -0
  53. data/ext/pg_query/include/postgres/access/xlogreader.h +444 -0
  54. data/ext/pg_query/include/postgres/access/xlogrecord.h +248 -0
  55. data/ext/pg_query/include/postgres/access/xlogrecovery.h +158 -0
  56. data/ext/pg_query/include/postgres/archive/archive_module.h +67 -0
  57. data/ext/pg_query/include/postgres/c.h +1374 -0
  58. data/ext/pg_query/include/postgres/catalog/catalog.h +47 -0
  59. data/ext/pg_query/include/postgres/catalog/catversion.h +62 -0
  60. data/ext/pg_query/include/postgres/catalog/dependency.h +228 -0
  61. data/ext/pg_query/include/postgres/catalog/genbki.h +149 -0
  62. data/ext/pg_query/include/postgres/catalog/index.h +218 -0
  63. data/ext/pg_query/include/postgres/catalog/indexing.h +54 -0
  64. data/ext/pg_query/include/postgres/catalog/namespace.h +189 -0
  65. data/ext/pg_query/include/postgres/catalog/objectaccess.h +267 -0
  66. data/ext/pg_query/include/postgres/catalog/objectaddress.h +89 -0
  67. data/ext/pg_query/include/postgres/catalog/pg_aggregate.h +182 -0
  68. data/ext/pg_query/include/postgres/catalog/pg_aggregate_d.h +78 -0
  69. data/ext/pg_query/include/postgres/catalog/pg_am.h +66 -0
  70. data/ext/pg_query/include/postgres/catalog/pg_am_d.h +47 -0
  71. data/ext/pg_query/include/postgres/catalog/pg_attribute.h +240 -0
  72. data/ext/pg_query/include/postgres/catalog/pg_attribute_d.h +62 -0
  73. data/ext/pg_query/include/postgres/catalog/pg_authid.h +66 -0
  74. data/ext/pg_query/include/postgres/catalog/pg_authid_d.h +60 -0
  75. data/ext/pg_query/include/postgres/catalog/pg_class.h +235 -0
  76. data/ext/pg_query/include/postgres/catalog/pg_class_d.h +134 -0
  77. data/ext/pg_query/include/postgres/catalog/pg_collation.h +106 -0
  78. data/ext/pg_query/include/postgres/catalog/pg_collation_d.h +66 -0
  79. data/ext/pg_query/include/postgres/catalog/pg_constraint.h +278 -0
  80. data/ext/pg_query/include/postgres/catalog/pg_constraint_d.h +74 -0
  81. data/ext/pg_query/include/postgres/catalog/pg_control.h +260 -0
  82. data/ext/pg_query/include/postgres/catalog/pg_conversion.h +79 -0
  83. data/ext/pg_query/include/postgres/catalog/pg_conversion_d.h +38 -0
  84. data/ext/pg_query/include/postgres/catalog/pg_database.h +129 -0
  85. data/ext/pg_query/include/postgres/catalog/pg_database_d.h +53 -0
  86. data/ext/pg_query/include/postgres/catalog/pg_depend.h +77 -0
  87. data/ext/pg_query/include/postgres/catalog/pg_depend_d.h +36 -0
  88. data/ext/pg_query/include/postgres/catalog/pg_event_trigger.h +60 -0
  89. data/ext/pg_query/include/postgres/catalog/pg_event_trigger_d.h +36 -0
  90. data/ext/pg_query/include/postgres/catalog/pg_index.h +92 -0
  91. data/ext/pg_query/include/postgres/catalog/pg_index_d.h +59 -0
  92. data/ext/pg_query/include/postgres/catalog/pg_language.h +75 -0
  93. data/ext/pg_query/include/postgres/catalog/pg_language_d.h +41 -0
  94. data/ext/pg_query/include/postgres/catalog/pg_namespace.h +67 -0
  95. data/ext/pg_query/include/postgres/catalog/pg_namespace_d.h +36 -0
  96. data/ext/pg_query/include/postgres/catalog/pg_opclass.h +91 -0
  97. data/ext/pg_query/include/postgres/catalog/pg_opclass_d.h +51 -0
  98. data/ext/pg_query/include/postgres/catalog/pg_operator.h +124 -0
  99. data/ext/pg_query/include/postgres/catalog/pg_operator_d.h +142 -0
  100. data/ext/pg_query/include/postgres/catalog/pg_opfamily.h +67 -0
  101. data/ext/pg_query/include/postgres/catalog/pg_opfamily_d.h +51 -0
  102. data/ext/pg_query/include/postgres/catalog/pg_partitioned_table.h +76 -0
  103. data/ext/pg_query/include/postgres/catalog/pg_partitioned_table_d.h +36 -0
  104. data/ext/pg_query/include/postgres/catalog/pg_proc.h +223 -0
  105. data/ext/pg_query/include/postgres/catalog/pg_proc_d.h +101 -0
  106. data/ext/pg_query/include/postgres/catalog/pg_publication.h +161 -0
  107. data/ext/pg_query/include/postgres/catalog/pg_publication_d.h +38 -0
  108. data/ext/pg_query/include/postgres/catalog/pg_replication_origin.h +65 -0
  109. data/ext/pg_query/include/postgres/catalog/pg_replication_origin_d.h +33 -0
  110. data/ext/pg_query/include/postgres/catalog/pg_statistic.h +288 -0
  111. data/ext/pg_query/include/postgres/catalog/pg_statistic_d.h +199 -0
  112. data/ext/pg_query/include/postgres/catalog/pg_statistic_ext.h +91 -0
  113. data/ext/pg_query/include/postgres/catalog/pg_statistic_ext_d.h +45 -0
  114. data/ext/pg_query/include/postgres/catalog/pg_transform.h +51 -0
  115. data/ext/pg_query/include/postgres/catalog/pg_transform_d.h +34 -0
  116. data/ext/pg_query/include/postgres/catalog/pg_trigger.h +153 -0
  117. data/ext/pg_query/include/postgres/catalog/pg_trigger_d.h +109 -0
  118. data/ext/pg_query/include/postgres/catalog/pg_ts_config.h +56 -0
  119. data/ext/pg_query/include/postgres/catalog/pg_ts_config_d.h +34 -0
  120. data/ext/pg_query/include/postgres/catalog/pg_ts_dict.h +62 -0
  121. data/ext/pg_query/include/postgres/catalog/pg_ts_dict_d.h +35 -0
  122. data/ext/pg_query/include/postgres/catalog/pg_ts_parser.h +63 -0
  123. data/ext/pg_query/include/postgres/catalog/pg_ts_parser_d.h +37 -0
  124. data/ext/pg_query/include/postgres/catalog/pg_ts_template.h +54 -0
  125. data/ext/pg_query/include/postgres/catalog/pg_ts_template_d.h +34 -0
  126. data/ext/pg_query/include/postgres/catalog/pg_type.h +407 -0
  127. data/ext/pg_query/include/postgres/catalog/pg_type_d.h +324 -0
  128. data/ext/pg_query/include/postgres/catalog/storage.h +50 -0
  129. data/ext/pg_query/include/postgres/catalog/syscache_ids.h +104 -0
  130. data/ext/pg_query/include/postgres/commands/async.h +49 -0
  131. data/ext/pg_query/include/postgres/commands/dbcommands.h +37 -0
  132. data/ext/pg_query/include/postgres/commands/defrem.h +161 -0
  133. data/ext/pg_query/include/postgres/commands/event_trigger.h +91 -0
  134. data/ext/pg_query/include/postgres/commands/explain.h +145 -0
  135. data/ext/pg_query/include/postgres/commands/prepare.h +61 -0
  136. data/ext/pg_query/include/postgres/commands/tablespace.h +69 -0
  137. data/ext/pg_query/include/postgres/commands/trigger.h +288 -0
  138. data/ext/pg_query/include/postgres/commands/vacuum.h +388 -0
  139. data/ext/pg_query/include/postgres/common/cryptohash.h +39 -0
  140. data/ext/pg_query/include/postgres/common/file_perm.h +56 -0
  141. data/ext/pg_query/include/postgres/common/file_utils.h +65 -0
  142. data/ext/pg_query/include/postgres/common/hashfn.h +119 -0
  143. data/ext/pg_query/include/postgres/common/hashfn_unstable.h +453 -0
  144. data/ext/pg_query/include/postgres/common/int.h +512 -0
  145. data/ext/pg_query/include/postgres/common/keywords.h +29 -0
  146. data/ext/pg_query/include/postgres/common/kwlookup.h +44 -0
  147. data/ext/pg_query/include/postgres/common/pg_prng.h +62 -0
  148. data/ext/pg_query/include/postgres/common/relpath.h +97 -0
  149. data/ext/pg_query/include/postgres/common/scram-common.h +70 -0
  150. data/ext/pg_query/include/postgres/common/sha2.h +32 -0
  151. data/ext/pg_query/include/postgres/common/string.h +44 -0
  152. data/ext/pg_query/include/postgres/common/unicode_east_asian_fw_table.h +124 -0
  153. data/ext/pg_query/include/postgres/copyfuncs.funcs.c +5261 -0
  154. data/ext/pg_query/include/postgres/copyfuncs.switch.c +989 -0
  155. data/ext/pg_query/include/postgres/datatype/timestamp.h +269 -0
  156. data/ext/pg_query/include/postgres/equalfuncs.funcs.c +3310 -0
  157. data/ext/pg_query/include/postgres/equalfuncs.switch.c +836 -0
  158. data/ext/pg_query/include/postgres/executor/execdesc.h +70 -0
  159. data/ext/pg_query/include/postgres/executor/executor.h +681 -0
  160. data/ext/pg_query/include/postgres/executor/functions.h +56 -0
  161. data/ext/pg_query/include/postgres/executor/instrument.h +120 -0
  162. data/ext/pg_query/include/postgres/executor/spi.h +207 -0
  163. data/ext/pg_query/include/postgres/executor/tablefunc.h +67 -0
  164. data/ext/pg_query/include/postgres/executor/tuptable.h +523 -0
  165. data/ext/pg_query/include/postgres/fmgr.h +800 -0
  166. data/ext/pg_query/include/postgres/foreign/fdwapi.h +294 -0
  167. data/ext/pg_query/include/postgres/funcapi.h +360 -0
  168. data/ext/pg_query/include/postgres/gram.h +1168 -0
  169. data/ext/pg_query/include/postgres/gramparse.h +75 -0
  170. data/ext/pg_query/include/postgres/jit/jit.h +106 -0
  171. data/ext/pg_query/include/postgres/kwlist_d.h +1164 -0
  172. data/ext/pg_query/include/postgres/lib/dshash.h +130 -0
  173. data/ext/pg_query/include/postgres/lib/ilist.h +1159 -0
  174. data/ext/pg_query/include/postgres/lib/pairingheap.h +102 -0
  175. data/ext/pg_query/include/postgres/lib/simplehash.h +1206 -0
  176. data/ext/pg_query/include/postgres/lib/sort_template.h +445 -0
  177. data/ext/pg_query/include/postgres/lib/stringinfo.h +243 -0
  178. data/ext/pg_query/include/postgres/libpq/auth.h +37 -0
  179. data/ext/pg_query/include/postgres/libpq/crypt.h +47 -0
  180. data/ext/pg_query/include/postgres/libpq/hba.h +186 -0
  181. data/ext/pg_query/include/postgres/libpq/libpq-be.h +358 -0
  182. data/ext/pg_query/include/postgres/libpq/libpq.h +143 -0
  183. data/ext/pg_query/include/postgres/libpq/pqcomm.h +169 -0
  184. data/ext/pg_query/include/postgres/libpq/pqformat.h +209 -0
  185. data/ext/pg_query/include/postgres/libpq/pqsignal.h +54 -0
  186. data/ext/pg_query/include/postgres/libpq/protocol.h +89 -0
  187. data/ext/pg_query/include/postgres/libpq/sasl.h +136 -0
  188. data/ext/pg_query/include/postgres/libpq/scram.h +37 -0
  189. data/ext/pg_query/include/postgres/mb/pg_wchar.h +792 -0
  190. data/ext/pg_query/include/postgres/mb/stringinfo_mb.h +24 -0
  191. data/ext/pg_query/include/postgres/miscadmin.h +519 -0
  192. data/ext/pg_query/include/postgres/nodes/bitmapset.h +140 -0
  193. data/ext/pg_query/include/postgres/nodes/execnodes.h +2852 -0
  194. data/ext/pg_query/include/postgres/nodes/extensible.h +164 -0
  195. data/ext/pg_query/include/postgres/nodes/lockoptions.h +61 -0
  196. data/ext/pg_query/include/postgres/nodes/makefuncs.h +127 -0
  197. data/ext/pg_query/include/postgres/nodes/memnodes.h +152 -0
  198. data/ext/pg_query/include/postgres/nodes/miscnodes.h +56 -0
  199. data/ext/pg_query/include/postgres/nodes/nodeFuncs.h +222 -0
  200. data/ext/pg_query/include/postgres/nodes/nodes.h +435 -0
  201. data/ext/pg_query/include/postgres/nodes/nodetags.h +491 -0
  202. data/ext/pg_query/include/postgres/nodes/params.h +170 -0
  203. data/ext/pg_query/include/postgres/nodes/parsenodes.h +4233 -0
  204. data/ext/pg_query/include/postgres/nodes/pathnodes.h +3435 -0
  205. data/ext/pg_query/include/postgres/nodes/pg_list.h +686 -0
  206. data/ext/pg_query/include/postgres/nodes/plannodes.h +1593 -0
  207. data/ext/pg_query/include/postgres/nodes/primnodes.h +2335 -0
  208. data/ext/pg_query/include/postgres/nodes/print.h +34 -0
  209. data/ext/pg_query/include/postgres/nodes/queryjumble.h +86 -0
  210. data/ext/pg_query/include/postgres/nodes/replnodes.h +132 -0
  211. data/ext/pg_query/include/postgres/nodes/supportnodes.h +346 -0
  212. data/ext/pg_query/include/postgres/nodes/tidbitmap.h +75 -0
  213. data/ext/pg_query/include/postgres/nodes/value.h +90 -0
  214. data/ext/pg_query/include/postgres/optimizer/cost.h +216 -0
  215. data/ext/pg_query/include/postgres/optimizer/geqo.h +90 -0
  216. data/ext/pg_query/include/postgres/optimizer/geqo_gene.h +45 -0
  217. data/ext/pg_query/include/postgres/optimizer/optimizer.h +205 -0
  218. data/ext/pg_query/include/postgres/optimizer/paths.h +271 -0
  219. data/ext/pg_query/include/postgres/optimizer/planmain.h +123 -0
  220. data/ext/pg_query/include/postgres/parser/analyze.h +66 -0
  221. data/ext/pg_query/include/postgres/parser/kwlist.h +518 -0
  222. data/ext/pg_query/include/postgres/parser/parse_agg.h +65 -0
  223. data/ext/pg_query/include/postgres/parser/parse_coerce.h +102 -0
  224. data/ext/pg_query/include/postgres/parser/parse_expr.h +25 -0
  225. data/ext/pg_query/include/postgres/parser/parse_func.h +74 -0
  226. data/ext/pg_query/include/postgres/parser/parse_node.h +358 -0
  227. data/ext/pg_query/include/postgres/parser/parse_oper.h +68 -0
  228. data/ext/pg_query/include/postgres/parser/parse_relation.h +129 -0
  229. data/ext/pg_query/include/postgres/parser/parse_type.h +61 -0
  230. data/ext/pg_query/include/postgres/parser/parser.h +68 -0
  231. data/ext/pg_query/include/postgres/parser/parsetree.h +61 -0
  232. data/ext/pg_query/include/postgres/parser/scanner.h +152 -0
  233. data/ext/pg_query/include/postgres/parser/scansup.h +27 -0
  234. data/ext/pg_query/include/postgres/partitioning/partdefs.h +26 -0
  235. data/ext/pg_query/include/postgres/pg_config.h +977 -0
  236. data/ext/pg_query/include/postgres/pg_config_manual.h +385 -0
  237. data/ext/pg_query/include/postgres/pg_config_os.h +8 -0
  238. data/ext/pg_query/include/postgres/pg_getopt.h +56 -0
  239. data/ext/pg_query/include/postgres/pg_trace.h +17 -0
  240. data/ext/pg_query/include/postgres/pgstat.h +780 -0
  241. data/ext/pg_query/include/postgres/pgtime.h +94 -0
  242. data/ext/pg_query/include/postgres/pl_gram.h +385 -0
  243. data/ext/pg_query/include/postgres/pl_reserved_kwlist.h +52 -0
  244. data/ext/pg_query/include/postgres/pl_reserved_kwlist_d.h +114 -0
  245. data/ext/pg_query/include/postgres/pl_unreserved_kwlist.h +112 -0
  246. data/ext/pg_query/include/postgres/pl_unreserved_kwlist_d.h +246 -0
  247. data/ext/pg_query/include/postgres/plerrcodes.h +998 -0
  248. data/ext/pg_query/include/postgres/plpgsql.h +1342 -0
  249. data/ext/pg_query/include/postgres/port/atomics/arch-arm.h +32 -0
  250. data/ext/pg_query/include/postgres/port/atomics/arch-hppa.h +17 -0
  251. data/ext/pg_query/include/postgres/port/atomics/arch-ppc.h +256 -0
  252. data/ext/pg_query/include/postgres/port/atomics/arch-x86.h +254 -0
  253. data/ext/pg_query/include/postgres/port/atomics/fallback.h +170 -0
  254. data/ext/pg_query/include/postgres/port/atomics/generic-gcc.h +323 -0
  255. data/ext/pg_query/include/postgres/port/atomics/generic-msvc.h +119 -0
  256. data/ext/pg_query/include/postgres/port/atomics/generic-sunpro.h +121 -0
  257. data/ext/pg_query/include/postgres/port/atomics/generic.h +437 -0
  258. data/ext/pg_query/include/postgres/port/atomics.h +606 -0
  259. data/ext/pg_query/include/postgres/port/pg_bitutils.h +421 -0
  260. data/ext/pg_query/include/postgres/port/pg_bswap.h +161 -0
  261. data/ext/pg_query/include/postgres/port/pg_crc32c.h +110 -0
  262. data/ext/pg_query/include/postgres/port/pg_iovec.h +117 -0
  263. data/ext/pg_query/include/postgres/port/simd.h +422 -0
  264. data/ext/pg_query/include/postgres/port/win32/arpa/inet.h +3 -0
  265. data/ext/pg_query/include/postgres/port/win32/dlfcn.h +1 -0
  266. data/ext/pg_query/include/postgres/port/win32/grp.h +1 -0
  267. data/ext/pg_query/include/postgres/port/win32/netdb.h +7 -0
  268. data/ext/pg_query/include/postgres/port/win32/netinet/in.h +3 -0
  269. data/ext/pg_query/include/postgres/port/win32/netinet/tcp.h +7 -0
  270. data/ext/pg_query/include/postgres/port/win32/pwd.h +3 -0
  271. data/ext/pg_query/include/postgres/port/win32/sys/resource.h +20 -0
  272. data/ext/pg_query/include/postgres/port/win32/sys/select.h +3 -0
  273. data/ext/pg_query/include/postgres/port/win32/sys/socket.h +34 -0
  274. data/ext/pg_query/include/postgres/port/win32/sys/un.h +17 -0
  275. data/ext/pg_query/include/postgres/port/win32/sys/wait.h +3 -0
  276. data/ext/pg_query/include/postgres/port/win32.h +59 -0
  277. data/ext/pg_query/include/postgres/port/win32_msvc/dirent.h +34 -0
  278. data/ext/pg_query/include/postgres/port/win32_msvc/sys/file.h +1 -0
  279. data/ext/pg_query/include/postgres/port/win32_msvc/sys/param.h +1 -0
  280. data/ext/pg_query/include/postgres/port/win32_msvc/sys/time.h +1 -0
  281. data/ext/pg_query/include/postgres/port/win32_msvc/unistd.h +9 -0
  282. data/ext/pg_query/include/postgres/port/win32_msvc/utime.h +3 -0
  283. data/ext/pg_query/include/postgres/port/win32_port.h +584 -0
  284. data/ext/pg_query/include/postgres/port.h +524 -0
  285. data/ext/pg_query/include/postgres/portability/instr_time.h +197 -0
  286. data/ext/pg_query/include/postgres/postgres.h +579 -0
  287. data/ext/pg_query/include/postgres/postmaster/autovacuum.h +69 -0
  288. data/ext/pg_query/include/postgres/postmaster/bgworker.h +164 -0
  289. data/ext/pg_query/include/postgres/postmaster/bgworker_internals.h +60 -0
  290. data/ext/pg_query/include/postgres/postmaster/bgwriter.h +45 -0
  291. data/ext/pg_query/include/postgres/postmaster/interrupt.h +32 -0
  292. data/ext/pg_query/include/postgres/postmaster/pgarch.h +36 -0
  293. data/ext/pg_query/include/postgres/postmaster/postmaster.h +101 -0
  294. data/ext/pg_query/include/postgres/postmaster/startup.h +41 -0
  295. data/ext/pg_query/include/postgres/postmaster/syslogger.h +101 -0
  296. data/ext/pg_query/include/postgres/postmaster/walsummarizer.h +35 -0
  297. data/ext/pg_query/include/postgres/postmaster/walwriter.h +23 -0
  298. data/ext/pg_query/include/postgres/regex/regex.h +272 -0
  299. data/ext/pg_query/include/postgres/replication/logicallauncher.h +34 -0
  300. data/ext/pg_query/include/postgres/replication/logicalproto.h +274 -0
  301. data/ext/pg_query/include/postgres/replication/logicalworker.h +33 -0
  302. data/ext/pg_query/include/postgres/replication/origin.h +73 -0
  303. data/ext/pg_query/include/postgres/replication/reorderbuffer.h +743 -0
  304. data/ext/pg_query/include/postgres/replication/slot.h +285 -0
  305. data/ext/pg_query/include/postgres/replication/slotsync.h +38 -0
  306. data/ext/pg_query/include/postgres/replication/syncrep.h +109 -0
  307. data/ext/pg_query/include/postgres/replication/walreceiver.h +504 -0
  308. data/ext/pg_query/include/postgres/replication/walsender.h +76 -0
  309. data/ext/pg_query/include/postgres/rewrite/prs2lock.h +46 -0
  310. data/ext/pg_query/include/postgres/rewrite/rewriteHandler.h +41 -0
  311. data/ext/pg_query/include/postgres/rewrite/rewriteManip.h +96 -0
  312. data/ext/pg_query/include/postgres/rewrite/rewriteSupport.h +26 -0
  313. data/ext/pg_query/include/postgres/storage/block.h +108 -0
  314. data/ext/pg_query/include/postgres/storage/buf.h +46 -0
  315. data/ext/pg_query/include/postgres/storage/bufmgr.h +411 -0
  316. data/ext/pg_query/include/postgres/storage/bufpage.h +510 -0
  317. data/ext/pg_query/include/postgres/storage/condition_variable.h +73 -0
  318. data/ext/pg_query/include/postgres/storage/dsm.h +61 -0
  319. data/ext/pg_query/include/postgres/storage/dsm_impl.h +79 -0
  320. data/ext/pg_query/include/postgres/storage/fd.h +219 -0
  321. data/ext/pg_query/include/postgres/storage/fileset.h +40 -0
  322. data/ext/pg_query/include/postgres/storage/ipc.h +87 -0
  323. data/ext/pg_query/include/postgres/storage/item.h +19 -0
  324. data/ext/pg_query/include/postgres/storage/itemid.h +184 -0
  325. data/ext/pg_query/include/postgres/storage/itemptr.h +245 -0
  326. data/ext/pg_query/include/postgres/storage/large_object.h +100 -0
  327. data/ext/pg_query/include/postgres/storage/latch.h +196 -0
  328. data/ext/pg_query/include/postgres/storage/lmgr.h +126 -0
  329. data/ext/pg_query/include/postgres/storage/lock.h +624 -0
  330. data/ext/pg_query/include/postgres/storage/lockdefs.h +59 -0
  331. data/ext/pg_query/include/postgres/storage/lwlock.h +228 -0
  332. data/ext/pg_query/include/postgres/storage/lwlocknames.h +47 -0
  333. data/ext/pg_query/include/postgres/storage/off.h +57 -0
  334. data/ext/pg_query/include/postgres/storage/pg_sema.h +61 -0
  335. data/ext/pg_query/include/postgres/storage/pg_shmem.h +93 -0
  336. data/ext/pg_query/include/postgres/storage/pmsignal.h +105 -0
  337. data/ext/pg_query/include/postgres/storage/predicate.h +83 -0
  338. data/ext/pg_query/include/postgres/storage/proc.h +491 -0
  339. data/ext/pg_query/include/postgres/storage/procarray.h +103 -0
  340. data/ext/pg_query/include/postgres/storage/proclist_types.h +53 -0
  341. data/ext/pg_query/include/postgres/storage/procnumber.h +43 -0
  342. data/ext/pg_query/include/postgres/storage/procsignal.h +75 -0
  343. data/ext/pg_query/include/postgres/storage/read_stream.h +65 -0
  344. data/ext/pg_query/include/postgres/storage/relfilelocator.h +100 -0
  345. data/ext/pg_query/include/postgres/storage/s_lock.h +847 -0
  346. data/ext/pg_query/include/postgres/storage/sharedfileset.h +37 -0
  347. data/ext/pg_query/include/postgres/storage/shm_mq.h +86 -0
  348. data/ext/pg_query/include/postgres/storage/shm_toc.h +58 -0
  349. data/ext/pg_query/include/postgres/storage/shmem.h +59 -0
  350. data/ext/pg_query/include/postgres/storage/sinval.h +153 -0
  351. data/ext/pg_query/include/postgres/storage/smgr.h +127 -0
  352. data/ext/pg_query/include/postgres/storage/spin.h +77 -0
  353. data/ext/pg_query/include/postgres/storage/standby.h +109 -0
  354. data/ext/pg_query/include/postgres/storage/standbydefs.h +74 -0
  355. data/ext/pg_query/include/postgres/storage/sync.h +66 -0
  356. data/ext/pg_query/include/postgres/tcop/cmdtag.h +62 -0
  357. data/ext/pg_query/include/postgres/tcop/cmdtaglist.h +219 -0
  358. data/ext/pg_query/include/postgres/tcop/deparse_utility.h +108 -0
  359. data/ext/pg_query/include/postgres/tcop/dest.h +148 -0
  360. data/ext/pg_query/include/postgres/tcop/fastpath.h +20 -0
  361. data/ext/pg_query/include/postgres/tcop/pquery.h +51 -0
  362. data/ext/pg_query/include/postgres/tcop/tcopprot.h +98 -0
  363. data/ext/pg_query/include/postgres/tcop/utility.h +112 -0
  364. data/ext/pg_query/include/postgres/tsearch/ts_cache.h +96 -0
  365. data/ext/pg_query/include/postgres/utils/acl.h +290 -0
  366. data/ext/pg_query/include/postgres/utils/aclchk_internal.h +45 -0
  367. data/ext/pg_query/include/postgres/utils/array.h +481 -0
  368. data/ext/pg_query/include/postgres/utils/ascii.h +84 -0
  369. data/ext/pg_query/include/postgres/utils/backend_progress.h +46 -0
  370. data/ext/pg_query/include/postgres/utils/backend_status.h +340 -0
  371. data/ext/pg_query/include/postgres/utils/builtins.h +139 -0
  372. data/ext/pg_query/include/postgres/utils/bytea.h +28 -0
  373. data/ext/pg_query/include/postgres/utils/catcache.h +230 -0
  374. data/ext/pg_query/include/postgres/utils/date.h +118 -0
  375. data/ext/pg_query/include/postgres/utils/datetime.h +367 -0
  376. data/ext/pg_query/include/postgres/utils/datum.h +76 -0
  377. data/ext/pg_query/include/postgres/utils/dsa.h +166 -0
  378. data/ext/pg_query/include/postgres/utils/elog.h +540 -0
  379. data/ext/pg_query/include/postgres/utils/errcodes.h +352 -0
  380. data/ext/pg_query/include/postgres/utils/expandeddatum.h +170 -0
  381. data/ext/pg_query/include/postgres/utils/expandedrecord.h +241 -0
  382. data/ext/pg_query/include/postgres/utils/float.h +357 -0
  383. data/ext/pg_query/include/postgres/utils/fmgroids.h +3347 -0
  384. data/ext/pg_query/include/postgres/utils/fmgrprotos.h +2904 -0
  385. data/ext/pg_query/include/postgres/utils/fmgrtab.h +49 -0
  386. data/ext/pg_query/include/postgres/utils/guc.h +456 -0
  387. data/ext/pg_query/include/postgres/utils/guc_hooks.h +184 -0
  388. data/ext/pg_query/include/postgres/utils/guc_tables.h +323 -0
  389. data/ext/pg_query/include/postgres/utils/hsearch.h +153 -0
  390. data/ext/pg_query/include/postgres/utils/injection_point.h +44 -0
  391. data/ext/pg_query/include/postgres/utils/inval.h +68 -0
  392. data/ext/pg_query/include/postgres/utils/logtape.h +77 -0
  393. data/ext/pg_query/include/postgres/utils/lsyscache.h +215 -0
  394. data/ext/pg_query/include/postgres/utils/memdebug.h +82 -0
  395. data/ext/pg_query/include/postgres/utils/memutils.h +193 -0
  396. data/ext/pg_query/include/postgres/utils/memutils_internal.h +176 -0
  397. data/ext/pg_query/include/postgres/utils/memutils_memorychunk.h +253 -0
  398. data/ext/pg_query/include/postgres/utils/numeric.h +110 -0
  399. data/ext/pg_query/include/postgres/utils/palloc.h +151 -0
  400. data/ext/pg_query/include/postgres/utils/partcache.h +103 -0
  401. data/ext/pg_query/include/postgres/utils/pg_locale.h +136 -0
  402. data/ext/pg_query/include/postgres/utils/pgstat_internal.h +808 -0
  403. data/ext/pg_query/include/postgres/utils/plancache.h +238 -0
  404. data/ext/pg_query/include/postgres/utils/portal.h +252 -0
  405. data/ext/pg_query/include/postgres/utils/queryenvironment.h +74 -0
  406. data/ext/pg_query/include/postgres/utils/regproc.h +39 -0
  407. data/ext/pg_query/include/postgres/utils/rel.h +711 -0
  408. data/ext/pg_query/include/postgres/utils/relcache.h +155 -0
  409. data/ext/pg_query/include/postgres/utils/reltrigger.h +81 -0
  410. data/ext/pg_query/include/postgres/utils/resowner.h +167 -0
  411. data/ext/pg_query/include/postgres/utils/ruleutils.h +52 -0
  412. data/ext/pg_query/include/postgres/utils/sharedtuplestore.h +61 -0
  413. data/ext/pg_query/include/postgres/utils/snapmgr.h +130 -0
  414. data/ext/pg_query/include/postgres/utils/snapshot.h +219 -0
  415. data/ext/pg_query/include/postgres/utils/sortsupport.h +391 -0
  416. data/ext/pg_query/include/postgres/utils/syscache.h +131 -0
  417. data/ext/pg_query/include/postgres/utils/timeout.h +96 -0
  418. data/ext/pg_query/include/postgres/utils/timestamp.h +147 -0
  419. data/ext/pg_query/include/postgres/utils/tuplesort.h +472 -0
  420. data/ext/pg_query/include/postgres/utils/tuplestore.h +88 -0
  421. data/ext/pg_query/include/postgres/utils/typcache.h +210 -0
  422. data/ext/pg_query/include/postgres/utils/varlena.h +53 -0
  423. data/ext/pg_query/include/postgres/utils/wait_event.h +108 -0
  424. data/ext/pg_query/include/postgres/utils/wait_event_types.h +218 -0
  425. data/ext/pg_query/include/postgres/utils/xml.h +94 -0
  426. data/ext/pg_query/include/postgres/varatt.h +358 -0
  427. data/ext/pg_query/include/protobuf/pg_query.pb-c.h +1546 -792
  428. data/ext/pg_query/include/protobuf/pg_query.pb.h +58365 -46595
  429. data/ext/pg_query/pg_query.c +9 -0
  430. data/ext/pg_query/pg_query.pb-c.c +6598 -3739
  431. data/ext/pg_query/pg_query_fingerprint.c +4 -5
  432. data/ext/pg_query/pg_query_normalize.c +42 -1
  433. data/ext/pg_query/pg_query_outfuncs_json.c +9 -1
  434. data/ext/pg_query/pg_query_outfuncs_protobuf.c +1 -0
  435. data/ext/pg_query/pg_query_parse.c +1 -1
  436. data/ext/pg_query/pg_query_parse_plpgsql.c +18 -17
  437. data/ext/pg_query/pg_query_readfuncs_protobuf.c +3 -2
  438. data/ext/pg_query/pg_query_ruby.c +5 -0
  439. data/ext/pg_query/pg_query_ruby_freebsd.sym +0 -1
  440. data/ext/pg_query/pg_query_scan.c +1 -1
  441. data/ext/pg_query/pg_query_split.c +1 -1
  442. data/ext/pg_query/postgres_deparse.c +409 -21
  443. data/ext/pg_query/src_backend_catalog_namespace.c +241 -66
  444. data/ext/pg_query/src_backend_catalog_pg_proc.c +1 -3
  445. data/ext/pg_query/src_backend_commands_define.c +2 -3
  446. data/ext/pg_query/src_backend_nodes_bitmapset.c +137 -94
  447. data/ext/pg_query/src_backend_nodes_copyfuncs.c +1 -1
  448. data/ext/pg_query/src_backend_nodes_equalfuncs.c +1 -1
  449. data/ext/pg_query/src_backend_nodes_extensible.c +1 -1
  450. data/ext/pg_query/src_backend_nodes_list.c +3 -7
  451. data/ext/pg_query/src_backend_nodes_makefuncs.c +59 -20
  452. data/ext/pg_query/src_backend_nodes_nodeFuncs.c +109 -2
  453. data/ext/pg_query/src_backend_nodes_value.c +1 -1
  454. data/ext/pg_query/src_backend_parser_gram.c +34490 -32135
  455. data/ext/pg_query/src_backend_parser_parser.c +8 -8
  456. data/ext/pg_query/src_backend_parser_scan.c +5637 -3028
  457. data/ext/pg_query/src_backend_parser_scansup.c +2 -1
  458. data/ext/pg_query/src_backend_storage_ipc_ipc.c +1 -1
  459. data/ext/pg_query/src_backend_tcop_postgres.c +34 -10
  460. data/ext/pg_query/src_backend_utils_activity_pgstat_database.c +2 -2
  461. data/ext/pg_query/src_backend_utils_adt_datum.c +8 -6
  462. data/ext/pg_query/src_backend_utils_adt_expandeddatum.c +1 -1
  463. data/ext/pg_query/src_backend_utils_adt_format_type.c +1 -1
  464. data/ext/pg_query/src_backend_utils_adt_numutils.c +4 -5
  465. data/ext/pg_query/src_backend_utils_adt_ruleutils.c +101 -28
  466. data/ext/pg_query/src_backend_utils_error_assert.c +1 -1
  467. data/ext/pg_query/src_backend_utils_error_elog.c +60 -190
  468. data/ext/pg_query/src_backend_utils_fmgr_fmgr.c +4 -2
  469. data/ext/pg_query/src_backend_utils_init_globals.c +16 -4
  470. data/ext/pg_query/src_backend_utils_mb_mbutils.c +19 -81
  471. data/ext/pg_query/src_backend_utils_misc_guc_tables.c +16 -8
  472. data/ext/pg_query/src_backend_utils_mmgr_alignedalloc.c +8 -5
  473. data/ext/pg_query/src_backend_utils_mmgr_aset.c +308 -238
  474. data/ext/pg_query/src_backend_utils_mmgr_bump.c +728 -0
  475. data/ext/pg_query/src_backend_utils_mmgr_generation.c +273 -197
  476. data/ext/pg_query/src_backend_utils_mmgr_mcxt.c +270 -215
  477. data/ext/pg_query/src_backend_utils_mmgr_slab.c +154 -96
  478. data/ext/pg_query/src_common_encnames.c +43 -44
  479. data/ext/pg_query/src_common_hashfn.c +1 -1
  480. data/ext/pg_query/src_common_keywords.c +1 -1
  481. data/ext/pg_query/src_common_kwlist_d.h +511 -466
  482. data/ext/pg_query/src_common_kwlookup.c +1 -1
  483. data/ext/pg_query/src_common_psprintf.c +3 -3
  484. data/ext/pg_query/src_common_stringinfo.c +18 -1
  485. data/ext/pg_query/src_common_wchar.c +45 -108
  486. data/ext/pg_query/src_pl_plpgsql_src_pl_comp.c +99 -5
  487. data/ext/pg_query/src_pl_plpgsql_src_pl_funcs.c +1 -1
  488. data/ext/pg_query/src_pl_plpgsql_src_pl_gram.c +242 -143
  489. data/ext/pg_query/src_pl_plpgsql_src_pl_handler.c +1 -1
  490. data/ext/pg_query/src_pl_plpgsql_src_pl_reserved_kwlist_d.h +1 -1
  491. data/ext/pg_query/src_pl_plpgsql_src_pl_scanner.c +19 -1
  492. data/ext/pg_query/src_pl_plpgsql_src_pl_unreserved_kwlist_d.h +1 -1
  493. data/ext/pg_query/src_port_pg_bitutils.c +251 -32
  494. data/ext/pg_query/src_port_pgstrcasecmp.c +29 -1
  495. data/ext/pg_query/src_port_snprintf.c +4 -4
  496. data/ext/pg_query/src_port_strerror.c +1 -3
  497. data/ext/pg_query/src_port_strlcpy.c +79 -0
  498. data/lib/pg_query/fingerprint.rb +2 -3
  499. data/lib/pg_query/node.rb +16 -11
  500. data/lib/pg_query/param_refs.rb +1 -1
  501. data/lib/pg_query/parse.rb +1 -1
  502. data/lib/pg_query/pg_query_pb.rb +26 -3
  503. data/lib/pg_query/treewalker.rb +52 -12
  504. data/lib/pg_query/truncate.rb +1 -1
  505. data/lib/pg_query/version.rb +1 -1
  506. metadata +444 -400
  507. data/ext/pg_query/guc-file.c +0 -0
  508. data/ext/pg_query/include/access/amapi.h +0 -292
  509. data/ext/pg_query/include/access/attmap.h +0 -54
  510. data/ext/pg_query/include/access/attnum.h +0 -64
  511. data/ext/pg_query/include/access/clog.h +0 -63
  512. data/ext/pg_query/include/access/commit_ts.h +0 -74
  513. data/ext/pg_query/include/access/detoast.h +0 -82
  514. data/ext/pg_query/include/access/genam.h +0 -233
  515. data/ext/pg_query/include/access/gin.h +0 -91
  516. data/ext/pg_query/include/access/htup.h +0 -89
  517. data/ext/pg_query/include/access/htup_details.h +0 -811
  518. data/ext/pg_query/include/access/itup.h +0 -170
  519. data/ext/pg_query/include/access/parallel.h +0 -82
  520. data/ext/pg_query/include/access/printtup.h +0 -35
  521. data/ext/pg_query/include/access/relation.h +0 -28
  522. data/ext/pg_query/include/access/relscan.h +0 -191
  523. data/ext/pg_query/include/access/rmgrlist.h +0 -49
  524. data/ext/pg_query/include/access/sdir.h +0 -67
  525. data/ext/pg_query/include/access/skey.h +0 -151
  526. data/ext/pg_query/include/access/stratnum.h +0 -85
  527. data/ext/pg_query/include/access/sysattr.h +0 -29
  528. data/ext/pg_query/include/access/table.h +0 -28
  529. data/ext/pg_query/include/access/tableam.h +0 -2100
  530. data/ext/pg_query/include/access/toast_compression.h +0 -73
  531. data/ext/pg_query/include/access/transam.h +0 -375
  532. data/ext/pg_query/include/access/tsmapi.h +0 -82
  533. data/ext/pg_query/include/access/tupconvert.h +0 -54
  534. data/ext/pg_query/include/access/tupdesc.h +0 -154
  535. data/ext/pg_query/include/access/tupmacs.h +0 -207
  536. data/ext/pg_query/include/access/twophase.h +0 -65
  537. data/ext/pg_query/include/access/xact.h +0 -530
  538. data/ext/pg_query/include/access/xlog.h +0 -302
  539. data/ext/pg_query/include/access/xlog_internal.h +0 -404
  540. data/ext/pg_query/include/access/xlogbackup.h +0 -41
  541. data/ext/pg_query/include/access/xlogdefs.h +0 -82
  542. data/ext/pg_query/include/access/xlogprefetcher.h +0 -55
  543. data/ext/pg_query/include/access/xlogreader.h +0 -444
  544. data/ext/pg_query/include/access/xlogrecord.h +0 -248
  545. data/ext/pg_query/include/access/xlogrecovery.h +0 -158
  546. data/ext/pg_query/include/archive/archive_module.h +0 -59
  547. data/ext/pg_query/include/c.h +0 -1379
  548. data/ext/pg_query/include/catalog/catalog.h +0 -45
  549. data/ext/pg_query/include/catalog/catversion.h +0 -62
  550. data/ext/pg_query/include/catalog/dependency.h +0 -270
  551. data/ext/pg_query/include/catalog/genbki.h +0 -143
  552. data/ext/pg_query/include/catalog/index.h +0 -214
  553. data/ext/pg_query/include/catalog/indexing.h +0 -54
  554. data/ext/pg_query/include/catalog/namespace.h +0 -190
  555. data/ext/pg_query/include/catalog/objectaccess.h +0 -267
  556. data/ext/pg_query/include/catalog/objectaddress.h +0 -89
  557. data/ext/pg_query/include/catalog/pg_aggregate.h +0 -180
  558. data/ext/pg_query/include/catalog/pg_aggregate_d.h +0 -78
  559. data/ext/pg_query/include/catalog/pg_am.h +0 -63
  560. data/ext/pg_query/include/catalog/pg_am_d.h +0 -47
  561. data/ext/pg_query/include/catalog/pg_attribute.h +0 -223
  562. data/ext/pg_query/include/catalog/pg_attribute_d.h +0 -62
  563. data/ext/pg_query/include/catalog/pg_authid.h +0 -63
  564. data/ext/pg_query/include/catalog/pg_authid_d.h +0 -59
  565. data/ext/pg_query/include/catalog/pg_class.h +0 -230
  566. data/ext/pg_query/include/catalog/pg_class_d.h +0 -132
  567. data/ext/pg_query/include/catalog/pg_collation.h +0 -100
  568. data/ext/pg_query/include/catalog/pg_collation_d.h +0 -63
  569. data/ext/pg_query/include/catalog/pg_constraint.h +0 -273
  570. data/ext/pg_query/include/catalog/pg_constraint_d.h +0 -73
  571. data/ext/pg_query/include/catalog/pg_control.h +0 -258
  572. data/ext/pg_query/include/catalog/pg_conversion.h +0 -75
  573. data/ext/pg_query/include/catalog/pg_conversion_d.h +0 -38
  574. data/ext/pg_query/include/catalog/pg_database.h +0 -124
  575. data/ext/pg_query/include/catalog/pg_database_d.h +0 -52
  576. data/ext/pg_query/include/catalog/pg_depend.h +0 -77
  577. data/ext/pg_query/include/catalog/pg_depend_d.h +0 -36
  578. data/ext/pg_query/include/catalog/pg_event_trigger.h +0 -57
  579. data/ext/pg_query/include/catalog/pg_event_trigger_d.h +0 -36
  580. data/ext/pg_query/include/catalog/pg_index.h +0 -90
  581. data/ext/pg_query/include/catalog/pg_index_d.h +0 -59
  582. data/ext/pg_query/include/catalog/pg_language.h +0 -72
  583. data/ext/pg_query/include/catalog/pg_language_d.h +0 -41
  584. data/ext/pg_query/include/catalog/pg_namespace.h +0 -64
  585. data/ext/pg_query/include/catalog/pg_namespace_d.h +0 -36
  586. data/ext/pg_query/include/catalog/pg_opclass.h +0 -88
  587. data/ext/pg_query/include/catalog/pg_opclass_d.h +0 -51
  588. data/ext/pg_query/include/catalog/pg_operator.h +0 -107
  589. data/ext/pg_query/include/catalog/pg_operator_d.h +0 -142
  590. data/ext/pg_query/include/catalog/pg_opfamily.h +0 -64
  591. data/ext/pg_query/include/catalog/pg_opfamily_d.h +0 -51
  592. data/ext/pg_query/include/catalog/pg_partitioned_table.h +0 -74
  593. data/ext/pg_query/include/catalog/pg_partitioned_table_d.h +0 -36
  594. data/ext/pg_query/include/catalog/pg_proc.h +0 -220
  595. data/ext/pg_query/include/catalog/pg_proc_d.h +0 -101
  596. data/ext/pg_query/include/catalog/pg_publication.h +0 -158
  597. data/ext/pg_query/include/catalog/pg_publication_d.h +0 -38
  598. data/ext/pg_query/include/catalog/pg_replication_origin.h +0 -62
  599. data/ext/pg_query/include/catalog/pg_replication_origin_d.h +0 -33
  600. data/ext/pg_query/include/catalog/pg_statistic.h +0 -282
  601. data/ext/pg_query/include/catalog/pg_statistic_d.h +0 -195
  602. data/ext/pg_query/include/catalog/pg_statistic_ext.h +0 -88
  603. data/ext/pg_query/include/catalog/pg_statistic_ext_d.h +0 -45
  604. data/ext/pg_query/include/catalog/pg_transform.h +0 -48
  605. data/ext/pg_query/include/catalog/pg_transform_d.h +0 -34
  606. data/ext/pg_query/include/catalog/pg_trigger.h +0 -153
  607. data/ext/pg_query/include/catalog/pg_trigger_d.h +0 -109
  608. data/ext/pg_query/include/catalog/pg_ts_config.h +0 -53
  609. data/ext/pg_query/include/catalog/pg_ts_config_d.h +0 -34
  610. data/ext/pg_query/include/catalog/pg_ts_dict.h +0 -59
  611. data/ext/pg_query/include/catalog/pg_ts_dict_d.h +0 -35
  612. data/ext/pg_query/include/catalog/pg_ts_parser.h +0 -60
  613. data/ext/pg_query/include/catalog/pg_ts_parser_d.h +0 -37
  614. data/ext/pg_query/include/catalog/pg_ts_template.h +0 -51
  615. data/ext/pg_query/include/catalog/pg_ts_template_d.h +0 -34
  616. data/ext/pg_query/include/catalog/pg_type.h +0 -404
  617. data/ext/pg_query/include/catalog/pg_type_d.h +0 -324
  618. data/ext/pg_query/include/catalog/storage.h +0 -50
  619. data/ext/pg_query/include/commands/async.h +0 -53
  620. data/ext/pg_query/include/commands/dbcommands.h +0 -37
  621. data/ext/pg_query/include/commands/defrem.h +0 -161
  622. data/ext/pg_query/include/commands/event_trigger.h +0 -88
  623. data/ext/pg_query/include/commands/explain.h +0 -129
  624. data/ext/pg_query/include/commands/prepare.h +0 -61
  625. data/ext/pg_query/include/commands/tablespace.h +0 -69
  626. data/ext/pg_query/include/commands/trigger.h +0 -288
  627. data/ext/pg_query/include/commands/vacuum.h +0 -386
  628. data/ext/pg_query/include/common/cryptohash.h +0 -39
  629. data/ext/pg_query/include/common/file_perm.h +0 -56
  630. data/ext/pg_query/include/common/hashfn.h +0 -104
  631. data/ext/pg_query/include/common/int.h +0 -437
  632. data/ext/pg_query/include/common/ip.h +0 -33
  633. data/ext/pg_query/include/common/keywords.h +0 -29
  634. data/ext/pg_query/include/common/kwlookup.h +0 -44
  635. data/ext/pg_query/include/common/pg_prng.h +0 -61
  636. data/ext/pg_query/include/common/relpath.h +0 -97
  637. data/ext/pg_query/include/common/scram-common.h +0 -70
  638. data/ext/pg_query/include/common/sha2.h +0 -32
  639. data/ext/pg_query/include/common/string.h +0 -44
  640. data/ext/pg_query/include/common/unicode_east_asian_fw_table.h +0 -125
  641. data/ext/pg_query/include/copyfuncs.funcs.c +0 -5013
  642. data/ext/pg_query/include/copyfuncs.switch.c +0 -938
  643. data/ext/pg_query/include/datatype/timestamp.h +0 -243
  644. data/ext/pg_query/include/equalfuncs.funcs.c +0 -3097
  645. data/ext/pg_query/include/equalfuncs.switch.c +0 -785
  646. data/ext/pg_query/include/executor/execdesc.h +0 -70
  647. data/ext/pg_query/include/executor/executor.h +0 -680
  648. data/ext/pg_query/include/executor/functions.h +0 -55
  649. data/ext/pg_query/include/executor/instrument.h +0 -118
  650. data/ext/pg_query/include/executor/spi.h +0 -213
  651. data/ext/pg_query/include/executor/tablefunc.h +0 -67
  652. data/ext/pg_query/include/executor/tuptable.h +0 -494
  653. data/ext/pg_query/include/fmgr.h +0 -800
  654. data/ext/pg_query/include/foreign/fdwapi.h +0 -294
  655. data/ext/pg_query/include/funcapi.h +0 -360
  656. data/ext/pg_query/include/gram.h +0 -1127
  657. data/ext/pg_query/include/gramparse.h +0 -75
  658. data/ext/pg_query/include/jit/jit.h +0 -105
  659. data/ext/pg_query/include/kwlist_d.h +0 -1119
  660. data/ext/pg_query/include/lib/dshash.h +0 -115
  661. data/ext/pg_query/include/lib/ilist.h +0 -1159
  662. data/ext/pg_query/include/lib/pairingheap.h +0 -102
  663. data/ext/pg_query/include/lib/simplehash.h +0 -1184
  664. data/ext/pg_query/include/lib/sort_template.h +0 -432
  665. data/ext/pg_query/include/lib/stringinfo.h +0 -161
  666. data/ext/pg_query/include/libpq/auth.h +0 -37
  667. data/ext/pg_query/include/libpq/crypt.h +0 -47
  668. data/ext/pg_query/include/libpq/hba.h +0 -186
  669. data/ext/pg_query/include/libpq/libpq-be.h +0 -354
  670. data/ext/pg_query/include/libpq/libpq.h +0 -144
  671. data/ext/pg_query/include/libpq/pqcomm.h +0 -163
  672. data/ext/pg_query/include/libpq/pqformat.h +0 -210
  673. data/ext/pg_query/include/libpq/pqsignal.h +0 -54
  674. data/ext/pg_query/include/libpq/sasl.h +0 -136
  675. data/ext/pg_query/include/libpq/scram.h +0 -37
  676. data/ext/pg_query/include/mb/pg_wchar.h +0 -772
  677. data/ext/pg_query/include/mb/stringinfo_mb.h +0 -24
  678. data/ext/pg_query/include/miscadmin.h +0 -507
  679. data/ext/pg_query/include/nodes/bitmapset.h +0 -126
  680. data/ext/pg_query/include/nodes/execnodes.h +0 -2768
  681. data/ext/pg_query/include/nodes/extensible.h +0 -164
  682. data/ext/pg_query/include/nodes/lockoptions.h +0 -61
  683. data/ext/pg_query/include/nodes/makefuncs.h +0 -121
  684. data/ext/pg_query/include/nodes/memnodes.h +0 -113
  685. data/ext/pg_query/include/nodes/miscnodes.h +0 -56
  686. data/ext/pg_query/include/nodes/nodeFuncs.h +0 -222
  687. data/ext/pg_query/include/nodes/nodes.h +0 -446
  688. data/ext/pg_query/include/nodes/nodetags.h +0 -471
  689. data/ext/pg_query/include/nodes/params.h +0 -170
  690. data/ext/pg_query/include/nodes/parsenodes.h +0 -4050
  691. data/ext/pg_query/include/nodes/pathnodes.h +0 -3384
  692. data/ext/pg_query/include/nodes/pg_list.h +0 -635
  693. data/ext/pg_query/include/nodes/plannodes.h +0 -1592
  694. data/ext/pg_query/include/nodes/primnodes.h +0 -2041
  695. data/ext/pg_query/include/nodes/print.h +0 -34
  696. data/ext/pg_query/include/nodes/queryjumble.h +0 -86
  697. data/ext/pg_query/include/nodes/replnodes.h +0 -111
  698. data/ext/pg_query/include/nodes/supportnodes.h +0 -346
  699. data/ext/pg_query/include/nodes/tidbitmap.h +0 -75
  700. data/ext/pg_query/include/nodes/value.h +0 -90
  701. data/ext/pg_query/include/optimizer/cost.h +0 -215
  702. data/ext/pg_query/include/optimizer/geqo.h +0 -90
  703. data/ext/pg_query/include/optimizer/geqo_gene.h +0 -45
  704. data/ext/pg_query/include/optimizer/optimizer.h +0 -202
  705. data/ext/pg_query/include/optimizer/paths.h +0 -266
  706. data/ext/pg_query/include/optimizer/planmain.h +0 -117
  707. data/ext/pg_query/include/parser/analyze.h +0 -64
  708. data/ext/pg_query/include/parser/kwlist.h +0 -498
  709. data/ext/pg_query/include/parser/parse_agg.h +0 -65
  710. data/ext/pg_query/include/parser/parse_coerce.h +0 -102
  711. data/ext/pg_query/include/parser/parse_expr.h +0 -25
  712. data/ext/pg_query/include/parser/parse_func.h +0 -74
  713. data/ext/pg_query/include/parser/parse_node.h +0 -357
  714. data/ext/pg_query/include/parser/parse_oper.h +0 -65
  715. data/ext/pg_query/include/parser/parse_relation.h +0 -129
  716. data/ext/pg_query/include/parser/parse_type.h +0 -61
  717. data/ext/pg_query/include/parser/parser.h +0 -68
  718. data/ext/pg_query/include/parser/parsetree.h +0 -61
  719. data/ext/pg_query/include/parser/scanner.h +0 -152
  720. data/ext/pg_query/include/parser/scansup.h +0 -27
  721. data/ext/pg_query/include/partitioning/partdefs.h +0 -26
  722. data/ext/pg_query/include/pg_config.h +0 -843
  723. data/ext/pg_query/include/pg_config_manual.h +0 -372
  724. data/ext/pg_query/include/pg_config_os.h +0 -8
  725. data/ext/pg_query/include/pg_getopt.h +0 -56
  726. data/ext/pg_query/include/pg_trace.h +0 -17
  727. data/ext/pg_query/include/pgstat.h +0 -778
  728. data/ext/pg_query/include/pgtime.h +0 -94
  729. data/ext/pg_query/include/pl_gram.h +0 -385
  730. data/ext/pg_query/include/pl_reserved_kwlist.h +0 -52
  731. data/ext/pg_query/include/pl_reserved_kwlist_d.h +0 -114
  732. data/ext/pg_query/include/pl_unreserved_kwlist.h +0 -112
  733. data/ext/pg_query/include/pl_unreserved_kwlist_d.h +0 -246
  734. data/ext/pg_query/include/plerrcodes.h +0 -998
  735. data/ext/pg_query/include/plpgsql.h +0 -1340
  736. data/ext/pg_query/include/port/atomics/arch-arm.h +0 -32
  737. data/ext/pg_query/include/port/atomics/arch-ppc.h +0 -254
  738. data/ext/pg_query/include/port/atomics/arch-x86.h +0 -252
  739. data/ext/pg_query/include/port/atomics/fallback.h +0 -170
  740. data/ext/pg_query/include/port/atomics/generic-gcc.h +0 -286
  741. data/ext/pg_query/include/port/atomics/generic.h +0 -401
  742. data/ext/pg_query/include/port/atomics.h +0 -519
  743. data/ext/pg_query/include/port/pg_bitutils.h +0 -339
  744. data/ext/pg_query/include/port/pg_bswap.h +0 -161
  745. data/ext/pg_query/include/port/pg_crc32c.h +0 -101
  746. data/ext/pg_query/include/port/simd.h +0 -375
  747. data/ext/pg_query/include/port.h +0 -520
  748. data/ext/pg_query/include/portability/instr_time.h +0 -197
  749. data/ext/pg_query/include/postgres.h +0 -579
  750. data/ext/pg_query/include/postmaster/autovacuum.h +0 -80
  751. data/ext/pg_query/include/postmaster/auxprocess.h +0 -20
  752. data/ext/pg_query/include/postmaster/bgworker.h +0 -162
  753. data/ext/pg_query/include/postmaster/bgworker_internals.h +0 -64
  754. data/ext/pg_query/include/postmaster/bgwriter.h +0 -45
  755. data/ext/pg_query/include/postmaster/fork_process.h +0 -17
  756. data/ext/pg_query/include/postmaster/interrupt.h +0 -32
  757. data/ext/pg_query/include/postmaster/pgarch.h +0 -36
  758. data/ext/pg_query/include/postmaster/postmaster.h +0 -81
  759. data/ext/pg_query/include/postmaster/startup.h +0 -41
  760. data/ext/pg_query/include/postmaster/syslogger.h +0 -103
  761. data/ext/pg_query/include/postmaster/walwriter.h +0 -23
  762. data/ext/pg_query/include/regex/regex.h +0 -189
  763. data/ext/pg_query/include/replication/logicallauncher.h +0 -34
  764. data/ext/pg_query/include/replication/logicalproto.h +0 -274
  765. data/ext/pg_query/include/replication/logicalworker.h +0 -32
  766. data/ext/pg_query/include/replication/origin.h +0 -73
  767. data/ext/pg_query/include/replication/reorderbuffer.h +0 -753
  768. data/ext/pg_query/include/replication/slot.h +0 -249
  769. data/ext/pg_query/include/replication/syncrep.h +0 -109
  770. data/ext/pg_query/include/replication/walreceiver.h +0 -478
  771. data/ext/pg_query/include/replication/walsender.h +0 -74
  772. data/ext/pg_query/include/rewrite/prs2lock.h +0 -46
  773. data/ext/pg_query/include/rewrite/rewriteHandler.h +0 -35
  774. data/ext/pg_query/include/rewrite/rewriteManip.h +0 -96
  775. data/ext/pg_query/include/rewrite/rewriteSupport.h +0 -26
  776. data/ext/pg_query/include/src_backend_nodes_copyfuncs.funcs.c +0 -5321
  777. data/ext/pg_query/include/src_backend_nodes_equalfuncs.funcs.c +0 -3354
  778. data/ext/pg_query/include/storage/backendid.h +0 -37
  779. data/ext/pg_query/include/storage/block.h +0 -108
  780. data/ext/pg_query/include/storage/buf.h +0 -46
  781. data/ext/pg_query/include/storage/bufmgr.h +0 -393
  782. data/ext/pg_query/include/storage/bufpage.h +0 -510
  783. data/ext/pg_query/include/storage/condition_variable.h +0 -73
  784. data/ext/pg_query/include/storage/dsm.h +0 -61
  785. data/ext/pg_query/include/storage/dsm_impl.h +0 -79
  786. data/ext/pg_query/include/storage/fd.h +0 -202
  787. data/ext/pg_query/include/storage/fileset.h +0 -40
  788. data/ext/pg_query/include/storage/ipc.h +0 -84
  789. data/ext/pg_query/include/storage/item.h +0 -19
  790. data/ext/pg_query/include/storage/itemid.h +0 -184
  791. data/ext/pg_query/include/storage/itemptr.h +0 -245
  792. data/ext/pg_query/include/storage/large_object.h +0 -100
  793. data/ext/pg_query/include/storage/latch.h +0 -194
  794. data/ext/pg_query/include/storage/lmgr.h +0 -120
  795. data/ext/pg_query/include/storage/lock.h +0 -624
  796. data/ext/pg_query/include/storage/lockdefs.h +0 -59
  797. data/ext/pg_query/include/storage/lwlock.h +0 -220
  798. data/ext/pg_query/include/storage/lwlocknames.h +0 -50
  799. data/ext/pg_query/include/storage/off.h +0 -57
  800. data/ext/pg_query/include/storage/pg_sema.h +0 -61
  801. data/ext/pg_query/include/storage/pg_shmem.h +0 -92
  802. data/ext/pg_query/include/storage/pmsignal.h +0 -105
  803. data/ext/pg_query/include/storage/predicate.h +0 -87
  804. data/ext/pg_query/include/storage/proc.h +0 -466
  805. data/ext/pg_query/include/storage/procarray.h +0 -99
  806. data/ext/pg_query/include/storage/proclist_types.h +0 -51
  807. data/ext/pg_query/include/storage/procsignal.h +0 -73
  808. data/ext/pg_query/include/storage/relfilelocator.h +0 -99
  809. data/ext/pg_query/include/storage/s_lock.h +0 -867
  810. data/ext/pg_query/include/storage/sharedfileset.h +0 -37
  811. data/ext/pg_query/include/storage/shm_mq.h +0 -86
  812. data/ext/pg_query/include/storage/shm_toc.h +0 -58
  813. data/ext/pg_query/include/storage/shmem.h +0 -59
  814. data/ext/pg_query/include/storage/sinval.h +0 -153
  815. data/ext/pg_query/include/storage/sinvaladt.h +0 -45
  816. data/ext/pg_query/include/storage/smgr.h +0 -113
  817. data/ext/pg_query/include/storage/spin.h +0 -77
  818. data/ext/pg_query/include/storage/standby.h +0 -99
  819. data/ext/pg_query/include/storage/standbydefs.h +0 -74
  820. data/ext/pg_query/include/storage/sync.h +0 -66
  821. data/ext/pg_query/include/tcop/cmdtag.h +0 -63
  822. data/ext/pg_query/include/tcop/cmdtaglist.h +0 -218
  823. data/ext/pg_query/include/tcop/deparse_utility.h +0 -108
  824. data/ext/pg_query/include/tcop/dest.h +0 -147
  825. data/ext/pg_query/include/tcop/fastpath.h +0 -20
  826. data/ext/pg_query/include/tcop/pquery.h +0 -51
  827. data/ext/pg_query/include/tcop/tcopprot.h +0 -94
  828. data/ext/pg_query/include/tcop/utility.h +0 -112
  829. data/ext/pg_query/include/tsearch/ts_cache.h +0 -96
  830. data/ext/pg_query/include/utils/acl.h +0 -278
  831. data/ext/pg_query/include/utils/aclchk_internal.h +0 -45
  832. data/ext/pg_query/include/utils/array.h +0 -482
  833. data/ext/pg_query/include/utils/backend_progress.h +0 -45
  834. data/ext/pg_query/include/utils/backend_status.h +0 -342
  835. data/ext/pg_query/include/utils/builtins.h +0 -136
  836. data/ext/pg_query/include/utils/bytea.h +0 -28
  837. data/ext/pg_query/include/utils/catcache.h +0 -231
  838. data/ext/pg_query/include/utils/date.h +0 -118
  839. data/ext/pg_query/include/utils/datetime.h +0 -364
  840. data/ext/pg_query/include/utils/datum.h +0 -76
  841. data/ext/pg_query/include/utils/dsa.h +0 -127
  842. data/ext/pg_query/include/utils/elog.h +0 -545
  843. data/ext/pg_query/include/utils/errcodes.h +0 -354
  844. data/ext/pg_query/include/utils/expandeddatum.h +0 -170
  845. data/ext/pg_query/include/utils/expandedrecord.h +0 -241
  846. data/ext/pg_query/include/utils/float.h +0 -357
  847. data/ext/pg_query/include/utils/fmgroids.h +0 -3314
  848. data/ext/pg_query/include/utils/fmgrprotos.h +0 -2871
  849. data/ext/pg_query/include/utils/fmgrtab.h +0 -49
  850. data/ext/pg_query/include/utils/guc.h +0 -442
  851. data/ext/pg_query/include/utils/guc_hooks.h +0 -163
  852. data/ext/pg_query/include/utils/guc_tables.h +0 -322
  853. data/ext/pg_query/include/utils/hsearch.h +0 -153
  854. data/ext/pg_query/include/utils/inval.h +0 -68
  855. data/ext/pg_query/include/utils/logtape.h +0 -77
  856. data/ext/pg_query/include/utils/lsyscache.h +0 -212
  857. data/ext/pg_query/include/utils/memdebug.h +0 -82
  858. data/ext/pg_query/include/utils/memutils.h +0 -186
  859. data/ext/pg_query/include/utils/memutils_internal.h +0 -136
  860. data/ext/pg_query/include/utils/memutils_memorychunk.h +0 -237
  861. data/ext/pg_query/include/utils/numeric.h +0 -105
  862. data/ext/pg_query/include/utils/palloc.h +0 -165
  863. data/ext/pg_query/include/utils/partcache.h +0 -103
  864. data/ext/pg_query/include/utils/pg_locale.h +0 -135
  865. data/ext/pg_query/include/utils/pgstat_internal.h +0 -814
  866. data/ext/pg_query/include/utils/pidfile.h +0 -56
  867. data/ext/pg_query/include/utils/plancache.h +0 -236
  868. data/ext/pg_query/include/utils/portal.h +0 -252
  869. data/ext/pg_query/include/utils/queryenvironment.h +0 -74
  870. data/ext/pg_query/include/utils/regproc.h +0 -39
  871. data/ext/pg_query/include/utils/rel.h +0 -712
  872. data/ext/pg_query/include/utils/relcache.h +0 -158
  873. data/ext/pg_query/include/utils/reltrigger.h +0 -81
  874. data/ext/pg_query/include/utils/resowner.h +0 -86
  875. data/ext/pg_query/include/utils/ruleutils.h +0 -52
  876. data/ext/pg_query/include/utils/sharedtuplestore.h +0 -61
  877. data/ext/pg_query/include/utils/snapmgr.h +0 -181
  878. data/ext/pg_query/include/utils/snapshot.h +0 -219
  879. data/ext/pg_query/include/utils/sortsupport.h +0 -391
  880. data/ext/pg_query/include/utils/syscache.h +0 -227
  881. data/ext/pg_query/include/utils/timeout.h +0 -95
  882. data/ext/pg_query/include/utils/timestamp.h +0 -147
  883. data/ext/pg_query/include/utils/tuplesort.h +0 -445
  884. data/ext/pg_query/include/utils/tuplestore.h +0 -91
  885. data/ext/pg_query/include/utils/typcache.h +0 -209
  886. data/ext/pg_query/include/utils/varlena.h +0 -53
  887. data/ext/pg_query/include/utils/wait_event.h +0 -294
  888. data/ext/pg_query/include/utils/xml.h +0 -94
  889. data/ext/pg_query/include/varatt.h +0 -358
  890. data/ext/pg_query/src_backend_postmaster_postmaster.c +0 -2220
  891. data/ext/pg_query/src_port_strnlen.c +0 -39
  892. /data/ext/pg_query/include/{access → postgres/access}/rmgr.h +0 -0
  893. /data/ext/pg_query/include/{commands → postgres/commands}/user.h +0 -0
  894. /data/ext/pg_query/include/{common → postgres/common}/unicode_nonspacing_table.h +0 -0
  895. /data/ext/pg_query/include/{pg_config_ext.h → postgres/pg_config_ext.h} +0 -0
  896. /data/ext/pg_query/include/{postgres_ext.h → postgres/postgres_ext.h} +0 -0
  897. /data/ext/pg_query/include/{utils → postgres/utils}/probes.h +0 -0
  898. /data/ext/pg_query/include/{utils → postgres/utils}/ps_status.h +0 -0
@@ -1,3384 +0,0 @@
1
- /*-------------------------------------------------------------------------
2
- *
3
- * pathnodes.h
4
- * Definitions for planner's internal data structures, especially Paths.
5
- *
6
- * We don't support copying RelOptInfo, IndexOptInfo, or Path nodes.
7
- * There are some subsidiary structs that are useful to copy, though.
8
- *
9
- * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group
10
- * Portions Copyright (c) 1994, Regents of the University of California
11
- *
12
- * src/include/nodes/pathnodes.h
13
- *
14
- *-------------------------------------------------------------------------
15
- */
16
- #ifndef PATHNODES_H
17
- #define PATHNODES_H
18
-
19
- #include "access/sdir.h"
20
- #include "lib/stringinfo.h"
21
- #include "nodes/params.h"
22
- #include "nodes/parsenodes.h"
23
- #include "storage/block.h"
24
-
25
-
26
- /*
27
- * Relids
28
- * Set of relation identifiers (indexes into the rangetable).
29
- */
30
- typedef Bitmapset *Relids;
31
-
32
- /*
33
- * When looking for a "cheapest path", this enum specifies whether we want
34
- * cheapest startup cost or cheapest total cost.
35
- */
36
- typedef enum CostSelector
37
- {
38
- STARTUP_COST, TOTAL_COST
39
- } CostSelector;
40
-
41
- /*
42
- * The cost estimate produced by cost_qual_eval() includes both a one-time
43
- * (startup) cost, and a per-tuple cost.
44
- */
45
- typedef struct QualCost
46
- {
47
- Cost startup; /* one-time cost */
48
- Cost per_tuple; /* per-evaluation cost */
49
- } QualCost;
50
-
51
- /*
52
- * Costing aggregate function execution requires these statistics about
53
- * the aggregates to be executed by a given Agg node. Note that the costs
54
- * include the execution costs of the aggregates' argument expressions as
55
- * well as the aggregate functions themselves. Also, the fields must be
56
- * defined so that initializing the struct to zeroes with memset is correct.
57
- */
58
- typedef struct AggClauseCosts
59
- {
60
- QualCost transCost; /* total per-input-row execution costs */
61
- QualCost finalCost; /* total per-aggregated-row costs */
62
- Size transitionSpace; /* space for pass-by-ref transition data */
63
- } AggClauseCosts;
64
-
65
- /*
66
- * This enum identifies the different types of "upper" (post-scan/join)
67
- * relations that we might deal with during planning.
68
- */
69
- typedef enum UpperRelationKind
70
- {
71
- UPPERREL_SETOP, /* result of UNION/INTERSECT/EXCEPT, if any */
72
- UPPERREL_PARTIAL_GROUP_AGG, /* result of partial grouping/aggregation, if
73
- * any */
74
- UPPERREL_GROUP_AGG, /* result of grouping/aggregation, if any */
75
- UPPERREL_WINDOW, /* result of window functions, if any */
76
- UPPERREL_PARTIAL_DISTINCT, /* result of partial "SELECT DISTINCT", if any */
77
- UPPERREL_DISTINCT, /* result of "SELECT DISTINCT", if any */
78
- UPPERREL_ORDERED, /* result of ORDER BY, if any */
79
- UPPERREL_FINAL /* result of any remaining top-level actions */
80
- /* NB: UPPERREL_FINAL must be last enum entry; it's used to size arrays */
81
- } UpperRelationKind;
82
-
83
- /*----------
84
- * PlannerGlobal
85
- * Global information for planning/optimization
86
- *
87
- * PlannerGlobal holds state for an entire planner invocation; this state
88
- * is shared across all levels of sub-Queries that exist in the command being
89
- * planned.
90
- *
91
- * Not all fields are printed. (In some cases, there is no print support for
92
- * the field type; in others, doing so would lead to infinite recursion.)
93
- *----------
94
- */
95
- typedef struct PlannerGlobal
96
- {
97
- pg_node_attr(no_copy_equal, no_read, no_query_jumble)
98
-
99
- NodeTag type;
100
-
101
- /* Param values provided to planner() */
102
- ParamListInfo boundParams pg_node_attr(read_write_ignore);
103
-
104
- /* Plans for SubPlan nodes */
105
- List *subplans;
106
-
107
- /* PlannerInfos for SubPlan nodes */
108
- List *subroots pg_node_attr(read_write_ignore);
109
-
110
- /* indices of subplans that require REWIND */
111
- Bitmapset *rewindPlanIDs;
112
-
113
- /* "flat" rangetable for executor */
114
- List *finalrtable;
115
-
116
- /* "flat" list of RTEPermissionInfos */
117
- List *finalrteperminfos;
118
-
119
- /* "flat" list of PlanRowMarks */
120
- List *finalrowmarks;
121
-
122
- /* "flat" list of integer RT indexes */
123
- List *resultRelations;
124
-
125
- /* "flat" list of AppendRelInfos */
126
- List *appendRelations;
127
-
128
- /* OIDs of relations the plan depends on */
129
- List *relationOids;
130
-
131
- /* other dependencies, as PlanInvalItems */
132
- List *invalItems;
133
-
134
- /* type OIDs for PARAM_EXEC Params */
135
- List *paramExecTypes;
136
-
137
- /* highest PlaceHolderVar ID assigned */
138
- Index lastPHId;
139
-
140
- /* highest PlanRowMark ID assigned */
141
- Index lastRowMarkId;
142
-
143
- /* highest plan node ID assigned */
144
- int lastPlanNodeId;
145
-
146
- /* redo plan when TransactionXmin changes? */
147
- bool transientPlan;
148
-
149
- /* is plan specific to current role? */
150
- bool dependsOnRole;
151
-
152
- /* parallel mode potentially OK? */
153
- bool parallelModeOK;
154
-
155
- /* parallel mode actually required? */
156
- bool parallelModeNeeded;
157
-
158
- /* worst PROPARALLEL hazard level */
159
- char maxParallelHazard;
160
-
161
- /* partition descriptors */
162
- PartitionDirectory partition_directory pg_node_attr(read_write_ignore);
163
- } PlannerGlobal;
164
-
165
- /* macro for fetching the Plan associated with a SubPlan node */
166
- #define planner_subplan_get_plan(root, subplan) \
167
- ((Plan *) list_nth((root)->glob->subplans, (subplan)->plan_id - 1))
168
-
169
-
170
- /*----------
171
- * PlannerInfo
172
- * Per-query information for planning/optimization
173
- *
174
- * This struct is conventionally called "root" in all the planner routines.
175
- * It holds links to all of the planner's working state, in addition to the
176
- * original Query. Note that at present the planner extensively modifies
177
- * the passed-in Query data structure; someday that should stop.
178
- *
179
- * For reasons explained in optimizer/optimizer.h, we define the typedef
180
- * either here or in that header, whichever is read first.
181
- *
182
- * Not all fields are printed. (In some cases, there is no print support for
183
- * the field type; in others, doing so would lead to infinite recursion or
184
- * bloat dump output more than seems useful.)
185
- *----------
186
- */
187
- #ifndef HAVE_PLANNERINFO_TYPEDEF
188
- typedef struct PlannerInfo PlannerInfo;
189
- #define HAVE_PLANNERINFO_TYPEDEF 1
190
- #endif
191
-
192
- struct PlannerInfo
193
- {
194
- pg_node_attr(no_copy_equal, no_read, no_query_jumble)
195
-
196
- NodeTag type;
197
-
198
- /* the Query being planned */
199
- Query *parse;
200
-
201
- /* global info for current planner run */
202
- PlannerGlobal *glob;
203
-
204
- /* 1 at the outermost Query */
205
- Index query_level;
206
-
207
- /* NULL at outermost Query */
208
- PlannerInfo *parent_root pg_node_attr(read_write_ignore);
209
-
210
- /*
211
- * plan_params contains the expressions that this query level needs to
212
- * make available to a lower query level that is currently being planned.
213
- * outer_params contains the paramIds of PARAM_EXEC Params that outer
214
- * query levels will make available to this query level.
215
- */
216
- /* list of PlannerParamItems, see below */
217
- List *plan_params;
218
- Bitmapset *outer_params;
219
-
220
- /*
221
- * simple_rel_array holds pointers to "base rels" and "other rels" (see
222
- * comments for RelOptInfo for more info). It is indexed by rangetable
223
- * index (so entry 0 is always wasted). Entries can be NULL when an RTE
224
- * does not correspond to a base relation, such as a join RTE or an
225
- * unreferenced view RTE; or if the RelOptInfo hasn't been made yet.
226
- */
227
- struct RelOptInfo **simple_rel_array pg_node_attr(array_size(simple_rel_array_size));
228
- /* allocated size of array */
229
- int simple_rel_array_size;
230
-
231
- /*
232
- * simple_rte_array is the same length as simple_rel_array and holds
233
- * pointers to the associated rangetable entries. Using this is a shade
234
- * faster than using rt_fetch(), mostly due to fewer indirections. (Not
235
- * printed because it'd be redundant with parse->rtable.)
236
- */
237
- RangeTblEntry **simple_rte_array pg_node_attr(read_write_ignore);
238
-
239
- /*
240
- * append_rel_array is the same length as the above arrays, and holds
241
- * pointers to the corresponding AppendRelInfo entry indexed by
242
- * child_relid, or NULL if the rel is not an appendrel child. The array
243
- * itself is not allocated if append_rel_list is empty. (Not printed
244
- * because it'd be redundant with append_rel_list.)
245
- */
246
- struct AppendRelInfo **append_rel_array pg_node_attr(read_write_ignore);
247
-
248
- /*
249
- * all_baserels is a Relids set of all base relids (but not joins or
250
- * "other" rels) in the query. This is computed in deconstruct_jointree.
251
- */
252
- Relids all_baserels;
253
-
254
- /*
255
- * outer_join_rels is a Relids set of all outer-join relids in the query.
256
- * This is computed in deconstruct_jointree.
257
- */
258
- Relids outer_join_rels;
259
-
260
- /*
261
- * all_query_rels is a Relids set of all base relids and outer join relids
262
- * (but not "other" relids) in the query. This is the Relids identifier
263
- * of the final join we need to form. This is computed in
264
- * deconstruct_jointree.
265
- */
266
- Relids all_query_rels;
267
-
268
- /*
269
- * join_rel_list is a list of all join-relation RelOptInfos we have
270
- * considered in this planning run. For small problems we just scan the
271
- * list to do lookups, but when there are many join relations we build a
272
- * hash table for faster lookups. The hash table is present and valid
273
- * when join_rel_hash is not NULL. Note that we still maintain the list
274
- * even when using the hash table for lookups; this simplifies life for
275
- * GEQO.
276
- */
277
- List *join_rel_list;
278
- struct HTAB *join_rel_hash pg_node_attr(read_write_ignore);
279
-
280
- /*
281
- * When doing a dynamic-programming-style join search, join_rel_level[k]
282
- * is a list of all join-relation RelOptInfos of level k, and
283
- * join_cur_level is the current level. New join-relation RelOptInfos are
284
- * automatically added to the join_rel_level[join_cur_level] list.
285
- * join_rel_level is NULL if not in use.
286
- *
287
- * Note: we've already printed all baserel and joinrel RelOptInfos above,
288
- * so we don't dump join_rel_level or other lists of RelOptInfos.
289
- */
290
- /* lists of join-relation RelOptInfos */
291
- List **join_rel_level pg_node_attr(read_write_ignore);
292
- /* index of list being extended */
293
- int join_cur_level;
294
-
295
- /* init SubPlans for query */
296
- List *init_plans;
297
-
298
- /*
299
- * per-CTE-item list of subplan IDs (or -1 if no subplan was made for that
300
- * CTE)
301
- */
302
- List *cte_plan_ids;
303
-
304
- /* List of Lists of Params for MULTIEXPR subquery outputs */
305
- List *multiexpr_params;
306
-
307
- /* list of JoinDomains used in the query (higher ones first) */
308
- List *join_domains;
309
-
310
- /* list of active EquivalenceClasses */
311
- List *eq_classes;
312
-
313
- /* set true once ECs are canonical */
314
- bool ec_merging_done;
315
-
316
- /* list of "canonical" PathKeys */
317
- List *canon_pathkeys;
318
-
319
- /*
320
- * list of OuterJoinClauseInfos for mergejoinable outer join clauses
321
- * w/nonnullable var on left
322
- */
323
- List *left_join_clauses;
324
-
325
- /*
326
- * list of OuterJoinClauseInfos for mergejoinable outer join clauses
327
- * w/nonnullable var on right
328
- */
329
- List *right_join_clauses;
330
-
331
- /*
332
- * list of OuterJoinClauseInfos for mergejoinable full join clauses
333
- */
334
- List *full_join_clauses;
335
-
336
- /* list of SpecialJoinInfos */
337
- List *join_info_list;
338
-
339
- /* counter for assigning RestrictInfo serial numbers */
340
- int last_rinfo_serial;
341
-
342
- /*
343
- * all_result_relids is empty for SELECT, otherwise it contains at least
344
- * parse->resultRelation. For UPDATE/DELETE/MERGE across an inheritance
345
- * or partitioning tree, the result rel's child relids are added. When
346
- * using multi-level partitioning, intermediate partitioned rels are
347
- * included. leaf_result_relids is similar except that only actual result
348
- * tables, not partitioned tables, are included in it.
349
- */
350
- /* set of all result relids */
351
- Relids all_result_relids;
352
- /* set of all leaf relids */
353
- Relids leaf_result_relids;
354
-
355
- /*
356
- * list of AppendRelInfos
357
- *
358
- * Note: for AppendRelInfos describing partitions of a partitioned table,
359
- * we guarantee that partitions that come earlier in the partitioned
360
- * table's PartitionDesc will appear earlier in append_rel_list.
361
- */
362
- List *append_rel_list;
363
-
364
- /* list of RowIdentityVarInfos */
365
- List *row_identity_vars;
366
-
367
- /* list of PlanRowMarks */
368
- List *rowMarks;
369
-
370
- /* list of PlaceHolderInfos */
371
- List *placeholder_list;
372
-
373
- /* array of PlaceHolderInfos indexed by phid */
374
- struct PlaceHolderInfo **placeholder_array pg_node_attr(read_write_ignore, array_size(placeholder_array_size));
375
- /* allocated size of array */
376
- int placeholder_array_size pg_node_attr(read_write_ignore);
377
-
378
- /* list of ForeignKeyOptInfos */
379
- List *fkey_list;
380
-
381
- /* desired pathkeys for query_planner() */
382
- List *query_pathkeys;
383
-
384
- /* groupClause pathkeys, if any */
385
- List *group_pathkeys;
386
-
387
- /*
388
- * The number of elements in the group_pathkeys list which belong to the
389
- * GROUP BY clause. Additional ones belong to ORDER BY / DISTINCT
390
- * aggregates.
391
- */
392
- int num_groupby_pathkeys;
393
-
394
- /* pathkeys of bottom window, if any */
395
- List *window_pathkeys;
396
- /* distinctClause pathkeys, if any */
397
- List *distinct_pathkeys;
398
- /* sortClause pathkeys, if any */
399
- List *sort_pathkeys;
400
-
401
- /* Canonicalised partition schemes used in the query. */
402
- List *part_schemes pg_node_attr(read_write_ignore);
403
-
404
- /* RelOptInfos we are now trying to join */
405
- List *initial_rels pg_node_attr(read_write_ignore);
406
-
407
- /*
408
- * Upper-rel RelOptInfos. Use fetch_upper_rel() to get any particular
409
- * upper rel.
410
- */
411
- List *upper_rels[UPPERREL_FINAL + 1] pg_node_attr(read_write_ignore);
412
-
413
- /* Result tlists chosen by grouping_planner for upper-stage processing */
414
- struct PathTarget *upper_targets[UPPERREL_FINAL + 1] pg_node_attr(read_write_ignore);
415
-
416
- /*
417
- * The fully-processed groupClause is kept here. It differs from
418
- * parse->groupClause in that we remove any items that we can prove
419
- * redundant, so that only the columns named here actually need to be
420
- * compared to determine grouping. Note that it's possible for *all* the
421
- * items to be proven redundant, implying that there is only one group
422
- * containing all the query's rows. Hence, if you want to check whether
423
- * GROUP BY was specified, test for nonempty parse->groupClause, not for
424
- * nonempty processed_groupClause.
425
- *
426
- * Currently, when grouping sets are specified we do not attempt to
427
- * optimize the groupClause, so that processed_groupClause will be
428
- * identical to parse->groupClause.
429
- */
430
- List *processed_groupClause;
431
-
432
- /*
433
- * The fully-processed distinctClause is kept here. It differs from
434
- * parse->distinctClause in that we remove any items that we can prove
435
- * redundant, so that only the columns named here actually need to be
436
- * compared to determine uniqueness. Note that it's possible for *all*
437
- * the items to be proven redundant, implying that there should be only
438
- * one output row. Hence, if you want to check whether DISTINCT was
439
- * specified, test for nonempty parse->distinctClause, not for nonempty
440
- * processed_distinctClause.
441
- */
442
- List *processed_distinctClause;
443
-
444
- /*
445
- * The fully-processed targetlist is kept here. It differs from
446
- * parse->targetList in that (for INSERT) it's been reordered to match the
447
- * target table, and defaults have been filled in. Also, additional
448
- * resjunk targets may be present. preprocess_targetlist() does most of
449
- * that work, but note that more resjunk targets can get added during
450
- * appendrel expansion. (Hence, upper_targets mustn't get set up till
451
- * after that.)
452
- */
453
- List *processed_tlist;
454
-
455
- /*
456
- * For UPDATE, this list contains the target table's attribute numbers to
457
- * which the first N entries of processed_tlist are to be assigned. (Any
458
- * additional entries in processed_tlist must be resjunk.) DO NOT use the
459
- * resnos in processed_tlist to identify the UPDATE target columns.
460
- */
461
- List *update_colnos;
462
-
463
- /*
464
- * Fields filled during create_plan() for use in setrefs.c
465
- */
466
- /* for GroupingFunc fixup (can't print: array length not known here) */
467
- AttrNumber *grouping_map pg_node_attr(read_write_ignore);
468
- /* List of MinMaxAggInfos */
469
- List *minmax_aggs;
470
-
471
- /* context holding PlannerInfo */
472
- MemoryContext planner_cxt pg_node_attr(read_write_ignore);
473
-
474
- /* # of pages in all non-dummy tables of query */
475
- Cardinality total_table_pages;
476
-
477
- /* tuple_fraction passed to query_planner */
478
- Selectivity tuple_fraction;
479
- /* limit_tuples passed to query_planner */
480
- Cardinality limit_tuples;
481
-
482
- /*
483
- * Minimum security_level for quals. Note: qual_security_level is zero if
484
- * there are no securityQuals.
485
- */
486
- Index qual_security_level;
487
-
488
- /* true if any RTEs are RTE_JOIN kind */
489
- bool hasJoinRTEs;
490
- /* true if any RTEs are marked LATERAL */
491
- bool hasLateralRTEs;
492
- /* true if havingQual was non-null */
493
- bool hasHavingQual;
494
- /* true if any RestrictInfo has pseudoconstant = true */
495
- bool hasPseudoConstantQuals;
496
- /* true if we've made any of those */
497
- bool hasAlternativeSubPlans;
498
- /* true once we're no longer allowed to add PlaceHolderInfos */
499
- bool placeholdersFrozen;
500
- /* true if planning a recursive WITH item */
501
- bool hasRecursion;
502
-
503
- /*
504
- * Information about aggregates. Filled by preprocess_aggrefs().
505
- */
506
- /* AggInfo structs */
507
- List *agginfos;
508
- /* AggTransInfo structs */
509
- List *aggtransinfos;
510
- /* number of aggs with DISTINCT/ORDER BY/WITHIN GROUP */
511
- int numOrderedAggs;
512
- /* does any agg not support partial mode? */
513
- bool hasNonPartialAggs;
514
- /* is any partial agg non-serializable? */
515
- bool hasNonSerialAggs;
516
-
517
- /*
518
- * These fields are used only when hasRecursion is true:
519
- */
520
- /* PARAM_EXEC ID for the work table */
521
- int wt_param_id;
522
- /* a path for non-recursive term */
523
- struct Path *non_recursive_path;
524
-
525
- /*
526
- * These fields are workspace for createplan.c
527
- */
528
- /* outer rels above current node */
529
- Relids curOuterRels;
530
- /* not-yet-assigned NestLoopParams */
531
- List *curOuterParams;
532
-
533
- /*
534
- * These fields are workspace for setrefs.c. Each is an array
535
- * corresponding to glob->subplans. (We could probably teach
536
- * gen_node_support.pl how to determine the array length, but it doesn't
537
- * seem worth the trouble, so just mark them read_write_ignore.)
538
- */
539
- bool *isAltSubplan pg_node_attr(read_write_ignore);
540
- bool *isUsedSubplan pg_node_attr(read_write_ignore);
541
-
542
- /* optional private data for join_search_hook, e.g., GEQO */
543
- void *join_search_private pg_node_attr(read_write_ignore);
544
-
545
- /* Does this query modify any partition key columns? */
546
- bool partColsUpdated;
547
- };
548
-
549
-
550
- /*
551
- * In places where it's known that simple_rte_array[] must have been prepared
552
- * already, we just index into it to fetch RTEs. In code that might be
553
- * executed before or after entering query_planner(), use this macro.
554
- */
555
- #define planner_rt_fetch(rti, root) \
556
- ((root)->simple_rte_array ? (root)->simple_rte_array[rti] : \
557
- rt_fetch(rti, (root)->parse->rtable))
558
-
559
- /*
560
- * If multiple relations are partitioned the same way, all such partitions
561
- * will have a pointer to the same PartitionScheme. A list of PartitionScheme
562
- * objects is attached to the PlannerInfo. By design, the partition scheme
563
- * incorporates only the general properties of the partition method (LIST vs.
564
- * RANGE, number of partitioning columns and the type information for each)
565
- * and not the specific bounds.
566
- *
567
- * We store the opclass-declared input data types instead of the partition key
568
- * datatypes since the former rather than the latter are used to compare
569
- * partition bounds. Since partition key data types and the opclass declared
570
- * input data types are expected to be binary compatible (per ResolveOpClass),
571
- * both of those should have same byval and length properties.
572
- */
573
- typedef struct PartitionSchemeData
574
- {
575
- char strategy; /* partition strategy */
576
- int16 partnatts; /* number of partition attributes */
577
- Oid *partopfamily; /* OIDs of operator families */
578
- Oid *partopcintype; /* OIDs of opclass declared input data types */
579
- Oid *partcollation; /* OIDs of partitioning collations */
580
-
581
- /* Cached information about partition key data types. */
582
- int16 *parttyplen;
583
- bool *parttypbyval;
584
-
585
- /* Cached information about partition comparison functions. */
586
- struct FmgrInfo *partsupfunc;
587
- } PartitionSchemeData;
588
-
589
- typedef struct PartitionSchemeData *PartitionScheme;
590
-
591
- /*----------
592
- * RelOptInfo
593
- * Per-relation information for planning/optimization
594
- *
595
- * For planning purposes, a "base rel" is either a plain relation (a table)
596
- * or the output of a sub-SELECT or function that appears in the range table.
597
- * In either case it is uniquely identified by an RT index. A "joinrel"
598
- * is the joining of two or more base rels. A joinrel is identified by
599
- * the set of RT indexes for its component baserels, along with RT indexes
600
- * for any outer joins it has computed. We create RelOptInfo nodes for each
601
- * baserel and joinrel, and store them in the PlannerInfo's simple_rel_array
602
- * and join_rel_list respectively.
603
- *
604
- * Note that there is only one joinrel for any given set of component
605
- * baserels, no matter what order we assemble them in; so an unordered
606
- * set is the right datatype to identify it with.
607
- *
608
- * We also have "other rels", which are like base rels in that they refer to
609
- * single RT indexes; but they are not part of the join tree, and are given
610
- * a different RelOptKind to identify them.
611
- * Currently the only kind of otherrels are those made for member relations
612
- * of an "append relation", that is an inheritance set or UNION ALL subquery.
613
- * An append relation has a parent RTE that is a base rel, which represents
614
- * the entire append relation. The member RTEs are otherrels. The parent
615
- * is present in the query join tree but the members are not. The member
616
- * RTEs and otherrels are used to plan the scans of the individual tables or
617
- * subqueries of the append set; then the parent baserel is given Append
618
- * and/or MergeAppend paths comprising the best paths for the individual
619
- * member rels. (See comments for AppendRelInfo for more information.)
620
- *
621
- * At one time we also made otherrels to represent join RTEs, for use in
622
- * handling join alias Vars. Currently this is not needed because all join
623
- * alias Vars are expanded to non-aliased form during preprocess_expression.
624
- *
625
- * We also have relations representing joins between child relations of
626
- * different partitioned tables. These relations are not added to
627
- * join_rel_level lists as they are not joined directly by the dynamic
628
- * programming algorithm.
629
- *
630
- * There is also a RelOptKind for "upper" relations, which are RelOptInfos
631
- * that describe post-scan/join processing steps, such as aggregation.
632
- * Many of the fields in these RelOptInfos are meaningless, but their Path
633
- * fields always hold Paths showing ways to do that processing step.
634
- *
635
- * Parts of this data structure are specific to various scan and join
636
- * mechanisms. It didn't seem worth creating new node types for them.
637
- *
638
- * relids - Set of relation identifiers (RT indexes). This is a base
639
- * relation if there is just one, a join relation if more;
640
- * in the join case, RT indexes of any outer joins formed
641
- * at or below this join are included along with baserels
642
- * rows - estimated number of tuples in the relation after restriction
643
- * clauses have been applied (ie, output rows of a plan for it)
644
- * consider_startup - true if there is any value in keeping plain paths for
645
- * this rel on the basis of having cheap startup cost
646
- * consider_param_startup - the same for parameterized paths
647
- * reltarget - Default Path output tlist for this rel; normally contains
648
- * Var and PlaceHolderVar nodes for the values we need to
649
- * output from this relation.
650
- * List is in no particular order, but all rels of an
651
- * appendrel set must use corresponding orders.
652
- * NOTE: in an appendrel child relation, may contain
653
- * arbitrary expressions pulled up from a subquery!
654
- * pathlist - List of Path nodes, one for each potentially useful
655
- * method of generating the relation
656
- * ppilist - ParamPathInfo nodes for parameterized Paths, if any
657
- * cheapest_startup_path - the pathlist member with lowest startup cost
658
- * (regardless of ordering) among the unparameterized paths;
659
- * or NULL if there is no unparameterized path
660
- * cheapest_total_path - the pathlist member with lowest total cost
661
- * (regardless of ordering) among the unparameterized paths;
662
- * or if there is no unparameterized path, the path with lowest
663
- * total cost among the paths with minimum parameterization
664
- * cheapest_unique_path - for caching cheapest path to produce unique
665
- * (no duplicates) output from relation; NULL if not yet requested
666
- * cheapest_parameterized_paths - best paths for their parameterizations;
667
- * always includes cheapest_total_path, even if that's unparameterized
668
- * direct_lateral_relids - rels this rel has direct LATERAL references to
669
- * lateral_relids - required outer rels for LATERAL, as a Relids set
670
- * (includes both direct and indirect lateral references)
671
- *
672
- * If the relation is a base relation it will have these fields set:
673
- *
674
- * relid - RTE index (this is redundant with the relids field, but
675
- * is provided for convenience of access)
676
- * rtekind - copy of RTE's rtekind field
677
- * min_attr, max_attr - range of valid AttrNumbers for rel
678
- * attr_needed - array of bitmapsets indicating the highest joinrel
679
- * in which each attribute is needed; if bit 0 is set then
680
- * the attribute is needed as part of final targetlist
681
- * attr_widths - cache space for per-attribute width estimates;
682
- * zero means not computed yet
683
- * nulling_relids - relids of outer joins that can null this rel
684
- * lateral_vars - lateral cross-references of rel, if any (list of
685
- * Vars and PlaceHolderVars)
686
- * lateral_referencers - relids of rels that reference this one laterally
687
- * (includes both direct and indirect lateral references)
688
- * indexlist - list of IndexOptInfo nodes for relation's indexes
689
- * (always NIL if it's not a table or partitioned table)
690
- * pages - number of disk pages in relation (zero if not a table)
691
- * tuples - number of tuples in relation (not considering restrictions)
692
- * allvisfrac - fraction of disk pages that are marked all-visible
693
- * eclass_indexes - EquivalenceClasses that mention this rel (filled
694
- * only after EC merging is complete)
695
- * subroot - PlannerInfo for subquery (NULL if it's not a subquery)
696
- * subplan_params - list of PlannerParamItems to be passed to subquery
697
- *
698
- * Note: for a subquery, tuples and subroot are not set immediately
699
- * upon creation of the RelOptInfo object; they are filled in when
700
- * set_subquery_pathlist processes the object.
701
- *
702
- * For otherrels that are appendrel members, these fields are filled
703
- * in just as for a baserel, except we don't bother with lateral_vars.
704
- *
705
- * If the relation is either a foreign table or a join of foreign tables that
706
- * all belong to the same foreign server and are assigned to the same user to
707
- * check access permissions as (cf checkAsUser), these fields will be set:
708
- *
709
- * serverid - OID of foreign server, if foreign table (else InvalidOid)
710
- * userid - OID of user to check access as (InvalidOid means current user)
711
- * useridiscurrent - we've assumed that userid equals current user
712
- * fdwroutine - function hooks for FDW, if foreign table (else NULL)
713
- * fdw_private - private state for FDW, if foreign table (else NULL)
714
- *
715
- * Two fields are used to cache knowledge acquired during the join search
716
- * about whether this rel is provably unique when being joined to given other
717
- * relation(s), ie, it can have at most one row matching any given row from
718
- * that join relation. Currently we only attempt such proofs, and thus only
719
- * populate these fields, for base rels; but someday they might be used for
720
- * join rels too:
721
- *
722
- * unique_for_rels - list of Relid sets, each one being a set of other
723
- * rels for which this one has been proven unique
724
- * non_unique_for_rels - list of Relid sets, each one being a set of
725
- * other rels for which we have tried and failed to prove
726
- * this one unique
727
- *
728
- * The presence of the following fields depends on the restrictions
729
- * and joins that the relation participates in:
730
- *
731
- * baserestrictinfo - List of RestrictInfo nodes, containing info about
732
- * each non-join qualification clause in which this relation
733
- * participates (only used for base rels)
734
- * baserestrictcost - Estimated cost of evaluating the baserestrictinfo
735
- * clauses at a single tuple (only used for base rels)
736
- * baserestrict_min_security - Smallest security_level found among
737
- * clauses in baserestrictinfo
738
- * joininfo - List of RestrictInfo nodes, containing info about each
739
- * join clause in which this relation participates (but
740
- * note this excludes clauses that might be derivable from
741
- * EquivalenceClasses)
742
- * has_eclass_joins - flag that EquivalenceClass joins are possible
743
- *
744
- * Note: Keeping a restrictinfo list in the RelOptInfo is useful only for
745
- * base rels, because for a join rel the set of clauses that are treated as
746
- * restrict clauses varies depending on which sub-relations we choose to join.
747
- * (For example, in a 3-base-rel join, a clause relating rels 1 and 2 must be
748
- * treated as a restrictclause if we join {1} and {2 3} to make {1 2 3}; but
749
- * if we join {1 2} and {3} then that clause will be a restrictclause in {1 2}
750
- * and should not be processed again at the level of {1 2 3}.) Therefore,
751
- * the restrictinfo list in the join case appears in individual JoinPaths
752
- * (field joinrestrictinfo), not in the parent relation. But it's OK for
753
- * the RelOptInfo to store the joininfo list, because that is the same
754
- * for a given rel no matter how we form it.
755
- *
756
- * We store baserestrictcost in the RelOptInfo (for base relations) because
757
- * we know we will need it at least once (to price the sequential scan)
758
- * and may need it multiple times to price index scans.
759
- *
760
- * A join relation is considered to be partitioned if it is formed from a
761
- * join of two relations that are partitioned, have matching partitioning
762
- * schemes, and are joined on an equijoin of the partitioning columns.
763
- * Under those conditions we can consider the join relation to be partitioned
764
- * by either relation's partitioning keys, though some care is needed if
765
- * either relation can be forced to null by outer-joining. For example, an
766
- * outer join like (A LEFT JOIN B ON A.a = B.b) may produce rows with B.b
767
- * NULL. These rows may not fit the partitioning conditions imposed on B.
768
- * Hence, strictly speaking, the join is not partitioned by B.b and thus
769
- * partition keys of an outer join should include partition key expressions
770
- * from the non-nullable side only. However, if a subsequent join uses
771
- * strict comparison operators (and all commonly-used equijoin operators are
772
- * strict), the presence of nulls doesn't cause a problem: such rows couldn't
773
- * match anything on the other side and thus they don't create a need to do
774
- * any cross-partition sub-joins. Hence we can treat such values as still
775
- * partitioning the join output for the purpose of additional partitionwise
776
- * joining, so long as a strict join operator is used by the next join.
777
- *
778
- * If the relation is partitioned, these fields will be set:
779
- *
780
- * part_scheme - Partitioning scheme of the relation
781
- * nparts - Number of partitions
782
- * boundinfo - Partition bounds
783
- * partbounds_merged - true if partition bounds are merged ones
784
- * partition_qual - Partition constraint if not the root
785
- * part_rels - RelOptInfos for each partition
786
- * all_partrels - Relids set of all partition relids
787
- * partexprs, nullable_partexprs - Partition key expressions
788
- *
789
- * The partexprs and nullable_partexprs arrays each contain
790
- * part_scheme->partnatts elements. Each of the elements is a list of
791
- * partition key expressions. For partitioned base relations, there is one
792
- * expression in each partexprs element, and nullable_partexprs is empty.
793
- * For partitioned join relations, each base relation within the join
794
- * contributes one partition key expression per partitioning column;
795
- * that expression goes in the partexprs[i] list if the base relation
796
- * is not nullable by this join or any lower outer join, or in the
797
- * nullable_partexprs[i] list if the base relation is nullable.
798
- * Furthermore, FULL JOINs add extra nullable_partexprs expressions
799
- * corresponding to COALESCE expressions of the left and right join columns,
800
- * to simplify matching join clauses to those lists.
801
- *
802
- * Not all fields are printed. (In some cases, there is no print support for
803
- * the field type.)
804
- *----------
805
- */
806
-
807
- /* Bitmask of flags supported by table AMs */
808
- #define AMFLAG_HAS_TID_RANGE (1 << 0)
809
-
810
- typedef enum RelOptKind
811
- {
812
- RELOPT_BASEREL,
813
- RELOPT_JOINREL,
814
- RELOPT_OTHER_MEMBER_REL,
815
- RELOPT_OTHER_JOINREL,
816
- RELOPT_UPPER_REL,
817
- RELOPT_OTHER_UPPER_REL
818
- } RelOptKind;
819
-
820
- /*
821
- * Is the given relation a simple relation i.e a base or "other" member
822
- * relation?
823
- */
824
- #define IS_SIMPLE_REL(rel) \
825
- ((rel)->reloptkind == RELOPT_BASEREL || \
826
- (rel)->reloptkind == RELOPT_OTHER_MEMBER_REL)
827
-
828
- /* Is the given relation a join relation? */
829
- #define IS_JOIN_REL(rel) \
830
- ((rel)->reloptkind == RELOPT_JOINREL || \
831
- (rel)->reloptkind == RELOPT_OTHER_JOINREL)
832
-
833
- /* Is the given relation an upper relation? */
834
- #define IS_UPPER_REL(rel) \
835
- ((rel)->reloptkind == RELOPT_UPPER_REL || \
836
- (rel)->reloptkind == RELOPT_OTHER_UPPER_REL)
837
-
838
- /* Is the given relation an "other" relation? */
839
- #define IS_OTHER_REL(rel) \
840
- ((rel)->reloptkind == RELOPT_OTHER_MEMBER_REL || \
841
- (rel)->reloptkind == RELOPT_OTHER_JOINREL || \
842
- (rel)->reloptkind == RELOPT_OTHER_UPPER_REL)
843
-
844
- typedef struct RelOptInfo
845
- {
846
- pg_node_attr(no_copy_equal, no_read, no_query_jumble)
847
-
848
- NodeTag type;
849
-
850
- RelOptKind reloptkind;
851
-
852
- /*
853
- * all relations included in this RelOptInfo; set of base + OJ relids
854
- * (rangetable indexes)
855
- */
856
- Relids relids;
857
-
858
- /*
859
- * size estimates generated by planner
860
- */
861
- /* estimated number of result tuples */
862
- Cardinality rows;
863
-
864
- /*
865
- * per-relation planner control flags
866
- */
867
- /* keep cheap-startup-cost paths? */
868
- bool consider_startup;
869
- /* ditto, for parameterized paths? */
870
- bool consider_param_startup;
871
- /* consider parallel paths? */
872
- bool consider_parallel;
873
-
874
- /*
875
- * default result targetlist for Paths scanning this relation; list of
876
- * Vars/Exprs, cost, width
877
- */
878
- struct PathTarget *reltarget;
879
-
880
- /*
881
- * materialization information
882
- */
883
- List *pathlist; /* Path structures */
884
- List *ppilist; /* ParamPathInfos used in pathlist */
885
- List *partial_pathlist; /* partial Paths */
886
- struct Path *cheapest_startup_path;
887
- struct Path *cheapest_total_path;
888
- struct Path *cheapest_unique_path;
889
- List *cheapest_parameterized_paths;
890
-
891
- /*
892
- * parameterization information needed for both base rels and join rels
893
- * (see also lateral_vars and lateral_referencers)
894
- */
895
- /* rels directly laterally referenced */
896
- Relids direct_lateral_relids;
897
- /* minimum parameterization of rel */
898
- Relids lateral_relids;
899
-
900
- /*
901
- * information about a base rel (not set for join rels!)
902
- */
903
- Index relid;
904
- /* containing tablespace */
905
- Oid reltablespace;
906
- /* RELATION, SUBQUERY, FUNCTION, etc */
907
- RTEKind rtekind;
908
- /* smallest attrno of rel (often <0) */
909
- AttrNumber min_attr;
910
- /* largest attrno of rel */
911
- AttrNumber max_attr;
912
- /* array indexed [min_attr .. max_attr] */
913
- Relids *attr_needed pg_node_attr(read_write_ignore);
914
- /* array indexed [min_attr .. max_attr] */
915
- int32 *attr_widths pg_node_attr(read_write_ignore);
916
- /* relids of outer joins that can null this baserel */
917
- Relids nulling_relids;
918
- /* LATERAL Vars and PHVs referenced by rel */
919
- List *lateral_vars;
920
- /* rels that reference this baserel laterally */
921
- Relids lateral_referencers;
922
- /* list of IndexOptInfo */
923
- List *indexlist;
924
- /* list of StatisticExtInfo */
925
- List *statlist;
926
- /* size estimates derived from pg_class */
927
- BlockNumber pages;
928
- Cardinality tuples;
929
- double allvisfrac;
930
- /* indexes in PlannerInfo's eq_classes list of ECs that mention this rel */
931
- Bitmapset *eclass_indexes;
932
- PlannerInfo *subroot; /* if subquery */
933
- List *subplan_params; /* if subquery */
934
- /* wanted number of parallel workers */
935
- int rel_parallel_workers;
936
- /* Bitmask of optional features supported by the table AM */
937
- uint32 amflags;
938
-
939
- /*
940
- * Information about foreign tables and foreign joins
941
- */
942
- /* identifies server for the table or join */
943
- Oid serverid;
944
- /* identifies user to check access as; 0 means to check as current user */
945
- Oid userid;
946
- /* join is only valid for current user */
947
- bool useridiscurrent;
948
- /* use "struct FdwRoutine" to avoid including fdwapi.h here */
949
- struct FdwRoutine *fdwroutine pg_node_attr(read_write_ignore);
950
- void *fdw_private pg_node_attr(read_write_ignore);
951
-
952
- /*
953
- * cache space for remembering if we have proven this relation unique
954
- */
955
- /* known unique for these other relid set(s) */
956
- List *unique_for_rels;
957
- /* known not unique for these set(s) */
958
- List *non_unique_for_rels;
959
-
960
- /*
961
- * used by various scans and joins:
962
- */
963
- /* RestrictInfo structures (if base rel) */
964
- List *baserestrictinfo;
965
- /* cost of evaluating the above */
966
- QualCost baserestrictcost;
967
- /* min security_level found in baserestrictinfo */
968
- Index baserestrict_min_security;
969
- /* RestrictInfo structures for join clauses involving this rel */
970
- List *joininfo;
971
- /* T means joininfo is incomplete */
972
- bool has_eclass_joins;
973
-
974
- /*
975
- * used by partitionwise joins:
976
- */
977
- /* consider partitionwise join paths? (if partitioned rel) */
978
- bool consider_partitionwise_join;
979
-
980
- /*
981
- * inheritance links, if this is an otherrel (otherwise NULL):
982
- */
983
- /* Immediate parent relation (dumping it would be too verbose) */
984
- struct RelOptInfo *parent pg_node_attr(read_write_ignore);
985
- /* Topmost parent relation (dumping it would be too verbose) */
986
- struct RelOptInfo *top_parent pg_node_attr(read_write_ignore);
987
- /* Relids of topmost parent (redundant, but handy) */
988
- Relids top_parent_relids;
989
-
990
- /*
991
- * used for partitioned relations:
992
- */
993
- /* Partitioning scheme */
994
- PartitionScheme part_scheme pg_node_attr(read_write_ignore);
995
-
996
- /*
997
- * Number of partitions; -1 if not yet set; in case of a join relation 0
998
- * means it's considered unpartitioned
999
- */
1000
- int nparts;
1001
- /* Partition bounds */
1002
- struct PartitionBoundInfoData *boundinfo pg_node_attr(read_write_ignore);
1003
- /* True if partition bounds were created by partition_bounds_merge() */
1004
- bool partbounds_merged;
1005
- /* Partition constraint, if not the root */
1006
- List *partition_qual;
1007
-
1008
- /*
1009
- * Array of RelOptInfos of partitions, stored in the same order as bounds
1010
- * (don't print, too bulky and duplicative)
1011
- */
1012
- struct RelOptInfo **part_rels pg_node_attr(read_write_ignore);
1013
-
1014
- /*
1015
- * Bitmap with members acting as indexes into the part_rels[] array to
1016
- * indicate which partitions survived partition pruning.
1017
- */
1018
- Bitmapset *live_parts;
1019
- /* Relids set of all partition relids */
1020
- Relids all_partrels;
1021
-
1022
- /*
1023
- * These arrays are of length partkey->partnatts, which we don't have at
1024
- * hand, so don't try to print
1025
- */
1026
-
1027
- /* Non-nullable partition key expressions */
1028
- List **partexprs pg_node_attr(read_write_ignore);
1029
- /* Nullable partition key expressions */
1030
- List **nullable_partexprs pg_node_attr(read_write_ignore);
1031
- } RelOptInfo;
1032
-
1033
- /*
1034
- * Is given relation partitioned?
1035
- *
1036
- * It's not enough to test whether rel->part_scheme is set, because it might
1037
- * be that the basic partitioning properties of the input relations matched
1038
- * but the partition bounds did not. Also, if we are able to prove a rel
1039
- * dummy (empty), we should henceforth treat it as unpartitioned.
1040
- */
1041
- #define IS_PARTITIONED_REL(rel) \
1042
- ((rel)->part_scheme && (rel)->boundinfo && (rel)->nparts > 0 && \
1043
- (rel)->part_rels && !IS_DUMMY_REL(rel))
1044
-
1045
- /*
1046
- * Convenience macro to make sure that a partitioned relation has all the
1047
- * required members set.
1048
- */
1049
- #define REL_HAS_ALL_PART_PROPS(rel) \
1050
- ((rel)->part_scheme && (rel)->boundinfo && (rel)->nparts > 0 && \
1051
- (rel)->part_rels && (rel)->partexprs && (rel)->nullable_partexprs)
1052
-
1053
- /*
1054
- * IndexOptInfo
1055
- * Per-index information for planning/optimization
1056
- *
1057
- * indexkeys[], indexcollations[] each have ncolumns entries.
1058
- * opfamily[], and opcintype[] each have nkeycolumns entries. They do
1059
- * not contain any information about included attributes.
1060
- *
1061
- * sortopfamily[], reverse_sort[], and nulls_first[] have
1062
- * nkeycolumns entries, if the index is ordered; but if it is unordered,
1063
- * those pointers are NULL.
1064
- *
1065
- * Zeroes in the indexkeys[] array indicate index columns that are
1066
- * expressions; there is one element in indexprs for each such column.
1067
- *
1068
- * For an ordered index, reverse_sort[] and nulls_first[] describe the
1069
- * sort ordering of a forward indexscan; we can also consider a backward
1070
- * indexscan, which will generate the reverse ordering.
1071
- *
1072
- * The indexprs and indpred expressions have been run through
1073
- * prepqual.c and eval_const_expressions() for ease of matching to
1074
- * WHERE clauses. indpred is in implicit-AND form.
1075
- *
1076
- * indextlist is a TargetEntry list representing the index columns.
1077
- * It provides an equivalent base-relation Var for each simple column,
1078
- * and links to the matching indexprs element for each expression column.
1079
- *
1080
- * While most of these fields are filled when the IndexOptInfo is created
1081
- * (by plancat.c), indrestrictinfo and predOK are set later, in
1082
- * check_index_predicates().
1083
- */
1084
- #ifndef HAVE_INDEXOPTINFO_TYPEDEF
1085
- typedef struct IndexOptInfo IndexOptInfo;
1086
- #define HAVE_INDEXOPTINFO_TYPEDEF 1
1087
- #endif
1088
-
1089
- struct IndexOptInfo
1090
- {
1091
- pg_node_attr(no_copy_equal, no_read, no_query_jumble)
1092
-
1093
- NodeTag type;
1094
-
1095
- /* OID of the index relation */
1096
- Oid indexoid;
1097
- /* tablespace of index (not table) */
1098
- Oid reltablespace;
1099
- /* back-link to index's table; don't print, else infinite recursion */
1100
- RelOptInfo *rel pg_node_attr(read_write_ignore);
1101
-
1102
- /*
1103
- * index-size statistics (from pg_class and elsewhere)
1104
- */
1105
- /* number of disk pages in index */
1106
- BlockNumber pages;
1107
- /* number of index tuples in index */
1108
- Cardinality tuples;
1109
- /* index tree height, or -1 if unknown */
1110
- int tree_height;
1111
-
1112
- /*
1113
- * index descriptor information
1114
- */
1115
- /* number of columns in index */
1116
- int ncolumns;
1117
- /* number of key columns in index */
1118
- int nkeycolumns;
1119
-
1120
- /*
1121
- * table column numbers of index's columns (both key and included
1122
- * columns), or 0 for expression columns
1123
- */
1124
- int *indexkeys pg_node_attr(array_size(ncolumns));
1125
- /* OIDs of collations of index columns */
1126
- Oid *indexcollations pg_node_attr(array_size(nkeycolumns));
1127
- /* OIDs of operator families for columns */
1128
- Oid *opfamily pg_node_attr(array_size(nkeycolumns));
1129
- /* OIDs of opclass declared input data types */
1130
- Oid *opcintype pg_node_attr(array_size(nkeycolumns));
1131
- /* OIDs of btree opfamilies, if orderable. NULL if partitioned index */
1132
- Oid *sortopfamily pg_node_attr(array_size(nkeycolumns));
1133
- /* is sort order descending? or NULL if partitioned index */
1134
- bool *reverse_sort pg_node_attr(array_size(nkeycolumns));
1135
- /* do NULLs come first in the sort order? or NULL if partitioned index */
1136
- bool *nulls_first pg_node_attr(array_size(nkeycolumns));
1137
- /* opclass-specific options for columns */
1138
- bytea **opclassoptions pg_node_attr(read_write_ignore);
1139
- /* which index cols can be returned in an index-only scan? */
1140
- bool *canreturn pg_node_attr(array_size(ncolumns));
1141
- /* OID of the access method (in pg_am) */
1142
- Oid relam;
1143
-
1144
- /*
1145
- * expressions for non-simple index columns; redundant to print since we
1146
- * print indextlist
1147
- */
1148
- List *indexprs pg_node_attr(read_write_ignore);
1149
- /* predicate if a partial index, else NIL */
1150
- List *indpred;
1151
-
1152
- /* targetlist representing index columns */
1153
- List *indextlist;
1154
-
1155
- /*
1156
- * parent relation's baserestrictinfo list, less any conditions implied by
1157
- * the index's predicate (unless it's a target rel, see comments in
1158
- * check_index_predicates())
1159
- */
1160
- List *indrestrictinfo;
1161
-
1162
- /* true if index predicate matches query */
1163
- bool predOK;
1164
- /* true if a unique index */
1165
- bool unique;
1166
- /* is uniqueness enforced immediately? */
1167
- bool immediate;
1168
- /* true if index doesn't really exist */
1169
- bool hypothetical;
1170
-
1171
- /*
1172
- * Remaining fields are copied from the index AM's API struct
1173
- * (IndexAmRoutine). These fields are not set for partitioned indexes.
1174
- */
1175
- bool amcanorderbyop;
1176
- bool amoptionalkey;
1177
- bool amsearcharray;
1178
- bool amsearchnulls;
1179
- /* does AM have amgettuple interface? */
1180
- bool amhasgettuple;
1181
- /* does AM have amgetbitmap interface? */
1182
- bool amhasgetbitmap;
1183
- bool amcanparallel;
1184
- /* does AM have ammarkpos interface? */
1185
- bool amcanmarkpos;
1186
- /* AM's cost estimator */
1187
- /* Rather than include amapi.h here, we declare amcostestimate like this */
1188
- void (*amcostestimate) () pg_node_attr(read_write_ignore);
1189
- };
1190
-
1191
- /*
1192
- * ForeignKeyOptInfo
1193
- * Per-foreign-key information for planning/optimization
1194
- *
1195
- * The per-FK-column arrays can be fixed-size because we allow at most
1196
- * INDEX_MAX_KEYS columns in a foreign key constraint. Each array has
1197
- * nkeys valid entries.
1198
- */
1199
- typedef struct ForeignKeyOptInfo
1200
- {
1201
- pg_node_attr(custom_read_write, no_copy_equal, no_read, no_query_jumble)
1202
-
1203
- NodeTag type;
1204
-
1205
- /*
1206
- * Basic data about the foreign key (fetched from catalogs):
1207
- */
1208
-
1209
- /* RT index of the referencing table */
1210
- Index con_relid;
1211
- /* RT index of the referenced table */
1212
- Index ref_relid;
1213
- /* number of columns in the foreign key */
1214
- int nkeys;
1215
- /* cols in referencing table */
1216
- AttrNumber conkey[INDEX_MAX_KEYS] pg_node_attr(array_size(nkeys));
1217
- /* cols in referenced table */
1218
- AttrNumber confkey[INDEX_MAX_KEYS] pg_node_attr(array_size(nkeys));
1219
- /* PK = FK operator OIDs */
1220
- Oid conpfeqop[INDEX_MAX_KEYS] pg_node_attr(array_size(nkeys));
1221
-
1222
- /*
1223
- * Derived info about whether FK's equality conditions match the query:
1224
- */
1225
-
1226
- /* # of FK cols matched by ECs */
1227
- int nmatched_ec;
1228
- /* # of these ECs that are ec_has_const */
1229
- int nconst_ec;
1230
- /* # of FK cols matched by non-EC rinfos */
1231
- int nmatched_rcols;
1232
- /* total # of non-EC rinfos matched to FK */
1233
- int nmatched_ri;
1234
- /* Pointer to eclass matching each column's condition, if there is one */
1235
- struct EquivalenceClass *eclass[INDEX_MAX_KEYS];
1236
- /* Pointer to eclass member for the referencing Var, if there is one */
1237
- struct EquivalenceMember *fk_eclass_member[INDEX_MAX_KEYS];
1238
- /* List of non-EC RestrictInfos matching each column's condition */
1239
- List *rinfos[INDEX_MAX_KEYS];
1240
- } ForeignKeyOptInfo;
1241
-
1242
- /*
1243
- * StatisticExtInfo
1244
- * Information about extended statistics for planning/optimization
1245
- *
1246
- * Each pg_statistic_ext row is represented by one or more nodes of this
1247
- * type, or even zero if ANALYZE has not computed them.
1248
- */
1249
- typedef struct StatisticExtInfo
1250
- {
1251
- pg_node_attr(no_copy_equal, no_read, no_query_jumble)
1252
-
1253
- NodeTag type;
1254
-
1255
- /* OID of the statistics row */
1256
- Oid statOid;
1257
-
1258
- /* includes child relations */
1259
- bool inherit;
1260
-
1261
- /* back-link to statistic's table; don't print, else infinite recursion */
1262
- RelOptInfo *rel pg_node_attr(read_write_ignore);
1263
-
1264
- /* statistics kind of this entry */
1265
- char kind;
1266
-
1267
- /* attnums of the columns covered */
1268
- Bitmapset *keys;
1269
-
1270
- /* expressions */
1271
- List *exprs;
1272
- } StatisticExtInfo;
1273
-
1274
- /*
1275
- * JoinDomains
1276
- *
1277
- * A "join domain" defines the scope of applicability of deductions made via
1278
- * the EquivalenceClass mechanism. Roughly speaking, a join domain is a set
1279
- * of base+OJ relations that are inner-joined together. More precisely, it is
1280
- * the set of relations at which equalities deduced from an EquivalenceClass
1281
- * can be enforced or should be expected to hold. The topmost JoinDomain
1282
- * covers the whole query (so its jd_relids should equal all_query_rels).
1283
- * An outer join creates a new JoinDomain that includes all base+OJ relids
1284
- * within its nullable side, but (by convention) not the OJ's own relid.
1285
- * A FULL join creates two new JoinDomains, one for each side.
1286
- *
1287
- * Notice that a rel that is below outer join(s) will thus appear to belong
1288
- * to multiple join domains. However, any of its Vars that appear in
1289
- * EquivalenceClasses belonging to higher join domains will have nullingrel
1290
- * bits preventing them from being evaluated at the rel's scan level, so that
1291
- * we will not be able to derive enforceable-at-the-rel-scan-level clauses
1292
- * from such ECs. We define the join domain relid sets this way so that
1293
- * domains can be said to be "higher" or "lower" when one domain relid set
1294
- * includes another.
1295
- *
1296
- * The JoinDomains for a query are computed in deconstruct_jointree.
1297
- * We do not copy JoinDomain structs once made, so they can be compared
1298
- * for equality by simple pointer equality.
1299
- */
1300
- typedef struct JoinDomain
1301
- {
1302
- pg_node_attr(no_copy_equal, no_read, no_query_jumble)
1303
-
1304
- NodeTag type;
1305
-
1306
- Relids jd_relids; /* all relids contained within the domain */
1307
- } JoinDomain;
1308
-
1309
- /*
1310
- * EquivalenceClasses
1311
- *
1312
- * Whenever we identify a mergejoinable equality clause A = B that is
1313
- * not an outer-join clause, we create an EquivalenceClass containing
1314
- * the expressions A and B to record this knowledge. If we later find another
1315
- * equivalence B = C, we add C to the existing EquivalenceClass; this may
1316
- * require merging two existing EquivalenceClasses. At the end of the qual
1317
- * distribution process, we have sets of values that are known all transitively
1318
- * equal to each other, where "equal" is according to the rules of the btree
1319
- * operator family(s) shown in ec_opfamilies, as well as the collation shown
1320
- * by ec_collation. (We restrict an EC to contain only equalities whose
1321
- * operators belong to the same set of opfamilies. This could probably be
1322
- * relaxed, but for now it's not worth the trouble, since nearly all equality
1323
- * operators belong to only one btree opclass anyway. Similarly, we suppose
1324
- * that all or none of the input datatypes are collatable, so that a single
1325
- * collation value is sufficient.)
1326
- *
1327
- * Strictly speaking, deductions from an EquivalenceClass hold only within
1328
- * a "join domain", that is a set of relations that are innerjoined together
1329
- * (see JoinDomain above). For the most part we don't need to account for
1330
- * this explicitly, because equality clauses from different join domains
1331
- * will contain Vars that are not equal() because they have different
1332
- * nullingrel sets, and thus we will never falsely merge ECs from different
1333
- * join domains. But Var-free (pseudoconstant) expressions lack that safety
1334
- * feature. We handle that by marking "const" EC members with the JoinDomain
1335
- * of the clause they came from; two nominally-equal const members will be
1336
- * considered different if they came from different JoinDomains. This ensures
1337
- * no false EquivalenceClass merges will occur.
1338
- *
1339
- * We also use EquivalenceClasses as the base structure for PathKeys, letting
1340
- * us represent knowledge about different sort orderings being equivalent.
1341
- * Since every PathKey must reference an EquivalenceClass, we will end up
1342
- * with single-member EquivalenceClasses whenever a sort key expression has
1343
- * not been equivalenced to anything else. It is also possible that such an
1344
- * EquivalenceClass will contain a volatile expression ("ORDER BY random()"),
1345
- * which is a case that can't arise otherwise since clauses containing
1346
- * volatile functions are never considered mergejoinable. We mark such
1347
- * EquivalenceClasses specially to prevent them from being merged with
1348
- * ordinary EquivalenceClasses. Also, for volatile expressions we have
1349
- * to be careful to match the EquivalenceClass to the correct targetlist
1350
- * entry: consider SELECT random() AS a, random() AS b ... ORDER BY b,a.
1351
- * So we record the SortGroupRef of the originating sort clause.
1352
- *
1353
- * NB: if ec_merged isn't NULL, this class has been merged into another, and
1354
- * should be ignored in favor of using the pointed-to class.
1355
- *
1356
- * NB: EquivalenceClasses are never copied after creation. Therefore,
1357
- * copyObject() copies pointers to them as pointers, and equal() compares
1358
- * pointers to EquivalenceClasses via pointer equality. This is implemented
1359
- * by putting copy_as_scalar and equal_as_scalar attributes on fields that
1360
- * are pointers to EquivalenceClasses. The same goes for EquivalenceMembers.
1361
- */
1362
- typedef struct EquivalenceClass
1363
- {
1364
- pg_node_attr(custom_read_write, no_copy_equal, no_read, no_query_jumble)
1365
-
1366
- NodeTag type;
1367
-
1368
- List *ec_opfamilies; /* btree operator family OIDs */
1369
- Oid ec_collation; /* collation, if datatypes are collatable */
1370
- List *ec_members; /* list of EquivalenceMembers */
1371
- List *ec_sources; /* list of generating RestrictInfos */
1372
- List *ec_derives; /* list of derived RestrictInfos */
1373
- Relids ec_relids; /* all relids appearing in ec_members, except
1374
- * for child members (see below) */
1375
- bool ec_has_const; /* any pseudoconstants in ec_members? */
1376
- bool ec_has_volatile; /* the (sole) member is a volatile expr */
1377
- bool ec_broken; /* failed to generate needed clauses? */
1378
- Index ec_sortref; /* originating sortclause label, or 0 */
1379
- Index ec_min_security; /* minimum security_level in ec_sources */
1380
- Index ec_max_security; /* maximum security_level in ec_sources */
1381
- struct EquivalenceClass *ec_merged; /* set if merged into another EC */
1382
- } EquivalenceClass;
1383
-
1384
- /*
1385
- * If an EC contains a constant, any PathKey depending on it must be
1386
- * redundant, since there's only one possible value of the key.
1387
- */
1388
- #define EC_MUST_BE_REDUNDANT(eclass) \
1389
- ((eclass)->ec_has_const)
1390
-
1391
- /*
1392
- * EquivalenceMember - one member expression of an EquivalenceClass
1393
- *
1394
- * em_is_child signifies that this element was built by transposing a member
1395
- * for an appendrel parent relation to represent the corresponding expression
1396
- * for an appendrel child. These members are used for determining the
1397
- * pathkeys of scans on the child relation and for explicitly sorting the
1398
- * child when necessary to build a MergeAppend path for the whole appendrel
1399
- * tree. An em_is_child member has no impact on the properties of the EC as a
1400
- * whole; in particular the EC's ec_relids field does NOT include the child
1401
- * relation. An em_is_child member should never be marked em_is_const nor
1402
- * cause ec_has_const or ec_has_volatile to be set, either. Thus, em_is_child
1403
- * members are not really full-fledged members of the EC, but just reflections
1404
- * or doppelgangers of real members. Most operations on EquivalenceClasses
1405
- * should ignore em_is_child members, and those that don't should test
1406
- * em_relids to make sure they only consider relevant members.
1407
- *
1408
- * em_datatype is usually the same as exprType(em_expr), but can be
1409
- * different when dealing with a binary-compatible opfamily; in particular
1410
- * anyarray_ops would never work without this. Use em_datatype when
1411
- * looking up a specific btree operator to work with this expression.
1412
- */
1413
- typedef struct EquivalenceMember
1414
- {
1415
- pg_node_attr(no_copy_equal, no_read, no_query_jumble)
1416
-
1417
- NodeTag type;
1418
-
1419
- Expr *em_expr; /* the expression represented */
1420
- Relids em_relids; /* all relids appearing in em_expr */
1421
- bool em_is_const; /* expression is pseudoconstant? */
1422
- bool em_is_child; /* derived version for a child relation? */
1423
- Oid em_datatype; /* the "nominal type" used by the opfamily */
1424
- JoinDomain *em_jdomain; /* join domain containing the source clause */
1425
- /* if em_is_child is true, this links to corresponding EM for top parent */
1426
- struct EquivalenceMember *em_parent pg_node_attr(read_write_ignore);
1427
- } EquivalenceMember;
1428
-
1429
- /*
1430
- * PathKeys
1431
- *
1432
- * The sort ordering of a path is represented by a list of PathKey nodes.
1433
- * An empty list implies no known ordering. Otherwise the first item
1434
- * represents the primary sort key, the second the first secondary sort key,
1435
- * etc. The value being sorted is represented by linking to an
1436
- * EquivalenceClass containing that value and including pk_opfamily among its
1437
- * ec_opfamilies. The EquivalenceClass tells which collation to use, too.
1438
- * This is a convenient method because it makes it trivial to detect
1439
- * equivalent and closely-related orderings. (See optimizer/README for more
1440
- * information.)
1441
- *
1442
- * Note: pk_strategy is either BTLessStrategyNumber (for ASC) or
1443
- * BTGreaterStrategyNumber (for DESC). We assume that all ordering-capable
1444
- * index types will use btree-compatible strategy numbers.
1445
- */
1446
- typedef struct PathKey
1447
- {
1448
- pg_node_attr(no_read, no_query_jumble)
1449
-
1450
- NodeTag type;
1451
-
1452
- /* the value that is ordered */
1453
- EquivalenceClass *pk_eclass pg_node_attr(copy_as_scalar, equal_as_scalar);
1454
- Oid pk_opfamily; /* btree opfamily defining the ordering */
1455
- int pk_strategy; /* sort direction (ASC or DESC) */
1456
- bool pk_nulls_first; /* do NULLs come before normal values? */
1457
- } PathKey;
1458
-
1459
- /*
1460
- * VolatileFunctionStatus -- allows nodes to cache their
1461
- * contain_volatile_functions properties. VOLATILITY_UNKNOWN means not yet
1462
- * determined.
1463
- */
1464
- typedef enum VolatileFunctionStatus
1465
- {
1466
- VOLATILITY_UNKNOWN = 0,
1467
- VOLATILITY_VOLATILE,
1468
- VOLATILITY_NOVOLATILE
1469
- } VolatileFunctionStatus;
1470
-
1471
- /*
1472
- * PathTarget
1473
- *
1474
- * This struct contains what we need to know during planning about the
1475
- * targetlist (output columns) that a Path will compute. Each RelOptInfo
1476
- * includes a default PathTarget, which its individual Paths may simply
1477
- * reference. However, in some cases a Path may compute outputs different
1478
- * from other Paths, and in that case we make a custom PathTarget for it.
1479
- * For example, an indexscan might return index expressions that would
1480
- * otherwise need to be explicitly calculated. (Note also that "upper"
1481
- * relations generally don't have useful default PathTargets.)
1482
- *
1483
- * exprs contains bare expressions; they do not have TargetEntry nodes on top,
1484
- * though those will appear in finished Plans.
1485
- *
1486
- * sortgrouprefs[] is an array of the same length as exprs, containing the
1487
- * corresponding sort/group refnos, or zeroes for expressions not referenced
1488
- * by sort/group clauses. If sortgrouprefs is NULL (which it generally is in
1489
- * RelOptInfo.reltarget targets; only upper-level Paths contain this info),
1490
- * we have not identified sort/group columns in this tlist. This allows us to
1491
- * deal with sort/group refnos when needed with less expense than including
1492
- * TargetEntry nodes in the exprs list.
1493
- */
1494
- typedef struct PathTarget
1495
- {
1496
- pg_node_attr(no_copy_equal, no_read, no_query_jumble)
1497
-
1498
- NodeTag type;
1499
-
1500
- /* list of expressions to be computed */
1501
- List *exprs;
1502
-
1503
- /* corresponding sort/group refnos, or 0 */
1504
- Index *sortgrouprefs pg_node_attr(array_size(exprs));
1505
-
1506
- /* cost of evaluating the expressions */
1507
- QualCost cost;
1508
-
1509
- /* estimated avg width of result tuples */
1510
- int width;
1511
-
1512
- /* indicates if exprs contain any volatile functions */
1513
- VolatileFunctionStatus has_volatile_expr;
1514
- } PathTarget;
1515
-
1516
- /* Convenience macro to get a sort/group refno from a PathTarget */
1517
- #define get_pathtarget_sortgroupref(target, colno) \
1518
- ((target)->sortgrouprefs ? (target)->sortgrouprefs[colno] : (Index) 0)
1519
-
1520
-
1521
- /*
1522
- * ParamPathInfo
1523
- *
1524
- * All parameterized paths for a given relation with given required outer rels
1525
- * link to a single ParamPathInfo, which stores common information such as
1526
- * the estimated rowcount for this parameterization. We do this partly to
1527
- * avoid recalculations, but mostly to ensure that the estimated rowcount
1528
- * is in fact the same for every such path.
1529
- *
1530
- * Note: ppi_clauses is only used in ParamPathInfos for base relation paths;
1531
- * in join cases it's NIL because the set of relevant clauses varies depending
1532
- * on how the join is formed. The relevant clauses will appear in each
1533
- * parameterized join path's joinrestrictinfo list, instead. ParamPathInfos
1534
- * for append relations don't bother with this, either.
1535
- *
1536
- * ppi_serials is the set of rinfo_serial numbers for quals that are enforced
1537
- * by this path. As with ppi_clauses, it's only maintained for baserels.
1538
- * (We could construct it on-the-fly from ppi_clauses, but it seems better
1539
- * to materialize a copy.)
1540
- */
1541
- typedef struct ParamPathInfo
1542
- {
1543
- pg_node_attr(no_copy_equal, no_read, no_query_jumble)
1544
-
1545
- NodeTag type;
1546
-
1547
- Relids ppi_req_outer; /* rels supplying parameters used by path */
1548
- Cardinality ppi_rows; /* estimated number of result tuples */
1549
- List *ppi_clauses; /* join clauses available from outer rels */
1550
- Bitmapset *ppi_serials; /* set of rinfo_serial for enforced quals */
1551
- } ParamPathInfo;
1552
-
1553
-
1554
- /*
1555
- * Type "Path" is used as-is for sequential-scan paths, as well as some other
1556
- * simple plan types that we don't need any extra information in the path for.
1557
- * For other path types it is the first component of a larger struct.
1558
- *
1559
- * "pathtype" is the NodeTag of the Plan node we could build from this Path.
1560
- * It is partially redundant with the Path's NodeTag, but allows us to use
1561
- * the same Path type for multiple Plan types when there is no need to
1562
- * distinguish the Plan type during path processing.
1563
- *
1564
- * "parent" identifies the relation this Path scans, and "pathtarget"
1565
- * describes the precise set of output columns the Path would compute.
1566
- * In simple cases all Paths for a given rel share the same targetlist,
1567
- * which we represent by having path->pathtarget equal to parent->reltarget.
1568
- *
1569
- * "param_info", if not NULL, links to a ParamPathInfo that identifies outer
1570
- * relation(s) that provide parameter values to each scan of this path.
1571
- * That means this path can only be joined to those rels by means of nestloop
1572
- * joins with this path on the inside. Also note that a parameterized path
1573
- * is responsible for testing all "movable" joinclauses involving this rel
1574
- * and the specified outer rel(s).
1575
- *
1576
- * "rows" is the same as parent->rows in simple paths, but in parameterized
1577
- * paths and UniquePaths it can be less than parent->rows, reflecting the
1578
- * fact that we've filtered by extra join conditions or removed duplicates.
1579
- *
1580
- * "pathkeys" is a List of PathKey nodes (see above), describing the sort
1581
- * ordering of the path's output rows.
1582
- *
1583
- * We do not support copying Path trees, mainly because the circular linkages
1584
- * between RelOptInfo and Path nodes can't be handled easily in a simple
1585
- * depth-first traversal. We also don't have read support at the moment.
1586
- */
1587
- typedef struct Path
1588
- {
1589
- pg_node_attr(no_copy_equal, no_read, no_query_jumble)
1590
-
1591
- NodeTag type;
1592
-
1593
- /* tag identifying scan/join method */
1594
- NodeTag pathtype;
1595
-
1596
- /*
1597
- * the relation this path can build
1598
- *
1599
- * We do NOT print the parent, else we'd be in infinite recursion. We can
1600
- * print the parent's relids for identification purposes, though.
1601
- */
1602
- RelOptInfo *parent pg_node_attr(write_only_relids);
1603
-
1604
- /*
1605
- * list of Vars/Exprs, cost, width
1606
- *
1607
- * We print the pathtarget only if it's not the default one for the rel.
1608
- */
1609
- PathTarget *pathtarget pg_node_attr(write_only_nondefault_pathtarget);
1610
-
1611
- /*
1612
- * parameterization info, or NULL if none
1613
- *
1614
- * We do not print the whole of param_info, since it's printed via
1615
- * RelOptInfo; it's sufficient and less cluttering to print just the
1616
- * required outer relids.
1617
- */
1618
- ParamPathInfo *param_info pg_node_attr(write_only_req_outer);
1619
-
1620
- /* engage parallel-aware logic? */
1621
- bool parallel_aware;
1622
- /* OK to use as part of parallel plan? */
1623
- bool parallel_safe;
1624
- /* desired # of workers; 0 = not parallel */
1625
- int parallel_workers;
1626
-
1627
- /* estimated size/costs for path (see costsize.c for more info) */
1628
- Cardinality rows; /* estimated number of result tuples */
1629
- Cost startup_cost; /* cost expended before fetching any tuples */
1630
- Cost total_cost; /* total cost (assuming all tuples fetched) */
1631
-
1632
- /* sort ordering of path's output; a List of PathKey nodes; see above */
1633
- List *pathkeys;
1634
- } Path;
1635
-
1636
- /* Macro for extracting a path's parameterization relids; beware double eval */
1637
- #define PATH_REQ_OUTER(path) \
1638
- ((path)->param_info ? (path)->param_info->ppi_req_outer : (Relids) NULL)
1639
-
1640
- /*----------
1641
- * IndexPath represents an index scan over a single index.
1642
- *
1643
- * This struct is used for both regular indexscans and index-only scans;
1644
- * path.pathtype is T_IndexScan or T_IndexOnlyScan to show which is meant.
1645
- *
1646
- * 'indexinfo' is the index to be scanned.
1647
- *
1648
- * 'indexclauses' is a list of IndexClause nodes, each representing one
1649
- * index-checkable restriction, with implicit AND semantics across the list.
1650
- * An empty list implies a full index scan.
1651
- *
1652
- * 'indexorderbys', if not NIL, is a list of ORDER BY expressions that have
1653
- * been found to be usable as ordering operators for an amcanorderbyop index.
1654
- * The list must match the path's pathkeys, ie, one expression per pathkey
1655
- * in the same order. These are not RestrictInfos, just bare expressions,
1656
- * since they generally won't yield booleans. It's guaranteed that each
1657
- * expression has the index key on the left side of the operator.
1658
- *
1659
- * 'indexorderbycols' is an integer list of index column numbers (zero-based)
1660
- * of the same length as 'indexorderbys', showing which index column each
1661
- * ORDER BY expression is meant to be used with. (There is no restriction
1662
- * on which index column each ORDER BY can be used with.)
1663
- *
1664
- * 'indexscandir' is one of:
1665
- * ForwardScanDirection: forward scan of an index
1666
- * BackwardScanDirection: backward scan of an ordered index
1667
- * Unordered indexes will always have an indexscandir of ForwardScanDirection.
1668
- *
1669
- * 'indextotalcost' and 'indexselectivity' are saved in the IndexPath so that
1670
- * we need not recompute them when considering using the same index in a
1671
- * bitmap index/heap scan (see BitmapHeapPath). The costs of the IndexPath
1672
- * itself represent the costs of an IndexScan or IndexOnlyScan plan type.
1673
- *----------
1674
- */
1675
- typedef struct IndexPath
1676
- {
1677
- Path path;
1678
- IndexOptInfo *indexinfo;
1679
- List *indexclauses;
1680
- List *indexorderbys;
1681
- List *indexorderbycols;
1682
- ScanDirection indexscandir;
1683
- Cost indextotalcost;
1684
- Selectivity indexselectivity;
1685
- } IndexPath;
1686
-
1687
- /*
1688
- * Each IndexClause references a RestrictInfo node from the query's WHERE
1689
- * or JOIN conditions, and shows how that restriction can be applied to
1690
- * the particular index. We support both indexclauses that are directly
1691
- * usable by the index machinery, which are typically of the form
1692
- * "indexcol OP pseudoconstant", and those from which an indexable qual
1693
- * can be derived. The simplest such transformation is that a clause
1694
- * of the form "pseudoconstant OP indexcol" can be commuted to produce an
1695
- * indexable qual (the index machinery expects the indexcol to be on the
1696
- * left always). Another example is that we might be able to extract an
1697
- * indexable range condition from a LIKE condition, as in "x LIKE 'foo%bar'"
1698
- * giving rise to "x >= 'foo' AND x < 'fop'". Derivation of such lossy
1699
- * conditions is done by a planner support function attached to the
1700
- * indexclause's top-level function or operator.
1701
- *
1702
- * indexquals is a list of RestrictInfos for the directly-usable index
1703
- * conditions associated with this IndexClause. In the simplest case
1704
- * it's a one-element list whose member is iclause->rinfo. Otherwise,
1705
- * it contains one or more directly-usable indexqual conditions extracted
1706
- * from the given clause. The 'lossy' flag indicates whether the
1707
- * indexquals are semantically equivalent to the original clause, or
1708
- * represent a weaker condition.
1709
- *
1710
- * Normally, indexcol is the index of the single index column the clause
1711
- * works on, and indexcols is NIL. But if the clause is a RowCompareExpr,
1712
- * indexcol is the index of the leading column, and indexcols is a list of
1713
- * all the affected columns. (Note that indexcols matches up with the
1714
- * columns of the actual indexable RowCompareExpr in indexquals, which
1715
- * might be different from the original in rinfo.)
1716
- *
1717
- * An IndexPath's IndexClause list is required to be ordered by index
1718
- * column, i.e. the indexcol values must form a nondecreasing sequence.
1719
- * (The order of multiple clauses for the same index column is unspecified.)
1720
- */
1721
- typedef struct IndexClause
1722
- {
1723
- pg_node_attr(no_copy_equal, no_read, no_query_jumble)
1724
-
1725
- NodeTag type;
1726
- struct RestrictInfo *rinfo; /* original restriction or join clause */
1727
- List *indexquals; /* indexqual(s) derived from it */
1728
- bool lossy; /* are indexquals a lossy version of clause? */
1729
- AttrNumber indexcol; /* index column the clause uses (zero-based) */
1730
- List *indexcols; /* multiple index columns, if RowCompare */
1731
- } IndexClause;
1732
-
1733
- /*
1734
- * BitmapHeapPath represents one or more indexscans that generate TID bitmaps
1735
- * instead of directly accessing the heap, followed by AND/OR combinations
1736
- * to produce a single bitmap, followed by a heap scan that uses the bitmap.
1737
- * Note that the output is always considered unordered, since it will come
1738
- * out in physical heap order no matter what the underlying indexes did.
1739
- *
1740
- * The individual indexscans are represented by IndexPath nodes, and any
1741
- * logic on top of them is represented by a tree of BitmapAndPath and
1742
- * BitmapOrPath nodes. Notice that we can use the same IndexPath node both
1743
- * to represent a regular (or index-only) index scan plan, and as the child
1744
- * of a BitmapHeapPath that represents scanning the same index using a
1745
- * BitmapIndexScan. The startup_cost and total_cost figures of an IndexPath
1746
- * always represent the costs to use it as a regular (or index-only)
1747
- * IndexScan. The costs of a BitmapIndexScan can be computed using the
1748
- * IndexPath's indextotalcost and indexselectivity.
1749
- */
1750
- typedef struct BitmapHeapPath
1751
- {
1752
- Path path;
1753
- Path *bitmapqual; /* IndexPath, BitmapAndPath, BitmapOrPath */
1754
- } BitmapHeapPath;
1755
-
1756
- /*
1757
- * BitmapAndPath represents a BitmapAnd plan node; it can only appear as
1758
- * part of the substructure of a BitmapHeapPath. The Path structure is
1759
- * a bit more heavyweight than we really need for this, but for simplicity
1760
- * we make it a derivative of Path anyway.
1761
- */
1762
- typedef struct BitmapAndPath
1763
- {
1764
- Path path;
1765
- List *bitmapquals; /* IndexPaths and BitmapOrPaths */
1766
- Selectivity bitmapselectivity;
1767
- } BitmapAndPath;
1768
-
1769
- /*
1770
- * BitmapOrPath represents a BitmapOr plan node; it can only appear as
1771
- * part of the substructure of a BitmapHeapPath. The Path structure is
1772
- * a bit more heavyweight than we really need for this, but for simplicity
1773
- * we make it a derivative of Path anyway.
1774
- */
1775
- typedef struct BitmapOrPath
1776
- {
1777
- Path path;
1778
- List *bitmapquals; /* IndexPaths and BitmapAndPaths */
1779
- Selectivity bitmapselectivity;
1780
- } BitmapOrPath;
1781
-
1782
- /*
1783
- * TidPath represents a scan by TID
1784
- *
1785
- * tidquals is an implicitly OR'ed list of qual expressions of the form
1786
- * "CTID = pseudoconstant", or "CTID = ANY(pseudoconstant_array)",
1787
- * or a CurrentOfExpr for the relation.
1788
- */
1789
- typedef struct TidPath
1790
- {
1791
- Path path;
1792
- List *tidquals; /* qual(s) involving CTID = something */
1793
- } TidPath;
1794
-
1795
- /*
1796
- * TidRangePath represents a scan by a contiguous range of TIDs
1797
- *
1798
- * tidrangequals is an implicitly AND'ed list of qual expressions of the form
1799
- * "CTID relop pseudoconstant", where relop is one of >,>=,<,<=.
1800
- */
1801
- typedef struct TidRangePath
1802
- {
1803
- Path path;
1804
- List *tidrangequals;
1805
- } TidRangePath;
1806
-
1807
- /*
1808
- * SubqueryScanPath represents a scan of an unflattened subquery-in-FROM
1809
- *
1810
- * Note that the subpath comes from a different planning domain; for example
1811
- * RTE indexes within it mean something different from those known to the
1812
- * SubqueryScanPath. path.parent->subroot is the planning context needed to
1813
- * interpret the subpath.
1814
- */
1815
- typedef struct SubqueryScanPath
1816
- {
1817
- Path path;
1818
- Path *subpath; /* path representing subquery execution */
1819
- } SubqueryScanPath;
1820
-
1821
- /*
1822
- * ForeignPath represents a potential scan of a foreign table, foreign join
1823
- * or foreign upper-relation.
1824
- *
1825
- * fdw_private stores FDW private data about the scan. While fdw_private is
1826
- * not actually touched by the core code during normal operations, it's
1827
- * generally a good idea to use a representation that can be dumped by
1828
- * nodeToString(), so that you can examine the structure during debugging
1829
- * with tools like pprint().
1830
- */
1831
- typedef struct ForeignPath
1832
- {
1833
- Path path;
1834
- Path *fdw_outerpath;
1835
- List *fdw_private;
1836
- } ForeignPath;
1837
-
1838
- /*
1839
- * CustomPath represents a table scan or a table join done by some out-of-core
1840
- * extension.
1841
- *
1842
- * We provide a set of hooks here - which the provider must take care to set
1843
- * up correctly - to allow extensions to supply their own methods of scanning
1844
- * a relation or joing relations. For example, a provider might provide GPU
1845
- * acceleration, a cache-based scan, or some other kind of logic we haven't
1846
- * dreamed up yet.
1847
- *
1848
- * CustomPaths can be injected into the planning process for a base or join
1849
- * relation by set_rel_pathlist_hook or set_join_pathlist_hook functions,
1850
- * respectively.
1851
- *
1852
- * Core code must avoid assuming that the CustomPath is only as large as
1853
- * the structure declared here; providers are allowed to make it the first
1854
- * element in a larger structure. (Since the planner never copies Paths,
1855
- * this doesn't add any complication.) However, for consistency with the
1856
- * FDW case, we provide a "custom_private" field in CustomPath; providers
1857
- * may prefer to use that rather than define another struct type.
1858
- */
1859
-
1860
- struct CustomPathMethods;
1861
-
1862
- typedef struct CustomPath
1863
- {
1864
- Path path;
1865
- uint32 flags; /* mask of CUSTOMPATH_* flags, see
1866
- * nodes/extensible.h */
1867
- List *custom_paths; /* list of child Path nodes, if any */
1868
- List *custom_private;
1869
- const struct CustomPathMethods *methods;
1870
- } CustomPath;
1871
-
1872
- /*
1873
- * AppendPath represents an Append plan, ie, successive execution of
1874
- * several member plans.
1875
- *
1876
- * For partial Append, 'subpaths' contains non-partial subpaths followed by
1877
- * partial subpaths.
1878
- *
1879
- * Note: it is possible for "subpaths" to contain only one, or even no,
1880
- * elements. These cases are optimized during create_append_plan.
1881
- * In particular, an AppendPath with no subpaths is a "dummy" path that
1882
- * is created to represent the case that a relation is provably empty.
1883
- * (This is a convenient representation because it means that when we build
1884
- * an appendrel and find that all its children have been excluded, no extra
1885
- * action is needed to recognize the relation as dummy.)
1886
- */
1887
- typedef struct AppendPath
1888
- {
1889
- Path path;
1890
- List *subpaths; /* list of component Paths */
1891
- /* Index of first partial path in subpaths; list_length(subpaths) if none */
1892
- int first_partial_path;
1893
- Cardinality limit_tuples; /* hard limit on output tuples, or -1 */
1894
- } AppendPath;
1895
-
1896
- #define IS_DUMMY_APPEND(p) \
1897
- (IsA((p), AppendPath) && ((AppendPath *) (p))->subpaths == NIL)
1898
-
1899
- /*
1900
- * A relation that's been proven empty will have one path that is dummy
1901
- * (but might have projection paths on top). For historical reasons,
1902
- * this is provided as a macro that wraps is_dummy_rel().
1903
- */
1904
- #define IS_DUMMY_REL(r) is_dummy_rel(r)
1905
- extern bool is_dummy_rel(RelOptInfo *rel);
1906
-
1907
- /*
1908
- * MergeAppendPath represents a MergeAppend plan, ie, the merging of sorted
1909
- * results from several member plans to produce similarly-sorted output.
1910
- */
1911
- typedef struct MergeAppendPath
1912
- {
1913
- Path path;
1914
- List *subpaths; /* list of component Paths */
1915
- Cardinality limit_tuples; /* hard limit on output tuples, or -1 */
1916
- } MergeAppendPath;
1917
-
1918
- /*
1919
- * GroupResultPath represents use of a Result plan node to compute the
1920
- * output of a degenerate GROUP BY case, wherein we know we should produce
1921
- * exactly one row, which might then be filtered by a HAVING qual.
1922
- *
1923
- * Note that quals is a list of bare clauses, not RestrictInfos.
1924
- */
1925
- typedef struct GroupResultPath
1926
- {
1927
- Path path;
1928
- List *quals;
1929
- } GroupResultPath;
1930
-
1931
- /*
1932
- * MaterialPath represents use of a Material plan node, i.e., caching of
1933
- * the output of its subpath. This is used when the subpath is expensive
1934
- * and needs to be scanned repeatedly, or when we need mark/restore ability
1935
- * and the subpath doesn't have it.
1936
- */
1937
- typedef struct MaterialPath
1938
- {
1939
- Path path;
1940
- Path *subpath;
1941
- } MaterialPath;
1942
-
1943
- /*
1944
- * MemoizePath represents a Memoize plan node, i.e., a cache that caches
1945
- * tuples from parameterized paths to save the underlying node from having to
1946
- * be rescanned for parameter values which are already cached.
1947
- */
1948
- typedef struct MemoizePath
1949
- {
1950
- Path path;
1951
- Path *subpath; /* outerpath to cache tuples from */
1952
- List *hash_operators; /* OIDs of hash equality ops for cache keys */
1953
- List *param_exprs; /* expressions that are cache keys */
1954
- bool singlerow; /* true if the cache entry is to be marked as
1955
- * complete after caching the first record. */
1956
- bool binary_mode; /* true when cache key should be compared bit
1957
- * by bit, false when using hash equality ops */
1958
- Cardinality calls; /* expected number of rescans */
1959
- uint32 est_entries; /* The maximum number of entries that the
1960
- * planner expects will fit in the cache, or 0
1961
- * if unknown */
1962
- } MemoizePath;
1963
-
1964
- /*
1965
- * UniquePath represents elimination of distinct rows from the output of
1966
- * its subpath.
1967
- *
1968
- * This can represent significantly different plans: either hash-based or
1969
- * sort-based implementation, or a no-op if the input path can be proven
1970
- * distinct already. The decision is sufficiently localized that it's not
1971
- * worth having separate Path node types. (Note: in the no-op case, we could
1972
- * eliminate the UniquePath node entirely and just return the subpath; but
1973
- * it's convenient to have a UniquePath in the path tree to signal upper-level
1974
- * routines that the input is known distinct.)
1975
- */
1976
- typedef enum UniquePathMethod
1977
- {
1978
- UNIQUE_PATH_NOOP, /* input is known unique already */
1979
- UNIQUE_PATH_HASH, /* use hashing */
1980
- UNIQUE_PATH_SORT /* use sorting */
1981
- } UniquePathMethod;
1982
-
1983
- typedef struct UniquePath
1984
- {
1985
- Path path;
1986
- Path *subpath;
1987
- UniquePathMethod umethod;
1988
- List *in_operators; /* equality operators of the IN clause */
1989
- List *uniq_exprs; /* expressions to be made unique */
1990
- } UniquePath;
1991
-
1992
- /*
1993
- * GatherPath runs several copies of a plan in parallel and collects the
1994
- * results. The parallel leader may also execute the plan, unless the
1995
- * single_copy flag is set.
1996
- */
1997
- typedef struct GatherPath
1998
- {
1999
- Path path;
2000
- Path *subpath; /* path for each worker */
2001
- bool single_copy; /* don't execute path more than once */
2002
- int num_workers; /* number of workers sought to help */
2003
- } GatherPath;
2004
-
2005
- /*
2006
- * GatherMergePath runs several copies of a plan in parallel and collects
2007
- * the results, preserving their common sort order.
2008
- */
2009
- typedef struct GatherMergePath
2010
- {
2011
- Path path;
2012
- Path *subpath; /* path for each worker */
2013
- int num_workers; /* number of workers sought to help */
2014
- } GatherMergePath;
2015
-
2016
-
2017
- /*
2018
- * All join-type paths share these fields.
2019
- */
2020
-
2021
- typedef struct JoinPath
2022
- {
2023
- pg_node_attr(abstract)
2024
-
2025
- Path path;
2026
-
2027
- JoinType jointype;
2028
-
2029
- bool inner_unique; /* each outer tuple provably matches no more
2030
- * than one inner tuple */
2031
-
2032
- Path *outerjoinpath; /* path for the outer side of the join */
2033
- Path *innerjoinpath; /* path for the inner side of the join */
2034
-
2035
- List *joinrestrictinfo; /* RestrictInfos to apply to join */
2036
-
2037
- /*
2038
- * See the notes for RelOptInfo and ParamPathInfo to understand why
2039
- * joinrestrictinfo is needed in JoinPath, and can't be merged into the
2040
- * parent RelOptInfo.
2041
- */
2042
- } JoinPath;
2043
-
2044
- /*
2045
- * A nested-loop path needs no special fields.
2046
- */
2047
-
2048
- typedef struct NestPath
2049
- {
2050
- JoinPath jpath;
2051
- } NestPath;
2052
-
2053
- /*
2054
- * A mergejoin path has these fields.
2055
- *
2056
- * Unlike other path types, a MergePath node doesn't represent just a single
2057
- * run-time plan node: it can represent up to four. Aside from the MergeJoin
2058
- * node itself, there can be a Sort node for the outer input, a Sort node
2059
- * for the inner input, and/or a Material node for the inner input. We could
2060
- * represent these nodes by separate path nodes, but considering how many
2061
- * different merge paths are investigated during a complex join problem,
2062
- * it seems better to avoid unnecessary palloc overhead.
2063
- *
2064
- * path_mergeclauses lists the clauses (in the form of RestrictInfos)
2065
- * that will be used in the merge.
2066
- *
2067
- * Note that the mergeclauses are a subset of the parent relation's
2068
- * restriction-clause list. Any join clauses that are not mergejoinable
2069
- * appear only in the parent's restrict list, and must be checked by a
2070
- * qpqual at execution time.
2071
- *
2072
- * outersortkeys (resp. innersortkeys) is NIL if the outer path
2073
- * (resp. inner path) is already ordered appropriately for the
2074
- * mergejoin. If it is not NIL then it is a PathKeys list describing
2075
- * the ordering that must be created by an explicit Sort node.
2076
- *
2077
- * skip_mark_restore is true if the executor need not do mark/restore calls.
2078
- * Mark/restore overhead is usually required, but can be skipped if we know
2079
- * that the executor need find only one match per outer tuple, and that the
2080
- * mergeclauses are sufficient to identify a match. In such cases the
2081
- * executor can immediately advance the outer relation after processing a
2082
- * match, and therefore it need never back up the inner relation.
2083
- *
2084
- * materialize_inner is true if a Material node should be placed atop the
2085
- * inner input. This may appear with or without an inner Sort step.
2086
- */
2087
-
2088
- typedef struct MergePath
2089
- {
2090
- JoinPath jpath;
2091
- List *path_mergeclauses; /* join clauses to be used for merge */
2092
- List *outersortkeys; /* keys for explicit sort, if any */
2093
- List *innersortkeys; /* keys for explicit sort, if any */
2094
- bool skip_mark_restore; /* can executor skip mark/restore? */
2095
- bool materialize_inner; /* add Materialize to inner? */
2096
- } MergePath;
2097
-
2098
- /*
2099
- * A hashjoin path has these fields.
2100
- *
2101
- * The remarks above for mergeclauses apply for hashclauses as well.
2102
- *
2103
- * Hashjoin does not care what order its inputs appear in, so we have
2104
- * no need for sortkeys.
2105
- */
2106
-
2107
- typedef struct HashPath
2108
- {
2109
- JoinPath jpath;
2110
- List *path_hashclauses; /* join clauses used for hashing */
2111
- int num_batches; /* number of batches expected */
2112
- Cardinality inner_rows_total; /* total inner rows expected */
2113
- } HashPath;
2114
-
2115
- /*
2116
- * ProjectionPath represents a projection (that is, targetlist computation)
2117
- *
2118
- * Nominally, this path node represents using a Result plan node to do a
2119
- * projection step. However, if the input plan node supports projection,
2120
- * we can just modify its output targetlist to do the required calculations
2121
- * directly, and not need a Result. In some places in the planner we can just
2122
- * jam the desired PathTarget into the input path node (and adjust its cost
2123
- * accordingly), so we don't need a ProjectionPath. But in other places
2124
- * it's necessary to not modify the input path node, so we need a separate
2125
- * ProjectionPath node, which is marked dummy to indicate that we intend to
2126
- * assign the work to the input plan node. The estimated cost for the
2127
- * ProjectionPath node will account for whether a Result will be used or not.
2128
- */
2129
- typedef struct ProjectionPath
2130
- {
2131
- Path path;
2132
- Path *subpath; /* path representing input source */
2133
- bool dummypp; /* true if no separate Result is needed */
2134
- } ProjectionPath;
2135
-
2136
- /*
2137
- * ProjectSetPath represents evaluation of a targetlist that includes
2138
- * set-returning function(s), which will need to be implemented by a
2139
- * ProjectSet plan node.
2140
- */
2141
- typedef struct ProjectSetPath
2142
- {
2143
- Path path;
2144
- Path *subpath; /* path representing input source */
2145
- } ProjectSetPath;
2146
-
2147
- /*
2148
- * SortPath represents an explicit sort step
2149
- *
2150
- * The sort keys are, by definition, the same as path.pathkeys.
2151
- *
2152
- * Note: the Sort plan node cannot project, so path.pathtarget must be the
2153
- * same as the input's pathtarget.
2154
- */
2155
- typedef struct SortPath
2156
- {
2157
- Path path;
2158
- Path *subpath; /* path representing input source */
2159
- } SortPath;
2160
-
2161
- /*
2162
- * IncrementalSortPath represents an incremental sort step
2163
- *
2164
- * This is like a regular sort, except some leading key columns are assumed
2165
- * to be ordered already.
2166
- */
2167
- typedef struct IncrementalSortPath
2168
- {
2169
- SortPath spath;
2170
- int nPresortedCols; /* number of presorted columns */
2171
- } IncrementalSortPath;
2172
-
2173
- /*
2174
- * GroupPath represents grouping (of presorted input)
2175
- *
2176
- * groupClause represents the columns to be grouped on; the input path
2177
- * must be at least that well sorted.
2178
- *
2179
- * We can also apply a qual to the grouped rows (equivalent of HAVING)
2180
- */
2181
- typedef struct GroupPath
2182
- {
2183
- Path path;
2184
- Path *subpath; /* path representing input source */
2185
- List *groupClause; /* a list of SortGroupClause's */
2186
- List *qual; /* quals (HAVING quals), if any */
2187
- } GroupPath;
2188
-
2189
- /*
2190
- * UpperUniquePath represents adjacent-duplicate removal (in presorted input)
2191
- *
2192
- * The columns to be compared are the first numkeys columns of the path's
2193
- * pathkeys. The input is presumed already sorted that way.
2194
- */
2195
- typedef struct UpperUniquePath
2196
- {
2197
- Path path;
2198
- Path *subpath; /* path representing input source */
2199
- int numkeys; /* number of pathkey columns to compare */
2200
- } UpperUniquePath;
2201
-
2202
- /*
2203
- * AggPath represents generic computation of aggregate functions
2204
- *
2205
- * This may involve plain grouping (but not grouping sets), using either
2206
- * sorted or hashed grouping; for the AGG_SORTED case, the input must be
2207
- * appropriately presorted.
2208
- */
2209
- typedef struct AggPath
2210
- {
2211
- Path path;
2212
- Path *subpath; /* path representing input source */
2213
- AggStrategy aggstrategy; /* basic strategy, see nodes.h */
2214
- AggSplit aggsplit; /* agg-splitting mode, see nodes.h */
2215
- Cardinality numGroups; /* estimated number of groups in input */
2216
- uint64 transitionSpace; /* for pass-by-ref transition data */
2217
- List *groupClause; /* a list of SortGroupClause's */
2218
- List *qual; /* quals (HAVING quals), if any */
2219
- } AggPath;
2220
-
2221
- /*
2222
- * Various annotations used for grouping sets in the planner.
2223
- */
2224
-
2225
- typedef struct GroupingSetData
2226
- {
2227
- pg_node_attr(no_copy_equal, no_read, no_query_jumble)
2228
-
2229
- NodeTag type;
2230
- List *set; /* grouping set as list of sortgrouprefs */
2231
- Cardinality numGroups; /* est. number of result groups */
2232
- } GroupingSetData;
2233
-
2234
- typedef struct RollupData
2235
- {
2236
- pg_node_attr(no_copy_equal, no_read, no_query_jumble)
2237
-
2238
- NodeTag type;
2239
- List *groupClause; /* applicable subset of parse->groupClause */
2240
- List *gsets; /* lists of integer indexes into groupClause */
2241
- List *gsets_data; /* list of GroupingSetData */
2242
- Cardinality numGroups; /* est. number of result groups */
2243
- bool hashable; /* can be hashed */
2244
- bool is_hashed; /* to be implemented as a hashagg */
2245
- } RollupData;
2246
-
2247
- /*
2248
- * GroupingSetsPath represents a GROUPING SETS aggregation
2249
- */
2250
-
2251
- typedef struct GroupingSetsPath
2252
- {
2253
- Path path;
2254
- Path *subpath; /* path representing input source */
2255
- AggStrategy aggstrategy; /* basic strategy */
2256
- List *rollups; /* list of RollupData */
2257
- List *qual; /* quals (HAVING quals), if any */
2258
- uint64 transitionSpace; /* for pass-by-ref transition data */
2259
- } GroupingSetsPath;
2260
-
2261
- /*
2262
- * MinMaxAggPath represents computation of MIN/MAX aggregates from indexes
2263
- */
2264
- typedef struct MinMaxAggPath
2265
- {
2266
- Path path;
2267
- List *mmaggregates; /* list of MinMaxAggInfo */
2268
- List *quals; /* HAVING quals, if any */
2269
- } MinMaxAggPath;
2270
-
2271
- /*
2272
- * WindowAggPath represents generic computation of window functions
2273
- */
2274
- typedef struct WindowAggPath
2275
- {
2276
- Path path;
2277
- Path *subpath; /* path representing input source */
2278
- WindowClause *winclause; /* WindowClause we'll be using */
2279
- List *qual; /* lower-level WindowAgg runconditions */
2280
- bool topwindow; /* false for all apart from the WindowAgg
2281
- * that's closest to the root of the plan */
2282
- } WindowAggPath;
2283
-
2284
- /*
2285
- * SetOpPath represents a set-operation, that is INTERSECT or EXCEPT
2286
- */
2287
- typedef struct SetOpPath
2288
- {
2289
- Path path;
2290
- Path *subpath; /* path representing input source */
2291
- SetOpCmd cmd; /* what to do, see nodes.h */
2292
- SetOpStrategy strategy; /* how to do it, see nodes.h */
2293
- List *distinctList; /* SortGroupClauses identifying target cols */
2294
- AttrNumber flagColIdx; /* where is the flag column, if any */
2295
- int firstFlag; /* flag value for first input relation */
2296
- Cardinality numGroups; /* estimated number of groups in input */
2297
- } SetOpPath;
2298
-
2299
- /*
2300
- * RecursiveUnionPath represents a recursive UNION node
2301
- */
2302
- typedef struct RecursiveUnionPath
2303
- {
2304
- Path path;
2305
- Path *leftpath; /* paths representing input sources */
2306
- Path *rightpath;
2307
- List *distinctList; /* SortGroupClauses identifying target cols */
2308
- int wtParam; /* ID of Param representing work table */
2309
- Cardinality numGroups; /* estimated number of groups in input */
2310
- } RecursiveUnionPath;
2311
-
2312
- /*
2313
- * LockRowsPath represents acquiring row locks for SELECT FOR UPDATE/SHARE
2314
- */
2315
- typedef struct LockRowsPath
2316
- {
2317
- Path path;
2318
- Path *subpath; /* path representing input source */
2319
- List *rowMarks; /* a list of PlanRowMark's */
2320
- int epqParam; /* ID of Param for EvalPlanQual re-eval */
2321
- } LockRowsPath;
2322
-
2323
- /*
2324
- * ModifyTablePath represents performing INSERT/UPDATE/DELETE/MERGE
2325
- *
2326
- * We represent most things that will be in the ModifyTable plan node
2327
- * literally, except we have a child Path not Plan. But analysis of the
2328
- * OnConflictExpr is deferred to createplan.c, as is collection of FDW data.
2329
- */
2330
- typedef struct ModifyTablePath
2331
- {
2332
- Path path;
2333
- Path *subpath; /* Path producing source data */
2334
- CmdType operation; /* INSERT, UPDATE, DELETE, or MERGE */
2335
- bool canSetTag; /* do we set the command tag/es_processed? */
2336
- Index nominalRelation; /* Parent RT index for use of EXPLAIN */
2337
- Index rootRelation; /* Root RT index, if partitioned/inherited */
2338
- bool partColsUpdated; /* some part key in hierarchy updated? */
2339
- List *resultRelations; /* integer list of RT indexes */
2340
- List *updateColnosLists; /* per-target-table update_colnos lists */
2341
- List *withCheckOptionLists; /* per-target-table WCO lists */
2342
- List *returningLists; /* per-target-table RETURNING tlists */
2343
- List *rowMarks; /* PlanRowMarks (non-locking only) */
2344
- OnConflictExpr *onconflict; /* ON CONFLICT clause, or NULL */
2345
- int epqParam; /* ID of Param for EvalPlanQual re-eval */
2346
- List *mergeActionLists; /* per-target-table lists of actions for
2347
- * MERGE */
2348
- } ModifyTablePath;
2349
-
2350
- /*
2351
- * LimitPath represents applying LIMIT/OFFSET restrictions
2352
- */
2353
- typedef struct LimitPath
2354
- {
2355
- Path path;
2356
- Path *subpath; /* path representing input source */
2357
- Node *limitOffset; /* OFFSET parameter, or NULL if none */
2358
- Node *limitCount; /* COUNT parameter, or NULL if none */
2359
- LimitOption limitOption; /* FETCH FIRST with ties or exact number */
2360
- } LimitPath;
2361
-
2362
-
2363
- /*
2364
- * Restriction clause info.
2365
- *
2366
- * We create one of these for each AND sub-clause of a restriction condition
2367
- * (WHERE or JOIN/ON clause). Since the restriction clauses are logically
2368
- * ANDed, we can use any one of them or any subset of them to filter out
2369
- * tuples, without having to evaluate the rest. The RestrictInfo node itself
2370
- * stores data used by the optimizer while choosing the best query plan.
2371
- *
2372
- * If a restriction clause references a single base relation, it will appear
2373
- * in the baserestrictinfo list of the RelOptInfo for that base rel.
2374
- *
2375
- * If a restriction clause references more than one base+OJ relation, it will
2376
- * appear in the joininfo list of every RelOptInfo that describes a strict
2377
- * subset of the relations mentioned in the clause. The joininfo lists are
2378
- * used to drive join tree building by selecting plausible join candidates.
2379
- * The clause cannot actually be applied until we have built a join rel
2380
- * containing all the relations it references, however.
2381
- *
2382
- * When we construct a join rel that includes all the relations referenced
2383
- * in a multi-relation restriction clause, we place that clause into the
2384
- * joinrestrictinfo lists of paths for the join rel, if neither left nor
2385
- * right sub-path includes all relations referenced in the clause. The clause
2386
- * will be applied at that join level, and will not propagate any further up
2387
- * the join tree. (Note: the "predicate migration" code was once intended to
2388
- * push restriction clauses up and down the plan tree based on evaluation
2389
- * costs, but it's dead code and is unlikely to be resurrected in the
2390
- * foreseeable future.)
2391
- *
2392
- * Note that in the presence of more than two rels, a multi-rel restriction
2393
- * might reach different heights in the join tree depending on the join
2394
- * sequence we use. So, these clauses cannot be associated directly with
2395
- * the join RelOptInfo, but must be kept track of on a per-join-path basis.
2396
- *
2397
- * RestrictInfos that represent equivalence conditions (i.e., mergejoinable
2398
- * equalities that are not outerjoin-delayed) are handled a bit differently.
2399
- * Initially we attach them to the EquivalenceClasses that are derived from
2400
- * them. When we construct a scan or join path, we look through all the
2401
- * EquivalenceClasses and generate derived RestrictInfos representing the
2402
- * minimal set of conditions that need to be checked for this particular scan
2403
- * or join to enforce that all members of each EquivalenceClass are in fact
2404
- * equal in all rows emitted by the scan or join.
2405
- *
2406
- * The clause_relids field lists the base plus outer-join RT indexes that
2407
- * actually appear in the clause. required_relids lists the minimum set of
2408
- * relids needed to evaluate the clause; while this is often equal to
2409
- * clause_relids, it can be more. We will add relids to required_relids when
2410
- * we need to force an outer join ON clause to be evaluated exactly at the
2411
- * level of the outer join, which is true except when it is a "degenerate"
2412
- * condition that references only Vars from the nullable side of the join.
2413
- *
2414
- * RestrictInfo nodes contain a flag to indicate whether a qual has been
2415
- * pushed down to a lower level than its original syntactic placement in the
2416
- * join tree would suggest. If an outer join prevents us from pushing a qual
2417
- * down to its "natural" semantic level (the level associated with just the
2418
- * base rels used in the qual) then we mark the qual with a "required_relids"
2419
- * value including more than just the base rels it actually uses. By
2420
- * pretending that the qual references all the rels required to form the outer
2421
- * join, we prevent it from being evaluated below the outer join's joinrel.
2422
- * When we do form the outer join's joinrel, we still need to distinguish
2423
- * those quals that are actually in that join's JOIN/ON condition from those
2424
- * that appeared elsewhere in the tree and were pushed down to the join rel
2425
- * because they used no other rels. That's what the is_pushed_down flag is
2426
- * for; it tells us that a qual is not an OUTER JOIN qual for the set of base
2427
- * rels listed in required_relids. A clause that originally came from WHERE
2428
- * or an INNER JOIN condition will *always* have its is_pushed_down flag set.
2429
- * It's possible for an OUTER JOIN clause to be marked is_pushed_down too,
2430
- * if we decide that it can be pushed down into the nullable side of the join.
2431
- * In that case it acts as a plain filter qual for wherever it gets evaluated.
2432
- * (In short, is_pushed_down is only false for non-degenerate outer join
2433
- * conditions. Possibly we should rename it to reflect that meaning? But
2434
- * see also the comments for RINFO_IS_PUSHED_DOWN, below.)
2435
- *
2436
- * There is also an incompatible_relids field, which is a set of outer-join
2437
- * relids above which we cannot evaluate the clause (because they might null
2438
- * Vars it uses that should not be nulled yet). In principle this could be
2439
- * filled in any RestrictInfo as the set of OJ relids that appear above the
2440
- * clause and null Vars that it uses. In practice we only bother to populate
2441
- * it for "clone" clauses, as it's currently only needed to prevent multiple
2442
- * clones of the same clause from being accepted for evaluation at the same
2443
- * join level.
2444
- *
2445
- * There is also an outer_relids field, which is NULL except for outer join
2446
- * clauses; for those, it is the set of relids on the outer side of the
2447
- * clause's outer join. (These are rels that the clause cannot be applied to
2448
- * in parameterized scans, since pushing it into the join's outer side would
2449
- * lead to wrong answers.)
2450
- *
2451
- * To handle security-barrier conditions efficiently, we mark RestrictInfo
2452
- * nodes with a security_level field, in which higher values identify clauses
2453
- * coming from less-trusted sources. The exact semantics are that a clause
2454
- * cannot be evaluated before another clause with a lower security_level value
2455
- * unless the first clause is leakproof. As with outer-join clauses, this
2456
- * creates a reason for clauses to sometimes need to be evaluated higher in
2457
- * the join tree than their contents would suggest; and even at a single plan
2458
- * node, this rule constrains the order of application of clauses.
2459
- *
2460
- * In general, the referenced clause might be arbitrarily complex. The
2461
- * kinds of clauses we can handle as indexscan quals, mergejoin clauses,
2462
- * or hashjoin clauses are limited (e.g., no volatile functions). The code
2463
- * for each kind of path is responsible for identifying the restrict clauses
2464
- * it can use and ignoring the rest. Clauses not implemented by an indexscan,
2465
- * mergejoin, or hashjoin will be placed in the plan qual or joinqual field
2466
- * of the finished Plan node, where they will be enforced by general-purpose
2467
- * qual-expression-evaluation code. (But we are still entitled to count
2468
- * their selectivity when estimating the result tuple count, if we
2469
- * can guess what it is...)
2470
- *
2471
- * When the referenced clause is an OR clause, we generate a modified copy
2472
- * in which additional RestrictInfo nodes are inserted below the top-level
2473
- * OR/AND structure. This is a convenience for OR indexscan processing:
2474
- * indexquals taken from either the top level or an OR subclause will have
2475
- * associated RestrictInfo nodes.
2476
- *
2477
- * The can_join flag is set true if the clause looks potentially useful as
2478
- * a merge or hash join clause, that is if it is a binary opclause with
2479
- * nonoverlapping sets of relids referenced in the left and right sides.
2480
- * (Whether the operator is actually merge or hash joinable isn't checked,
2481
- * however.)
2482
- *
2483
- * The pseudoconstant flag is set true if the clause contains no Vars of
2484
- * the current query level and no volatile functions. Such a clause can be
2485
- * pulled out and used as a one-time qual in a gating Result node. We keep
2486
- * pseudoconstant clauses in the same lists as other RestrictInfos so that
2487
- * the regular clause-pushing machinery can assign them to the correct join
2488
- * level, but they need to be treated specially for cost and selectivity
2489
- * estimates. Note that a pseudoconstant clause can never be an indexqual
2490
- * or merge or hash join clause, so it's of no interest to large parts of
2491
- * the planner.
2492
- *
2493
- * When we generate multiple versions of a clause so as to have versions
2494
- * that will work after commuting some left joins per outer join identity 3,
2495
- * we mark the one with the fewest nullingrels bits with has_clone = true,
2496
- * and the rest with is_clone = true. This allows proper filtering of
2497
- * these redundant clauses, so that we apply only one version of them.
2498
- *
2499
- * When join clauses are generated from EquivalenceClasses, there may be
2500
- * several equally valid ways to enforce join equivalence, of which we need
2501
- * apply only one. We mark clauses of this kind by setting parent_ec to
2502
- * point to the generating EquivalenceClass. Multiple clauses with the same
2503
- * parent_ec in the same join are redundant.
2504
- *
2505
- * Most fields are ignored for equality, since they may not be set yet, and
2506
- * should be derivable from the clause anyway.
2507
- *
2508
- * parent_ec, left_ec, right_ec are not printed, lest it lead to infinite
2509
- * recursion in plan tree dump.
2510
- */
2511
-
2512
- typedef struct RestrictInfo
2513
- {
2514
- pg_node_attr(no_read, no_query_jumble)
2515
-
2516
- NodeTag type;
2517
-
2518
- /* the represented clause of WHERE or JOIN */
2519
- Expr *clause;
2520
-
2521
- /* true if clause was pushed down in level */
2522
- bool is_pushed_down;
2523
-
2524
- /* see comment above */
2525
- bool can_join pg_node_attr(equal_ignore);
2526
-
2527
- /* see comment above */
2528
- bool pseudoconstant pg_node_attr(equal_ignore);
2529
-
2530
- /* see comment above */
2531
- bool has_clone;
2532
- bool is_clone;
2533
-
2534
- /* true if known to contain no leaked Vars */
2535
- bool leakproof pg_node_attr(equal_ignore);
2536
-
2537
- /* indicates if clause contains any volatile functions */
2538
- VolatileFunctionStatus has_volatile pg_node_attr(equal_ignore);
2539
-
2540
- /* see comment above */
2541
- Index security_level;
2542
-
2543
- /* number of base rels in clause_relids */
2544
- int num_base_rels pg_node_attr(equal_ignore);
2545
-
2546
- /* The relids (varnos+varnullingrels) actually referenced in the clause: */
2547
- Relids clause_relids pg_node_attr(equal_ignore);
2548
-
2549
- /* The set of relids required to evaluate the clause: */
2550
- Relids required_relids;
2551
-
2552
- /* Relids above which we cannot evaluate the clause (see comment above) */
2553
- Relids incompatible_relids;
2554
-
2555
- /* If an outer-join clause, the outer-side relations, else NULL: */
2556
- Relids outer_relids;
2557
-
2558
- /*
2559
- * Relids in the left/right side of the clause. These fields are set for
2560
- * any binary opclause.
2561
- */
2562
- Relids left_relids pg_node_attr(equal_ignore);
2563
- Relids right_relids pg_node_attr(equal_ignore);
2564
-
2565
- /*
2566
- * Modified clause with RestrictInfos. This field is NULL unless clause
2567
- * is an OR clause.
2568
- */
2569
- Expr *orclause pg_node_attr(equal_ignore);
2570
-
2571
- /*----------
2572
- * Serial number of this RestrictInfo. This is unique within the current
2573
- * PlannerInfo context, with a few critical exceptions:
2574
- * 1. When we generate multiple clones of the same qual condition to
2575
- * cope with outer join identity 3, all the clones get the same serial
2576
- * number. This reflects that we only want to apply one of them in any
2577
- * given plan.
2578
- * 2. If we manufacture a commuted version of a qual to use as an index
2579
- * condition, it copies the original's rinfo_serial, since it is in
2580
- * practice the same condition.
2581
- * 3. RestrictInfos made for a child relation copy their parent's
2582
- * rinfo_serial. Likewise, when an EquivalenceClass makes a derived
2583
- * equality clause for a child relation, it copies the rinfo_serial of
2584
- * the matching equality clause for the parent. This allows detection
2585
- * of redundant pushed-down equality clauses.
2586
- *----------
2587
- */
2588
- int rinfo_serial;
2589
-
2590
- /*
2591
- * Generating EquivalenceClass. This field is NULL unless clause is
2592
- * potentially redundant.
2593
- */
2594
- EquivalenceClass *parent_ec pg_node_attr(copy_as_scalar, equal_ignore, read_write_ignore);
2595
-
2596
- /*
2597
- * cache space for cost and selectivity
2598
- */
2599
-
2600
- /* eval cost of clause; -1 if not yet set */
2601
- QualCost eval_cost pg_node_attr(equal_ignore);
2602
-
2603
- /* selectivity for "normal" (JOIN_INNER) semantics; -1 if not yet set */
2604
- Selectivity norm_selec pg_node_attr(equal_ignore);
2605
- /* selectivity for outer join semantics; -1 if not yet set */
2606
- Selectivity outer_selec pg_node_attr(equal_ignore);
2607
-
2608
- /*
2609
- * opfamilies containing clause operator; valid if clause is
2610
- * mergejoinable, else NIL
2611
- */
2612
- List *mergeopfamilies pg_node_attr(equal_ignore);
2613
-
2614
- /*
2615
- * cache space for mergeclause processing; NULL if not yet set
2616
- */
2617
-
2618
- /* EquivalenceClass containing lefthand */
2619
- EquivalenceClass *left_ec pg_node_attr(copy_as_scalar, equal_ignore, read_write_ignore);
2620
- /* EquivalenceClass containing righthand */
2621
- EquivalenceClass *right_ec pg_node_attr(copy_as_scalar, equal_ignore, read_write_ignore);
2622
- /* EquivalenceMember for lefthand */
2623
- EquivalenceMember *left_em pg_node_attr(copy_as_scalar, equal_ignore);
2624
- /* EquivalenceMember for righthand */
2625
- EquivalenceMember *right_em pg_node_attr(copy_as_scalar, equal_ignore);
2626
-
2627
- /*
2628
- * List of MergeScanSelCache structs. Those aren't Nodes, so hard to
2629
- * copy; instead replace with NIL. That has the effect that copying will
2630
- * just reset the cache. Likewise, can't compare or print them.
2631
- */
2632
- List *scansel_cache pg_node_attr(copy_as(NIL), equal_ignore, read_write_ignore);
2633
-
2634
- /*
2635
- * transient workspace for use while considering a specific join path; T =
2636
- * outer var on left, F = on right
2637
- */
2638
- bool outer_is_left pg_node_attr(equal_ignore);
2639
-
2640
- /*
2641
- * copy of clause operator; valid if clause is hashjoinable, else
2642
- * InvalidOid
2643
- */
2644
- Oid hashjoinoperator pg_node_attr(equal_ignore);
2645
-
2646
- /*
2647
- * cache space for hashclause processing; -1 if not yet set
2648
- */
2649
- /* avg bucketsize of left side */
2650
- Selectivity left_bucketsize pg_node_attr(equal_ignore);
2651
- /* avg bucketsize of right side */
2652
- Selectivity right_bucketsize pg_node_attr(equal_ignore);
2653
- /* left side's most common val's freq */
2654
- Selectivity left_mcvfreq pg_node_attr(equal_ignore);
2655
- /* right side's most common val's freq */
2656
- Selectivity right_mcvfreq pg_node_attr(equal_ignore);
2657
-
2658
- /* hash equality operators used for memoize nodes, else InvalidOid */
2659
- Oid left_hasheqoperator pg_node_attr(equal_ignore);
2660
- Oid right_hasheqoperator pg_node_attr(equal_ignore);
2661
- } RestrictInfo;
2662
-
2663
- /*
2664
- * This macro embodies the correct way to test whether a RestrictInfo is
2665
- * "pushed down" to a given outer join, that is, should be treated as a filter
2666
- * clause rather than a join clause at that outer join. This is certainly so
2667
- * if is_pushed_down is true; but examining that is not sufficient anymore,
2668
- * because outer-join clauses will get pushed down to lower outer joins when
2669
- * we generate a path for the lower outer join that is parameterized by the
2670
- * LHS of the upper one. We can detect such a clause by noting that its
2671
- * required_relids exceed the scope of the join.
2672
- */
2673
- #define RINFO_IS_PUSHED_DOWN(rinfo, joinrelids) \
2674
- ((rinfo)->is_pushed_down || \
2675
- !bms_is_subset((rinfo)->required_relids, joinrelids))
2676
-
2677
- /*
2678
- * Since mergejoinscansel() is a relatively expensive function, and would
2679
- * otherwise be invoked many times while planning a large join tree,
2680
- * we go out of our way to cache its results. Each mergejoinable
2681
- * RestrictInfo carries a list of the specific sort orderings that have
2682
- * been considered for use with it, and the resulting selectivities.
2683
- */
2684
- typedef struct MergeScanSelCache
2685
- {
2686
- /* Ordering details (cache lookup key) */
2687
- Oid opfamily; /* btree opfamily defining the ordering */
2688
- Oid collation; /* collation for the ordering */
2689
- int strategy; /* sort direction (ASC or DESC) */
2690
- bool nulls_first; /* do NULLs come before normal values? */
2691
- /* Results */
2692
- Selectivity leftstartsel; /* first-join fraction for clause left side */
2693
- Selectivity leftendsel; /* last-join fraction for clause left side */
2694
- Selectivity rightstartsel; /* first-join fraction for clause right side */
2695
- Selectivity rightendsel; /* last-join fraction for clause right side */
2696
- } MergeScanSelCache;
2697
-
2698
- /*
2699
- * Placeholder node for an expression to be evaluated below the top level
2700
- * of a plan tree. This is used during planning to represent the contained
2701
- * expression. At the end of the planning process it is replaced by either
2702
- * the contained expression or a Var referring to a lower-level evaluation of
2703
- * the contained expression. Generally the evaluation occurs below an outer
2704
- * join, and Var references above the outer join might thereby yield NULL
2705
- * instead of the expression value.
2706
- *
2707
- * phrels and phlevelsup correspond to the varno/varlevelsup fields of a
2708
- * plain Var, except that phrels has to be a relid set since the evaluation
2709
- * level of a PlaceHolderVar might be a join rather than a base relation.
2710
- * Likewise, phnullingrels corresponds to varnullingrels.
2711
- *
2712
- * Although the planner treats this as an expression node type, it is not
2713
- * recognized by the parser or executor, so we declare it here rather than
2714
- * in primnodes.h.
2715
- *
2716
- * We intentionally do not compare phexpr. Two PlaceHolderVars with the
2717
- * same ID and levelsup should be considered equal even if the contained
2718
- * expressions have managed to mutate to different states. This will
2719
- * happen during final plan construction when there are nested PHVs, since
2720
- * the inner PHV will get replaced by a Param in some copies of the outer
2721
- * PHV. Another way in which it can happen is that initplan sublinks
2722
- * could get replaced by differently-numbered Params when sublink folding
2723
- * is done. (The end result of such a situation would be some
2724
- * unreferenced initplans, which is annoying but not really a problem.)
2725
- * On the same reasoning, there is no need to examine phrels. But we do
2726
- * need to compare phnullingrels, as that represents effects that are
2727
- * external to the original value of the PHV.
2728
- */
2729
-
2730
- typedef struct PlaceHolderVar
2731
- {
2732
- pg_node_attr(no_query_jumble)
2733
-
2734
- Expr xpr;
2735
-
2736
- /* the represented expression */
2737
- Expr *phexpr pg_node_attr(equal_ignore);
2738
-
2739
- /* base+OJ relids syntactically within expr src */
2740
- Relids phrels pg_node_attr(equal_ignore);
2741
-
2742
- /* RT indexes of outer joins that can null PHV's value */
2743
- Relids phnullingrels;
2744
-
2745
- /* ID for PHV (unique within planner run) */
2746
- Index phid;
2747
-
2748
- /* > 0 if PHV belongs to outer query */
2749
- Index phlevelsup;
2750
- } PlaceHolderVar;
2751
-
2752
- /*
2753
- * "Special join" info.
2754
- *
2755
- * One-sided outer joins constrain the order of joining partially but not
2756
- * completely. We flatten such joins into the planner's top-level list of
2757
- * relations to join, but record information about each outer join in a
2758
- * SpecialJoinInfo struct. These structs are kept in the PlannerInfo node's
2759
- * join_info_list.
2760
- *
2761
- * Similarly, semijoins and antijoins created by flattening IN (subselect)
2762
- * and EXISTS(subselect) clauses create partial constraints on join order.
2763
- * These are likewise recorded in SpecialJoinInfo structs.
2764
- *
2765
- * We make SpecialJoinInfos for FULL JOINs even though there is no flexibility
2766
- * of planning for them, because this simplifies make_join_rel()'s API.
2767
- *
2768
- * min_lefthand and min_righthand are the sets of base+OJ relids that must be
2769
- * available on each side when performing the special join.
2770
- * It is not valid for either min_lefthand or min_righthand to be empty sets;
2771
- * if they were, this would break the logic that enforces join order.
2772
- *
2773
- * syn_lefthand and syn_righthand are the sets of base+OJ relids that are
2774
- * syntactically below this special join. (These are needed to help compute
2775
- * min_lefthand and min_righthand for higher joins.)
2776
- *
2777
- * jointype is never JOIN_RIGHT; a RIGHT JOIN is handled by switching
2778
- * the inputs to make it a LEFT JOIN. It's never JOIN_RIGHT_ANTI either.
2779
- * So the allowed values of jointype in a join_info_list member are only
2780
- * LEFT, FULL, SEMI, or ANTI.
2781
- *
2782
- * ojrelid is the RT index of the join RTE representing this outer join,
2783
- * if there is one. It is zero when jointype is INNER or SEMI, and can be
2784
- * zero for jointype ANTI (if the join was transformed from a SEMI join).
2785
- * One use for this field is that when constructing the output targetlist of a
2786
- * join relation that implements this OJ, we add ojrelid to the varnullingrels
2787
- * and phnullingrels fields of nullable (RHS) output columns, so that the
2788
- * output Vars and PlaceHolderVars correctly reflect the nulling that has
2789
- * potentially happened to them.
2790
- *
2791
- * commute_above_l is filled with the relids of syntactically-higher outer
2792
- * joins that have been found to commute with this one per outer join identity
2793
- * 3 (see optimizer/README), when this join is in the LHS of the upper join
2794
- * (so, this is the lower join in the first form of the identity).
2795
- *
2796
- * commute_above_r is filled with the relids of syntactically-higher outer
2797
- * joins that have been found to commute with this one per outer join identity
2798
- * 3, when this join is in the RHS of the upper join (so, this is the lower
2799
- * join in the second form of the identity).
2800
- *
2801
- * commute_below_l is filled with the relids of syntactically-lower outer
2802
- * joins that have been found to commute with this one per outer join identity
2803
- * 3 and are in the LHS of this join (so, this is the upper join in the first
2804
- * form of the identity).
2805
- *
2806
- * commute_below_r is filled with the relids of syntactically-lower outer
2807
- * joins that have been found to commute with this one per outer join identity
2808
- * 3 and are in the RHS of this join (so, this is the upper join in the second
2809
- * form of the identity).
2810
- *
2811
- * lhs_strict is true if the special join's condition cannot succeed when the
2812
- * LHS variables are all NULL (this means that an outer join can commute with
2813
- * upper-level outer joins even if it appears in their RHS). We don't bother
2814
- * to set lhs_strict for FULL JOINs, however.
2815
- *
2816
- * For a semijoin, we also extract the join operators and their RHS arguments
2817
- * and set semi_operators, semi_rhs_exprs, semi_can_btree, and semi_can_hash.
2818
- * This is done in support of possibly unique-ifying the RHS, so we don't
2819
- * bother unless at least one of semi_can_btree and semi_can_hash can be set
2820
- * true. (You might expect that this information would be computed during
2821
- * join planning; but it's helpful to have it available during planning of
2822
- * parameterized table scans, so we store it in the SpecialJoinInfo structs.)
2823
- *
2824
- * For purposes of join selectivity estimation, we create transient
2825
- * SpecialJoinInfo structures for regular inner joins; so it is possible
2826
- * to have jointype == JOIN_INNER in such a structure, even though this is
2827
- * not allowed within join_info_list. We also create transient
2828
- * SpecialJoinInfos with jointype == JOIN_INNER for outer joins, since for
2829
- * cost estimation purposes it is sometimes useful to know the join size under
2830
- * plain innerjoin semantics. Note that lhs_strict and the semi_xxx fields
2831
- * are not set meaningfully within such structs.
2832
- */
2833
- #ifndef HAVE_SPECIALJOININFO_TYPEDEF
2834
- typedef struct SpecialJoinInfo SpecialJoinInfo;
2835
- #define HAVE_SPECIALJOININFO_TYPEDEF 1
2836
- #endif
2837
-
2838
- struct SpecialJoinInfo
2839
- {
2840
- pg_node_attr(no_read, no_query_jumble)
2841
-
2842
- NodeTag type;
2843
- Relids min_lefthand; /* base+OJ relids in minimum LHS for join */
2844
- Relids min_righthand; /* base+OJ relids in minimum RHS for join */
2845
- Relids syn_lefthand; /* base+OJ relids syntactically within LHS */
2846
- Relids syn_righthand; /* base+OJ relids syntactically within RHS */
2847
- JoinType jointype; /* always INNER, LEFT, FULL, SEMI, or ANTI */
2848
- Index ojrelid; /* outer join's RT index; 0 if none */
2849
- Relids commute_above_l; /* commuting OJs above this one, if LHS */
2850
- Relids commute_above_r; /* commuting OJs above this one, if RHS */
2851
- Relids commute_below_l; /* commuting OJs in this one's LHS */
2852
- Relids commute_below_r; /* commuting OJs in this one's RHS */
2853
- bool lhs_strict; /* joinclause is strict for some LHS rel */
2854
- /* Remaining fields are set only for JOIN_SEMI jointype: */
2855
- bool semi_can_btree; /* true if semi_operators are all btree */
2856
- bool semi_can_hash; /* true if semi_operators are all hash */
2857
- List *semi_operators; /* OIDs of equality join operators */
2858
- List *semi_rhs_exprs; /* righthand-side expressions of these ops */
2859
- };
2860
-
2861
- /*
2862
- * Transient outer-join clause info.
2863
- *
2864
- * We set aside every outer join ON clause that looks mergejoinable,
2865
- * and process it specially at the end of qual distribution.
2866
- */
2867
- typedef struct OuterJoinClauseInfo
2868
- {
2869
- pg_node_attr(no_copy_equal, no_read, no_query_jumble)
2870
-
2871
- NodeTag type;
2872
- RestrictInfo *rinfo; /* a mergejoinable outer-join clause */
2873
- SpecialJoinInfo *sjinfo; /* the outer join's SpecialJoinInfo */
2874
- } OuterJoinClauseInfo;
2875
-
2876
- /*
2877
- * Append-relation info.
2878
- *
2879
- * When we expand an inheritable table or a UNION-ALL subselect into an
2880
- * "append relation" (essentially, a list of child RTEs), we build an
2881
- * AppendRelInfo for each child RTE. The list of AppendRelInfos indicates
2882
- * which child RTEs must be included when expanding the parent, and each node
2883
- * carries information needed to translate between columns of the parent and
2884
- * columns of the child.
2885
- *
2886
- * These structs are kept in the PlannerInfo node's append_rel_list, with
2887
- * append_rel_array[] providing a convenient lookup method for the struct
2888
- * associated with a particular child relid (there can be only one, though
2889
- * parent rels may have many entries in append_rel_list).
2890
- *
2891
- * Note: after completion of the planner prep phase, any given RTE is an
2892
- * append parent having entries in append_rel_list if and only if its
2893
- * "inh" flag is set. We clear "inh" for plain tables that turn out not
2894
- * to have inheritance children, and (in an abuse of the original meaning
2895
- * of the flag) we set "inh" for subquery RTEs that turn out to be
2896
- * flattenable UNION ALL queries. This lets us avoid useless searches
2897
- * of append_rel_list.
2898
- *
2899
- * Note: the data structure assumes that append-rel members are single
2900
- * baserels. This is OK for inheritance, but it prevents us from pulling
2901
- * up a UNION ALL member subquery if it contains a join. While that could
2902
- * be fixed with a more complex data structure, at present there's not much
2903
- * point because no improvement in the plan could result.
2904
- */
2905
-
2906
- typedef struct AppendRelInfo
2907
- {
2908
- pg_node_attr(no_query_jumble)
2909
-
2910
- NodeTag type;
2911
-
2912
- /*
2913
- * These fields uniquely identify this append relationship. There can be
2914
- * (in fact, always should be) multiple AppendRelInfos for the same
2915
- * parent_relid, but never more than one per child_relid, since a given
2916
- * RTE cannot be a child of more than one append parent.
2917
- */
2918
- Index parent_relid; /* RT index of append parent rel */
2919
- Index child_relid; /* RT index of append child rel */
2920
-
2921
- /*
2922
- * For an inheritance appendrel, the parent and child are both regular
2923
- * relations, and we store their rowtype OIDs here for use in translating
2924
- * whole-row Vars. For a UNION-ALL appendrel, the parent and child are
2925
- * both subqueries with no named rowtype, and we store InvalidOid here.
2926
- */
2927
- Oid parent_reltype; /* OID of parent's composite type */
2928
- Oid child_reltype; /* OID of child's composite type */
2929
-
2930
- /*
2931
- * The N'th element of this list is a Var or expression representing the
2932
- * child column corresponding to the N'th column of the parent. This is
2933
- * used to translate Vars referencing the parent rel into references to
2934
- * the child. A list element is NULL if it corresponds to a dropped
2935
- * column of the parent (this is only possible for inheritance cases, not
2936
- * UNION ALL). The list elements are always simple Vars for inheritance
2937
- * cases, but can be arbitrary expressions in UNION ALL cases.
2938
- *
2939
- * Notice we only store entries for user columns (attno > 0). Whole-row
2940
- * Vars are special-cased, and system columns (attno < 0) need no special
2941
- * translation since their attnos are the same for all tables.
2942
- *
2943
- * Caution: the Vars have varlevelsup = 0. Be careful to adjust as needed
2944
- * when copying into a subquery.
2945
- */
2946
- List *translated_vars; /* Expressions in the child's Vars */
2947
-
2948
- /*
2949
- * This array simplifies translations in the reverse direction, from
2950
- * child's column numbers to parent's. The entry at [ccolno - 1] is the
2951
- * 1-based parent column number for child column ccolno, or zero if that
2952
- * child column is dropped or doesn't exist in the parent.
2953
- */
2954
- int num_child_cols; /* length of array */
2955
- AttrNumber *parent_colnos pg_node_attr(array_size(num_child_cols));
2956
-
2957
- /*
2958
- * We store the parent table's OID here for inheritance, or InvalidOid for
2959
- * UNION ALL. This is only needed to help in generating error messages if
2960
- * an attempt is made to reference a dropped parent column.
2961
- */
2962
- Oid parent_reloid; /* OID of parent relation */
2963
- } AppendRelInfo;
2964
-
2965
- /*
2966
- * Information about a row-identity "resjunk" column in UPDATE/DELETE/MERGE.
2967
- *
2968
- * In partitioned UPDATE/DELETE/MERGE it's important for child partitions to
2969
- * share row-identity columns whenever possible, so as not to chew up too many
2970
- * targetlist columns. We use these structs to track which identity columns
2971
- * have been requested. In the finished plan, each of these will give rise
2972
- * to one resjunk entry in the targetlist of the ModifyTable's subplan node.
2973
- *
2974
- * All the Vars stored in RowIdentityVarInfos must have varno ROWID_VAR, for
2975
- * convenience of detecting duplicate requests. We'll replace that, in the
2976
- * final plan, with the varno of the generating rel.
2977
- *
2978
- * Outside this list, a Var with varno ROWID_VAR and varattno k is a reference
2979
- * to the k-th element of the row_identity_vars list (k counting from 1).
2980
- * We add such a reference to root->processed_tlist when creating the entry,
2981
- * and it propagates into the plan tree from there.
2982
- */
2983
- typedef struct RowIdentityVarInfo
2984
- {
2985
- pg_node_attr(no_copy_equal, no_read, no_query_jumble)
2986
-
2987
- NodeTag type;
2988
-
2989
- Var *rowidvar; /* Var to be evaluated (but varno=ROWID_VAR) */
2990
- int32 rowidwidth; /* estimated average width */
2991
- char *rowidname; /* name of the resjunk column */
2992
- Relids rowidrels; /* RTE indexes of target rels using this */
2993
- } RowIdentityVarInfo;
2994
-
2995
- /*
2996
- * For each distinct placeholder expression generated during planning, we
2997
- * store a PlaceHolderInfo node in the PlannerInfo node's placeholder_list.
2998
- * This stores info that is needed centrally rather than in each copy of the
2999
- * PlaceHolderVar. The phid fields identify which PlaceHolderInfo goes with
3000
- * each PlaceHolderVar. Note that phid is unique throughout a planner run,
3001
- * not just within a query level --- this is so that we need not reassign ID's
3002
- * when pulling a subquery into its parent.
3003
- *
3004
- * The idea is to evaluate the expression at (only) the ph_eval_at join level,
3005
- * then allow it to bubble up like a Var until the ph_needed join level.
3006
- * ph_needed has the same definition as attr_needed for a regular Var.
3007
- *
3008
- * The PlaceHolderVar's expression might contain LATERAL references to vars
3009
- * coming from outside its syntactic scope. If so, those rels are *not*
3010
- * included in ph_eval_at, but they are recorded in ph_lateral.
3011
- *
3012
- * Notice that when ph_eval_at is a join rather than a single baserel, the
3013
- * PlaceHolderInfo may create constraints on join order: the ph_eval_at join
3014
- * has to be formed below any outer joins that should null the PlaceHolderVar.
3015
- *
3016
- * We create a PlaceHolderInfo only after determining that the PlaceHolderVar
3017
- * is actually referenced in the plan tree, so that unreferenced placeholders
3018
- * don't result in unnecessary constraints on join order.
3019
- */
3020
-
3021
- typedef struct PlaceHolderInfo
3022
- {
3023
- pg_node_attr(no_read, no_query_jumble)
3024
-
3025
- NodeTag type;
3026
-
3027
- /* ID for PH (unique within planner run) */
3028
- Index phid;
3029
-
3030
- /*
3031
- * copy of PlaceHolderVar tree (should be redundant for comparison, could
3032
- * be ignored)
3033
- */
3034
- PlaceHolderVar *ph_var;
3035
-
3036
- /* lowest level we can evaluate value at */
3037
- Relids ph_eval_at;
3038
-
3039
- /* relids of contained lateral refs, if any */
3040
- Relids ph_lateral;
3041
-
3042
- /* highest level the value is needed at */
3043
- Relids ph_needed;
3044
-
3045
- /* estimated attribute width */
3046
- int32 ph_width;
3047
- } PlaceHolderInfo;
3048
-
3049
- /*
3050
- * This struct describes one potentially index-optimizable MIN/MAX aggregate
3051
- * function. MinMaxAggPath contains a list of these, and if we accept that
3052
- * path, the list is stored into root->minmax_aggs for use during setrefs.c.
3053
- */
3054
- typedef struct MinMaxAggInfo
3055
- {
3056
- pg_node_attr(no_copy_equal, no_read, no_query_jumble)
3057
-
3058
- NodeTag type;
3059
-
3060
- /* pg_proc Oid of the aggregate */
3061
- Oid aggfnoid;
3062
-
3063
- /* Oid of its sort operator */
3064
- Oid aggsortop;
3065
-
3066
- /* expression we are aggregating on */
3067
- Expr *target;
3068
-
3069
- /*
3070
- * modified "root" for planning the subquery; not printed, too large, not
3071
- * interesting enough
3072
- */
3073
- PlannerInfo *subroot pg_node_attr(read_write_ignore);
3074
-
3075
- /* access path for subquery */
3076
- Path *path;
3077
-
3078
- /* estimated cost to fetch first row */
3079
- Cost pathcost;
3080
-
3081
- /* param for subplan's output */
3082
- Param *param;
3083
- } MinMaxAggInfo;
3084
-
3085
- /*
3086
- * At runtime, PARAM_EXEC slots are used to pass values around from one plan
3087
- * node to another. They can be used to pass values down into subqueries (for
3088
- * outer references in subqueries), or up out of subqueries (for the results
3089
- * of a subplan), or from a NestLoop plan node into its inner relation (when
3090
- * the inner scan is parameterized with values from the outer relation).
3091
- * The planner is responsible for assigning nonconflicting PARAM_EXEC IDs to
3092
- * the PARAM_EXEC Params it generates.
3093
- *
3094
- * Outer references are managed via root->plan_params, which is a list of
3095
- * PlannerParamItems. While planning a subquery, each parent query level's
3096
- * plan_params contains the values required from it by the current subquery.
3097
- * During create_plan(), we use plan_params to track values that must be
3098
- * passed from outer to inner sides of NestLoop plan nodes.
3099
- *
3100
- * The item a PlannerParamItem represents can be one of three kinds:
3101
- *
3102
- * A Var: the slot represents a variable of this level that must be passed
3103
- * down because subqueries have outer references to it, or must be passed
3104
- * from a NestLoop node to its inner scan. The varlevelsup value in the Var
3105
- * will always be zero.
3106
- *
3107
- * A PlaceHolderVar: this works much like the Var case, except that the
3108
- * entry is a PlaceHolderVar node with a contained expression. The PHV
3109
- * will have phlevelsup = 0, and the contained expression is adjusted
3110
- * to match in level.
3111
- *
3112
- * An Aggref (with an expression tree representing its argument): the slot
3113
- * represents an aggregate expression that is an outer reference for some
3114
- * subquery. The Aggref itself has agglevelsup = 0, and its argument tree
3115
- * is adjusted to match in level.
3116
- *
3117
- * Note: we detect duplicate Var and PlaceHolderVar parameters and coalesce
3118
- * them into one slot, but we do not bother to do that for Aggrefs.
3119
- * The scope of duplicate-elimination only extends across the set of
3120
- * parameters passed from one query level into a single subquery, or for
3121
- * nestloop parameters across the set of nestloop parameters used in a single
3122
- * query level. So there is no possibility of a PARAM_EXEC slot being used
3123
- * for conflicting purposes.
3124
- *
3125
- * In addition, PARAM_EXEC slots are assigned for Params representing outputs
3126
- * from subplans (values that are setParam items for those subplans). These
3127
- * IDs need not be tracked via PlannerParamItems, since we do not need any
3128
- * duplicate-elimination nor later processing of the represented expressions.
3129
- * Instead, we just record the assignment of the slot number by appending to
3130
- * root->glob->paramExecTypes.
3131
- */
3132
- typedef struct PlannerParamItem
3133
- {
3134
- pg_node_attr(no_copy_equal, no_read, no_query_jumble)
3135
-
3136
- NodeTag type;
3137
-
3138
- Node *item; /* the Var, PlaceHolderVar, or Aggref */
3139
- int paramId; /* its assigned PARAM_EXEC slot number */
3140
- } PlannerParamItem;
3141
-
3142
- /*
3143
- * When making cost estimates for a SEMI/ANTI/inner_unique join, there are
3144
- * some correction factors that are needed in both nestloop and hash joins
3145
- * to account for the fact that the executor can stop scanning inner rows
3146
- * as soon as it finds a match to the current outer row. These numbers
3147
- * depend only on the selected outer and inner join relations, not on the
3148
- * particular paths used for them, so it's worthwhile to calculate them
3149
- * just once per relation pair not once per considered path. This struct
3150
- * is filled by compute_semi_anti_join_factors and must be passed along
3151
- * to the join cost estimation functions.
3152
- *
3153
- * outer_match_frac is the fraction of the outer tuples that are
3154
- * expected to have at least one match.
3155
- * match_count is the average number of matches expected for
3156
- * outer tuples that have at least one match.
3157
- */
3158
- typedef struct SemiAntiJoinFactors
3159
- {
3160
- Selectivity outer_match_frac;
3161
- Selectivity match_count;
3162
- } SemiAntiJoinFactors;
3163
-
3164
- /*
3165
- * Struct for extra information passed to subroutines of add_paths_to_joinrel
3166
- *
3167
- * restrictlist contains all of the RestrictInfo nodes for restriction
3168
- * clauses that apply to this join
3169
- * mergeclause_list is a list of RestrictInfo nodes for available
3170
- * mergejoin clauses in this join
3171
- * inner_unique is true if each outer tuple provably matches no more
3172
- * than one inner tuple
3173
- * sjinfo is extra info about special joins for selectivity estimation
3174
- * semifactors is as shown above (only valid for SEMI/ANTI/inner_unique joins)
3175
- * param_source_rels are OK targets for parameterization of result paths
3176
- */
3177
- typedef struct JoinPathExtraData
3178
- {
3179
- List *restrictlist;
3180
- List *mergeclause_list;
3181
- bool inner_unique;
3182
- SpecialJoinInfo *sjinfo;
3183
- SemiAntiJoinFactors semifactors;
3184
- Relids param_source_rels;
3185
- } JoinPathExtraData;
3186
-
3187
- /*
3188
- * Various flags indicating what kinds of grouping are possible.
3189
- *
3190
- * GROUPING_CAN_USE_SORT should be set if it's possible to perform
3191
- * sort-based implementations of grouping. When grouping sets are in use,
3192
- * this will be true if sorting is potentially usable for any of the grouping
3193
- * sets, even if it's not usable for all of them.
3194
- *
3195
- * GROUPING_CAN_USE_HASH should be set if it's possible to perform
3196
- * hash-based implementations of grouping.
3197
- *
3198
- * GROUPING_CAN_PARTIAL_AGG should be set if the aggregation is of a type
3199
- * for which we support partial aggregation (not, for example, grouping sets).
3200
- * It says nothing about parallel-safety or the availability of suitable paths.
3201
- */
3202
- #define GROUPING_CAN_USE_SORT 0x0001
3203
- #define GROUPING_CAN_USE_HASH 0x0002
3204
- #define GROUPING_CAN_PARTIAL_AGG 0x0004
3205
-
3206
- /*
3207
- * What kind of partitionwise aggregation is in use?
3208
- *
3209
- * PARTITIONWISE_AGGREGATE_NONE: Not used.
3210
- *
3211
- * PARTITIONWISE_AGGREGATE_FULL: Aggregate each partition separately, and
3212
- * append the results.
3213
- *
3214
- * PARTITIONWISE_AGGREGATE_PARTIAL: Partially aggregate each partition
3215
- * separately, append the results, and then finalize aggregation.
3216
- */
3217
- typedef enum
3218
- {
3219
- PARTITIONWISE_AGGREGATE_NONE,
3220
- PARTITIONWISE_AGGREGATE_FULL,
3221
- PARTITIONWISE_AGGREGATE_PARTIAL
3222
- } PartitionwiseAggregateType;
3223
-
3224
- /*
3225
- * Struct for extra information passed to subroutines of create_grouping_paths
3226
- *
3227
- * flags indicating what kinds of grouping are possible.
3228
- * partial_costs_set is true if the agg_partial_costs and agg_final_costs
3229
- * have been initialized.
3230
- * agg_partial_costs gives partial aggregation costs.
3231
- * agg_final_costs gives finalization costs.
3232
- * target_parallel_safe is true if target is parallel safe.
3233
- * havingQual gives list of quals to be applied after aggregation.
3234
- * targetList gives list of columns to be projected.
3235
- * patype is the type of partitionwise aggregation that is being performed.
3236
- */
3237
- typedef struct
3238
- {
3239
- /* Data which remains constant once set. */
3240
- int flags;
3241
- bool partial_costs_set;
3242
- AggClauseCosts agg_partial_costs;
3243
- AggClauseCosts agg_final_costs;
3244
-
3245
- /* Data which may differ across partitions. */
3246
- bool target_parallel_safe;
3247
- Node *havingQual;
3248
- List *targetList;
3249
- PartitionwiseAggregateType patype;
3250
- } GroupPathExtraData;
3251
-
3252
- /*
3253
- * Struct for extra information passed to subroutines of grouping_planner
3254
- *
3255
- * limit_needed is true if we actually need a Limit plan node.
3256
- * limit_tuples is an estimated bound on the number of output tuples,
3257
- * or -1 if no LIMIT or couldn't estimate.
3258
- * count_est and offset_est are the estimated values of the LIMIT and OFFSET
3259
- * expressions computed by preprocess_limit() (see comments for
3260
- * preprocess_limit() for more information).
3261
- */
3262
- typedef struct
3263
- {
3264
- bool limit_needed;
3265
- Cardinality limit_tuples;
3266
- int64 count_est;
3267
- int64 offset_est;
3268
- } FinalPathExtraData;
3269
-
3270
- /*
3271
- * For speed reasons, cost estimation for join paths is performed in two
3272
- * phases: the first phase tries to quickly derive a lower bound for the
3273
- * join cost, and then we check if that's sufficient to reject the path.
3274
- * If not, we come back for a more refined cost estimate. The first phase
3275
- * fills a JoinCostWorkspace struct with its preliminary cost estimates
3276
- * and possibly additional intermediate values. The second phase takes
3277
- * these values as inputs to avoid repeating work.
3278
- *
3279
- * (Ideally we'd declare this in cost.h, but it's also needed in pathnode.h,
3280
- * so seems best to put it here.)
3281
- */
3282
- typedef struct JoinCostWorkspace
3283
- {
3284
- /* Preliminary cost estimates --- must not be larger than final ones! */
3285
- Cost startup_cost; /* cost expended before fetching any tuples */
3286
- Cost total_cost; /* total cost (assuming all tuples fetched) */
3287
-
3288
- /* Fields below here should be treated as private to costsize.c */
3289
- Cost run_cost; /* non-startup cost components */
3290
-
3291
- /* private for cost_nestloop code */
3292
- Cost inner_run_cost; /* also used by cost_mergejoin code */
3293
- Cost inner_rescan_run_cost;
3294
-
3295
- /* private for cost_mergejoin code */
3296
- Cardinality outer_rows;
3297
- Cardinality inner_rows;
3298
- Cardinality outer_skip_rows;
3299
- Cardinality inner_skip_rows;
3300
-
3301
- /* private for cost_hashjoin code */
3302
- int numbuckets;
3303
- int numbatches;
3304
- Cardinality inner_rows_total;
3305
- } JoinCostWorkspace;
3306
-
3307
- /*
3308
- * AggInfo holds information about an aggregate that needs to be computed.
3309
- * Multiple Aggrefs in a query can refer to the same AggInfo by having the
3310
- * same 'aggno' value, so that the aggregate is computed only once.
3311
- */
3312
- typedef struct AggInfo
3313
- {
3314
- pg_node_attr(no_copy_equal, no_read, no_query_jumble)
3315
-
3316
- NodeTag type;
3317
-
3318
- /*
3319
- * List of Aggref exprs that this state value is for.
3320
- *
3321
- * There will always be at least one, but there can be multiple identical
3322
- * Aggref's sharing the same per-agg.
3323
- */
3324
- List *aggrefs;
3325
-
3326
- /* Transition state number for this aggregate */
3327
- int transno;
3328
-
3329
- /*
3330
- * "shareable" is false if this agg cannot share state values with other
3331
- * aggregates because the final function is read-write.
3332
- */
3333
- bool shareable;
3334
-
3335
- /* Oid of the final function, or InvalidOid if none */
3336
- Oid finalfn_oid;
3337
- } AggInfo;
3338
-
3339
- /*
3340
- * AggTransInfo holds information about transition state that is used by one
3341
- * or more aggregates in the query. Multiple aggregates can share the same
3342
- * transition state, if they have the same inputs and the same transition
3343
- * function. Aggrefs that share the same transition info have the same
3344
- * 'aggtransno' value.
3345
- */
3346
- typedef struct AggTransInfo
3347
- {
3348
- pg_node_attr(no_copy_equal, no_read, no_query_jumble)
3349
-
3350
- NodeTag type;
3351
-
3352
- /* Inputs for this transition state */
3353
- List *args;
3354
- Expr *aggfilter;
3355
-
3356
- /* Oid of the state transition function */
3357
- Oid transfn_oid;
3358
-
3359
- /* Oid of the serialization function, or InvalidOid if none */
3360
- Oid serialfn_oid;
3361
-
3362
- /* Oid of the deserialization function, or InvalidOid if none */
3363
- Oid deserialfn_oid;
3364
-
3365
- /* Oid of the combine function, or InvalidOid if none */
3366
- Oid combinefn_oid;
3367
-
3368
- /* Oid of state value's datatype */
3369
- Oid aggtranstype;
3370
-
3371
- /* Additional data about transtype */
3372
- int32 aggtranstypmod;
3373
- int transtypeLen;
3374
- bool transtypeByVal;
3375
-
3376
- /* Space-consumption estimate */
3377
- int32 aggtransspace;
3378
-
3379
- /* Initial value from pg_aggregate entry */
3380
- Datum initValue pg_node_attr(read_write_ignore);
3381
- bool initValueIsNull;
3382
- } AggTransInfo;
3383
-
3384
- #endif /* PATHNODES_H */