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
@@ -0,0 +1,2335 @@
1
+ /*-------------------------------------------------------------------------
2
+ *
3
+ * primnodes.h
4
+ * Definitions for "primitive" node types, those that are used in more
5
+ * than one of the parse/plan/execute stages of the query pipeline.
6
+ * Currently, these are mostly nodes for executable expressions
7
+ * and join trees.
8
+ *
9
+ *
10
+ * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group
11
+ * Portions Copyright (c) 1994, Regents of the University of California
12
+ *
13
+ * src/include/nodes/primnodes.h
14
+ *
15
+ *-------------------------------------------------------------------------
16
+ */
17
+ #ifndef PRIMNODES_H
18
+ #define PRIMNODES_H
19
+
20
+ #include "access/attnum.h"
21
+ #include "nodes/bitmapset.h"
22
+ #include "nodes/pg_list.h"
23
+
24
+
25
+ typedef enum OverridingKind
26
+ {
27
+ OVERRIDING_NOT_SET = 0,
28
+ OVERRIDING_USER_VALUE,
29
+ OVERRIDING_SYSTEM_VALUE,
30
+ } OverridingKind;
31
+
32
+
33
+ /* ----------------------------------------------------------------
34
+ * node definitions
35
+ * ----------------------------------------------------------------
36
+ */
37
+
38
+ /*
39
+ * Alias -
40
+ * specifies an alias for a range variable; the alias might also
41
+ * specify renaming of columns within the table.
42
+ *
43
+ * Note: colnames is a list of String nodes. In Alias structs
44
+ * associated with RTEs, there may be entries corresponding to dropped
45
+ * columns; these are normally empty strings (""). See parsenodes.h for info.
46
+ */
47
+ typedef struct Alias
48
+ {
49
+ NodeTag type;
50
+ char *aliasname; /* aliased rel name (never qualified) */
51
+ List *colnames; /* optional list of column aliases */
52
+ } Alias;
53
+
54
+ /* What to do at commit time for temporary relations */
55
+ typedef enum OnCommitAction
56
+ {
57
+ ONCOMMIT_NOOP, /* No ON COMMIT clause (do nothing) */
58
+ ONCOMMIT_PRESERVE_ROWS, /* ON COMMIT PRESERVE ROWS (do nothing) */
59
+ ONCOMMIT_DELETE_ROWS, /* ON COMMIT DELETE ROWS */
60
+ ONCOMMIT_DROP, /* ON COMMIT DROP */
61
+ } OnCommitAction;
62
+
63
+ /*
64
+ * RangeVar - range variable, used in FROM clauses
65
+ *
66
+ * Also used to represent table names in utility statements; there, the alias
67
+ * field is not used, and inh tells whether to apply the operation
68
+ * recursively to child tables. In some contexts it is also useful to carry
69
+ * a TEMP table indication here.
70
+ */
71
+ typedef struct RangeVar
72
+ {
73
+ NodeTag type;
74
+
75
+ /* the catalog (database) name, or NULL */
76
+ char *catalogname;
77
+
78
+ /* the schema name, or NULL */
79
+ char *schemaname;
80
+
81
+ /* the relation/sequence name */
82
+ char *relname;
83
+
84
+ /* expand rel by inheritance? recursively act on children? */
85
+ bool inh;
86
+
87
+ /* see RELPERSISTENCE_* in pg_class.h */
88
+ char relpersistence;
89
+
90
+ /* table alias & optional column aliases */
91
+ Alias *alias;
92
+
93
+ /* token location, or -1 if unknown */
94
+ ParseLoc location;
95
+ } RangeVar;
96
+
97
+ typedef enum TableFuncType
98
+ {
99
+ TFT_XMLTABLE,
100
+ TFT_JSON_TABLE,
101
+ } TableFuncType;
102
+
103
+ /*
104
+ * TableFunc - node for a table function, such as XMLTABLE and JSON_TABLE.
105
+ *
106
+ * Entries in the ns_names list are either String nodes containing
107
+ * literal namespace names, or NULL pointers to represent DEFAULT.
108
+ */
109
+ typedef struct TableFunc
110
+ {
111
+ NodeTag type;
112
+ /* XMLTABLE or JSON_TABLE */
113
+ TableFuncType functype;
114
+ /* list of namespace URI expressions */
115
+ List *ns_uris pg_node_attr(query_jumble_ignore);
116
+ /* list of namespace names or NULL */
117
+ List *ns_names pg_node_attr(query_jumble_ignore);
118
+ /* input document expression */
119
+ Node *docexpr;
120
+ /* row filter expression */
121
+ Node *rowexpr;
122
+ /* column names (list of String) */
123
+ List *colnames pg_node_attr(query_jumble_ignore);
124
+ /* OID list of column type OIDs */
125
+ List *coltypes pg_node_attr(query_jumble_ignore);
126
+ /* integer list of column typmods */
127
+ List *coltypmods pg_node_attr(query_jumble_ignore);
128
+ /* OID list of column collation OIDs */
129
+ List *colcollations pg_node_attr(query_jumble_ignore);
130
+ /* list of column filter expressions */
131
+ List *colexprs;
132
+ /* list of column default expressions */
133
+ List *coldefexprs pg_node_attr(query_jumble_ignore);
134
+ /* JSON_TABLE: list of column value expressions */
135
+ List *colvalexprs pg_node_attr(query_jumble_ignore);
136
+ /* JSON_TABLE: list of PASSING argument expressions */
137
+ List *passingvalexprs pg_node_attr(query_jumble_ignore);
138
+ /* nullability flag for each output column */
139
+ Bitmapset *notnulls pg_node_attr(query_jumble_ignore);
140
+ /* JSON_TABLE plan */
141
+ Node *plan pg_node_attr(query_jumble_ignore);
142
+ /* counts from 0; -1 if none specified */
143
+ int ordinalitycol pg_node_attr(query_jumble_ignore);
144
+ /* token location, or -1 if unknown */
145
+ ParseLoc location;
146
+ } TableFunc;
147
+
148
+ /*
149
+ * IntoClause - target information for SELECT INTO, CREATE TABLE AS, and
150
+ * CREATE MATERIALIZED VIEW
151
+ *
152
+ * For CREATE MATERIALIZED VIEW, viewQuery is the parsed-but-not-rewritten
153
+ * SELECT Query for the view; otherwise it's NULL. This is irrelevant in
154
+ * the query jumbling as CreateTableAsStmt already includes a reference to
155
+ * its own Query, so ignore it. (Although it's actually Query*, we declare
156
+ * it as Node* to avoid a forward reference.)
157
+ */
158
+ typedef struct IntoClause
159
+ {
160
+ NodeTag type;
161
+
162
+ RangeVar *rel; /* target relation name */
163
+ List *colNames; /* column names to assign, or NIL */
164
+ char *accessMethod; /* table access method */
165
+ List *options; /* options from WITH clause */
166
+ OnCommitAction onCommit; /* what do we do at COMMIT? */
167
+ char *tableSpaceName; /* table space to use, or NULL */
168
+ /* materialized view's SELECT query */
169
+ Node *viewQuery pg_node_attr(query_jumble_ignore);
170
+ bool skipData; /* true for WITH NO DATA */
171
+ } IntoClause;
172
+
173
+
174
+ /* ----------------------------------------------------------------
175
+ * node types for executable expressions
176
+ * ----------------------------------------------------------------
177
+ */
178
+
179
+ /*
180
+ * Expr - generic superclass for executable-expression nodes
181
+ *
182
+ * All node types that are used in executable expression trees should derive
183
+ * from Expr (that is, have Expr as their first field). Since Expr only
184
+ * contains NodeTag, this is a formality, but it is an easy form of
185
+ * documentation. See also the ExprState node types in execnodes.h.
186
+ */
187
+ typedef struct Expr
188
+ {
189
+ pg_node_attr(abstract)
190
+
191
+ NodeTag type;
192
+ } Expr;
193
+
194
+ /*
195
+ * Var - expression node representing a variable (ie, a table column)
196
+ *
197
+ * In the parser and planner, varno and varattno identify the semantic
198
+ * referent, which is a base-relation column unless the reference is to a join
199
+ * USING column that isn't semantically equivalent to either join input column
200
+ * (because it is a FULL join or the input column requires a type coercion).
201
+ * In those cases varno and varattno refer to the JOIN RTE. (Early in the
202
+ * planner, we replace such join references by the implied expression; but up
203
+ * till then we want join reference Vars to keep their original identity for
204
+ * query-printing purposes.)
205
+ *
206
+ * At the end of planning, Var nodes appearing in upper-level plan nodes are
207
+ * reassigned to point to the outputs of their subplans; for example, in a
208
+ * join node varno becomes INNER_VAR or OUTER_VAR and varattno becomes the
209
+ * index of the proper element of that subplan's target list. Similarly,
210
+ * INDEX_VAR is used to identify Vars that reference an index column rather
211
+ * than a heap column. (In ForeignScan and CustomScan plan nodes, INDEX_VAR
212
+ * is abused to signify references to columns of a custom scan tuple type.)
213
+ *
214
+ * ROWID_VAR is used in the planner to identify nonce variables that carry
215
+ * row identity information during UPDATE/DELETE/MERGE. This value should
216
+ * never be seen outside the planner.
217
+ *
218
+ * varnullingrels is the set of RT indexes of outer joins that can force
219
+ * the Var's value to null (at the point where it appears in the query).
220
+ * See optimizer/README for discussion of that.
221
+ *
222
+ * varlevelsup is greater than zero in Vars that represent outer references.
223
+ * Note that it affects the meaning of all of varno, varnullingrels, and
224
+ * varnosyn, all of which refer to the range table of that query level.
225
+ *
226
+ * In the parser, varnosyn and varattnosyn are either identical to
227
+ * varno/varattno, or they specify the column's position in an aliased JOIN
228
+ * RTE that hides the semantic referent RTE's refname. This is a syntactic
229
+ * identifier as opposed to the semantic identifier; it tells ruleutils.c
230
+ * how to print the Var properly. varnosyn/varattnosyn retain their values
231
+ * throughout planning and execution, so they are particularly helpful to
232
+ * identify Vars when debugging. Note, however, that a Var that is generated
233
+ * in the planner and doesn't correspond to any simple relation column may
234
+ * have varnosyn = varattnosyn = 0.
235
+ */
236
+ #define INNER_VAR (-1) /* reference to inner subplan */
237
+ #define OUTER_VAR (-2) /* reference to outer subplan */
238
+ #define INDEX_VAR (-3) /* reference to index column */
239
+ #define ROWID_VAR (-4) /* row identity column during planning */
240
+
241
+ #define IS_SPECIAL_VARNO(varno) ((int) (varno) < 0)
242
+
243
+ /* Symbols for the indexes of the special RTE entries in rules */
244
+ #define PRS2_OLD_VARNO 1
245
+ #define PRS2_NEW_VARNO 2
246
+
247
+ typedef struct Var
248
+ {
249
+ Expr xpr;
250
+
251
+ /*
252
+ * index of this var's relation in the range table, or
253
+ * INNER_VAR/OUTER_VAR/etc
254
+ */
255
+ int varno;
256
+
257
+ /*
258
+ * attribute number of this var, or zero for all attrs ("whole-row Var")
259
+ */
260
+ AttrNumber varattno;
261
+
262
+ /* pg_type OID for the type of this var */
263
+ Oid vartype pg_node_attr(query_jumble_ignore);
264
+ /* pg_attribute typmod value */
265
+ int32 vartypmod pg_node_attr(query_jumble_ignore);
266
+ /* OID of collation, or InvalidOid if none */
267
+ Oid varcollid pg_node_attr(query_jumble_ignore);
268
+
269
+ /*
270
+ * RT indexes of outer joins that can replace the Var's value with null.
271
+ * We can omit varnullingrels in the query jumble, because it's fully
272
+ * determined by varno/varlevelsup plus the Var's query location.
273
+ */
274
+ Bitmapset *varnullingrels pg_node_attr(query_jumble_ignore);
275
+
276
+ /*
277
+ * for subquery variables referencing outer relations; 0 in a normal var,
278
+ * >0 means N levels up
279
+ */
280
+ Index varlevelsup;
281
+
282
+ /*
283
+ * varnosyn/varattnosyn are ignored for equality, because Vars with
284
+ * different syntactic identifiers are semantically the same as long as
285
+ * their varno/varattno match.
286
+ */
287
+ /* syntactic relation index (0 if unknown) */
288
+ Index varnosyn pg_node_attr(equal_ignore, query_jumble_ignore);
289
+ /* syntactic attribute number */
290
+ AttrNumber varattnosyn pg_node_attr(equal_ignore, query_jumble_ignore);
291
+
292
+ /* token location, or -1 if unknown */
293
+ ParseLoc location;
294
+ } Var;
295
+
296
+ /*
297
+ * Const
298
+ *
299
+ * Note: for varlena data types, we make a rule that a Const node's value
300
+ * must be in non-extended form (4-byte header, no compression or external
301
+ * references). This ensures that the Const node is self-contained and makes
302
+ * it more likely that equal() will see logically identical values as equal.
303
+ *
304
+ * Only the constant type OID is relevant for the query jumbling.
305
+ */
306
+ typedef struct Const
307
+ {
308
+ pg_node_attr(custom_copy_equal, custom_read_write)
309
+
310
+ Expr xpr;
311
+ /* pg_type OID of the constant's datatype */
312
+ Oid consttype;
313
+ /* typmod value, if any */
314
+ int32 consttypmod pg_node_attr(query_jumble_ignore);
315
+ /* OID of collation, or InvalidOid if none */
316
+ Oid constcollid pg_node_attr(query_jumble_ignore);
317
+ /* typlen of the constant's datatype */
318
+ int constlen pg_node_attr(query_jumble_ignore);
319
+ /* the constant's value */
320
+ Datum constvalue pg_node_attr(query_jumble_ignore);
321
+ /* whether the constant is null (if true, constvalue is undefined) */
322
+ bool constisnull pg_node_attr(query_jumble_ignore);
323
+
324
+ /*
325
+ * Whether this datatype is passed by value. If true, then all the
326
+ * information is stored in the Datum. If false, then the Datum contains
327
+ * a pointer to the information.
328
+ */
329
+ bool constbyval pg_node_attr(query_jumble_ignore);
330
+
331
+ /*
332
+ * token location, or -1 if unknown. All constants are tracked as
333
+ * locations in query jumbling, to be marked as parameters.
334
+ */
335
+ ParseLoc location pg_node_attr(query_jumble_location);
336
+ } Const;
337
+
338
+ /*
339
+ * Param
340
+ *
341
+ * paramkind specifies the kind of parameter. The possible values
342
+ * for this field are:
343
+ *
344
+ * PARAM_EXTERN: The parameter value is supplied from outside the plan.
345
+ * Such parameters are numbered from 1 to n.
346
+ *
347
+ * PARAM_EXEC: The parameter is an internal executor parameter, used
348
+ * for passing values into and out of sub-queries or from
349
+ * nestloop joins to their inner scans.
350
+ * For historical reasons, such parameters are numbered from 0.
351
+ * These numbers are independent of PARAM_EXTERN numbers.
352
+ *
353
+ * PARAM_SUBLINK: The parameter represents an output column of a SubLink
354
+ * node's sub-select. The column number is contained in the
355
+ * `paramid' field. (This type of Param is converted to
356
+ * PARAM_EXEC during planning.)
357
+ *
358
+ * PARAM_MULTIEXPR: Like PARAM_SUBLINK, the parameter represents an
359
+ * output column of a SubLink node's sub-select, but here, the
360
+ * SubLink is always a MULTIEXPR SubLink. The high-order 16 bits
361
+ * of the `paramid' field contain the SubLink's subLinkId, and
362
+ * the low-order 16 bits contain the column number. (This type
363
+ * of Param is also converted to PARAM_EXEC during planning.)
364
+ */
365
+ typedef enum ParamKind
366
+ {
367
+ PARAM_EXTERN,
368
+ PARAM_EXEC,
369
+ PARAM_SUBLINK,
370
+ PARAM_MULTIEXPR,
371
+ } ParamKind;
372
+
373
+ typedef struct Param
374
+ {
375
+ Expr xpr;
376
+ ParamKind paramkind; /* kind of parameter. See above */
377
+ int paramid; /* numeric ID for parameter */
378
+ Oid paramtype; /* pg_type OID of parameter's datatype */
379
+ /* typmod value, if known */
380
+ int32 paramtypmod pg_node_attr(query_jumble_ignore);
381
+ /* OID of collation, or InvalidOid if none */
382
+ Oid paramcollid pg_node_attr(query_jumble_ignore);
383
+ /* token location, or -1 if unknown */
384
+ ParseLoc location;
385
+ } Param;
386
+
387
+ /*
388
+ * Aggref
389
+ *
390
+ * The aggregate's args list is a targetlist, ie, a list of TargetEntry nodes.
391
+ *
392
+ * For a normal (non-ordered-set) aggregate, the non-resjunk TargetEntries
393
+ * represent the aggregate's regular arguments (if any) and resjunk TLEs can
394
+ * be added at the end to represent ORDER BY expressions that are not also
395
+ * arguments. As in a top-level Query, the TLEs can be marked with
396
+ * ressortgroupref indexes to let them be referenced by SortGroupClause
397
+ * entries in the aggorder and/or aggdistinct lists. This represents ORDER BY
398
+ * and DISTINCT operations to be applied to the aggregate input rows before
399
+ * they are passed to the transition function. The grammar only allows a
400
+ * simple "DISTINCT" specifier for the arguments, but we use the full
401
+ * query-level representation to allow more code sharing.
402
+ *
403
+ * For an ordered-set aggregate, the args list represents the WITHIN GROUP
404
+ * (aggregated) arguments, all of which will be listed in the aggorder list.
405
+ * DISTINCT is not supported in this case, so aggdistinct will be NIL.
406
+ * The direct arguments appear in aggdirectargs (as a list of plain
407
+ * expressions, not TargetEntry nodes).
408
+ *
409
+ * aggtranstype is the data type of the state transition values for this
410
+ * aggregate (resolved to an actual type, if agg's transtype is polymorphic).
411
+ * This is determined during planning and is InvalidOid before that.
412
+ *
413
+ * aggargtypes is an OID list of the data types of the direct and regular
414
+ * arguments. Normally it's redundant with the aggdirectargs and args lists,
415
+ * but in a combining aggregate, it's not because the args list has been
416
+ * replaced with a single argument representing the partial-aggregate
417
+ * transition values.
418
+ *
419
+ * aggpresorted is set by the query planner for ORDER BY and DISTINCT
420
+ * aggregates where the chosen plan provides presorted input for this
421
+ * aggregate during execution.
422
+ *
423
+ * aggsplit indicates the expected partial-aggregation mode for the Aggref's
424
+ * parent plan node. It's always set to AGGSPLIT_SIMPLE in the parser, but
425
+ * the planner might change it to something else. We use this mainly as
426
+ * a crosscheck that the Aggrefs match the plan; but note that when aggsplit
427
+ * indicates a non-final mode, aggtype reflects the transition data type
428
+ * not the SQL-level output type of the aggregate.
429
+ *
430
+ * aggno and aggtransno are -1 in the parse stage, and are set in planning.
431
+ * Aggregates with the same 'aggno' represent the same aggregate expression,
432
+ * and can share the result. Aggregates with same 'transno' but different
433
+ * 'aggno' can share the same transition state, only the final function needs
434
+ * to be called separately.
435
+ *
436
+ * Information related to collations, transition types and internal states
437
+ * are irrelevant for the query jumbling.
438
+ */
439
+ typedef struct Aggref
440
+ {
441
+ Expr xpr;
442
+
443
+ /* pg_proc Oid of the aggregate */
444
+ Oid aggfnoid;
445
+
446
+ /* type Oid of result of the aggregate */
447
+ Oid aggtype pg_node_attr(query_jumble_ignore);
448
+
449
+ /* OID of collation of result */
450
+ Oid aggcollid pg_node_attr(query_jumble_ignore);
451
+
452
+ /* OID of collation that function should use */
453
+ Oid inputcollid pg_node_attr(query_jumble_ignore);
454
+
455
+ /*
456
+ * type Oid of aggregate's transition value; ignored for equal since it
457
+ * might not be set yet
458
+ */
459
+ Oid aggtranstype pg_node_attr(equal_ignore, query_jumble_ignore);
460
+
461
+ /* type Oids of direct and aggregated args */
462
+ List *aggargtypes pg_node_attr(query_jumble_ignore);
463
+
464
+ /* direct arguments, if an ordered-set agg */
465
+ List *aggdirectargs;
466
+
467
+ /* aggregated arguments and sort expressions */
468
+ List *args;
469
+
470
+ /* ORDER BY (list of SortGroupClause) */
471
+ List *aggorder;
472
+
473
+ /* DISTINCT (list of SortGroupClause) */
474
+ List *aggdistinct;
475
+
476
+ /* FILTER expression, if any */
477
+ Expr *aggfilter;
478
+
479
+ /* true if argument list was really '*' */
480
+ bool aggstar pg_node_attr(query_jumble_ignore);
481
+
482
+ /*
483
+ * true if variadic arguments have been combined into an array last
484
+ * argument
485
+ */
486
+ bool aggvariadic pg_node_attr(query_jumble_ignore);
487
+
488
+ /* aggregate kind (see pg_aggregate.h) */
489
+ char aggkind pg_node_attr(query_jumble_ignore);
490
+
491
+ /* aggregate input already sorted */
492
+ bool aggpresorted pg_node_attr(equal_ignore, query_jumble_ignore);
493
+
494
+ /* > 0 if agg belongs to outer query */
495
+ Index agglevelsup pg_node_attr(query_jumble_ignore);
496
+
497
+ /* expected agg-splitting mode of parent Agg */
498
+ AggSplit aggsplit pg_node_attr(query_jumble_ignore);
499
+
500
+ /* unique ID within the Agg node */
501
+ int aggno pg_node_attr(query_jumble_ignore);
502
+
503
+ /* unique ID of transition state in the Agg */
504
+ int aggtransno pg_node_attr(query_jumble_ignore);
505
+
506
+ /* token location, or -1 if unknown */
507
+ ParseLoc location;
508
+ } Aggref;
509
+
510
+ /*
511
+ * GroupingFunc
512
+ *
513
+ * A GroupingFunc is a GROUPING(...) expression, which behaves in many ways
514
+ * like an aggregate function (e.g. it "belongs" to a specific query level,
515
+ * which might not be the one immediately containing it), but also differs in
516
+ * an important respect: it never evaluates its arguments, they merely
517
+ * designate expressions from the GROUP BY clause of the query level to which
518
+ * it belongs.
519
+ *
520
+ * The spec defines the evaluation of GROUPING() purely by syntactic
521
+ * replacement, but we make it a real expression for optimization purposes so
522
+ * that one Agg node can handle multiple grouping sets at once. Evaluating the
523
+ * result only needs the column positions to check against the grouping set
524
+ * being projected. However, for EXPLAIN to produce meaningful output, we have
525
+ * to keep the original expressions around, since expression deparse does not
526
+ * give us any feasible way to get at the GROUP BY clause.
527
+ *
528
+ * Also, we treat two GroupingFunc nodes as equal if they have equal arguments
529
+ * lists and agglevelsup, without comparing the refs and cols annotations.
530
+ *
531
+ * In raw parse output we have only the args list; parse analysis fills in the
532
+ * refs list, and the planner fills in the cols list.
533
+ *
534
+ * All the fields used as information for an internal state are irrelevant
535
+ * for the query jumbling.
536
+ */
537
+ typedef struct GroupingFunc
538
+ {
539
+ Expr xpr;
540
+
541
+ /* arguments, not evaluated but kept for benefit of EXPLAIN etc. */
542
+ List *args pg_node_attr(query_jumble_ignore);
543
+
544
+ /* ressortgrouprefs of arguments */
545
+ List *refs pg_node_attr(equal_ignore);
546
+
547
+ /* actual column positions set by planner */
548
+ List *cols pg_node_attr(equal_ignore, query_jumble_ignore);
549
+
550
+ /* same as Aggref.agglevelsup */
551
+ Index agglevelsup;
552
+
553
+ /* token location */
554
+ ParseLoc location;
555
+ } GroupingFunc;
556
+
557
+ /*
558
+ * WindowFunc
559
+ *
560
+ * Collation information is irrelevant for the query jumbling, as is the
561
+ * internal state information of the node like "winstar" and "winagg".
562
+ */
563
+ typedef struct WindowFunc
564
+ {
565
+ Expr xpr;
566
+ /* pg_proc Oid of the function */
567
+ Oid winfnoid;
568
+ /* type Oid of result of the window function */
569
+ Oid wintype pg_node_attr(query_jumble_ignore);
570
+ /* OID of collation of result */
571
+ Oid wincollid pg_node_attr(query_jumble_ignore);
572
+ /* OID of collation that function should use */
573
+ Oid inputcollid pg_node_attr(query_jumble_ignore);
574
+ /* arguments to the window function */
575
+ List *args;
576
+ /* FILTER expression, if any */
577
+ Expr *aggfilter;
578
+ /* List of WindowFuncRunConditions to help short-circuit execution */
579
+ List *runCondition pg_node_attr(query_jumble_ignore);
580
+ /* index of associated WindowClause */
581
+ Index winref;
582
+ /* true if argument list was really '*' */
583
+ bool winstar pg_node_attr(query_jumble_ignore);
584
+ /* is function a simple aggregate? */
585
+ bool winagg pg_node_attr(query_jumble_ignore);
586
+ /* token location, or -1 if unknown */
587
+ ParseLoc location;
588
+ } WindowFunc;
589
+
590
+ /*
591
+ * WindowFuncRunCondition
592
+ *
593
+ * Represents intermediate OpExprs which will be used by WindowAgg to
594
+ * short-circuit execution.
595
+ */
596
+ typedef struct WindowFuncRunCondition
597
+ {
598
+ Expr xpr;
599
+
600
+ /* PG_OPERATOR OID of the operator */
601
+ Oid opno;
602
+ /* OID of collation that operator should use */
603
+ Oid inputcollid pg_node_attr(query_jumble_ignore);
604
+
605
+ /*
606
+ * true of WindowFunc belongs on the left of the resulting OpExpr or false
607
+ * if the WindowFunc is on the right.
608
+ */
609
+ bool wfunc_left;
610
+
611
+ /*
612
+ * The Expr being compared to the WindowFunc to use in the OpExpr in the
613
+ * WindowAgg's runCondition
614
+ */
615
+ Expr *arg;
616
+ } WindowFuncRunCondition;
617
+
618
+ /*
619
+ * MergeSupportFunc
620
+ *
621
+ * A MergeSupportFunc is a merge support function expression that can only
622
+ * appear in the RETURNING list of a MERGE command. It returns information
623
+ * about the currently executing merge action.
624
+ *
625
+ * Currently, the only supported function is MERGE_ACTION(), which returns the
626
+ * command executed ("INSERT", "UPDATE", or "DELETE").
627
+ */
628
+ typedef struct MergeSupportFunc
629
+ {
630
+ Expr xpr;
631
+ /* type Oid of result */
632
+ Oid msftype;
633
+ /* OID of collation, or InvalidOid if none */
634
+ Oid msfcollid;
635
+ /* token location, or -1 if unknown */
636
+ ParseLoc location;
637
+ } MergeSupportFunc;
638
+
639
+ /*
640
+ * SubscriptingRef: describes a subscripting operation over a container
641
+ * (array, etc).
642
+ *
643
+ * A SubscriptingRef can describe fetching a single element from a container,
644
+ * fetching a part of a container (e.g. an array slice), storing a single
645
+ * element into a container, or storing a slice. The "store" cases work with
646
+ * an initial container value and a source value that is inserted into the
647
+ * appropriate part of the container; the result of the operation is an
648
+ * entire new modified container value.
649
+ *
650
+ * If reflowerindexpr = NIL, then we are fetching or storing a single container
651
+ * element at the subscripts given by refupperindexpr. Otherwise we are
652
+ * fetching or storing a container slice, that is a rectangular subcontainer
653
+ * with lower and upper bounds given by the index expressions.
654
+ * reflowerindexpr must be the same length as refupperindexpr when it
655
+ * is not NIL.
656
+ *
657
+ * In the slice case, individual expressions in the subscript lists can be
658
+ * NULL, meaning "substitute the array's current lower or upper bound".
659
+ * (Non-array containers may or may not support this.)
660
+ *
661
+ * refcontainertype is the actual container type that determines the
662
+ * subscripting semantics. (This will generally be either the exposed type of
663
+ * refexpr, or the base type if that is a domain.) refelemtype is the type of
664
+ * the container's elements; this is saved for the use of the subscripting
665
+ * functions, but is not used by the core code. refrestype, reftypmod, and
666
+ * refcollid describe the type of the SubscriptingRef's result. In a store
667
+ * expression, refrestype will always match refcontainertype; in a fetch,
668
+ * it could be refelemtype for an element fetch, or refcontainertype for a
669
+ * slice fetch, or possibly something else as determined by type-specific
670
+ * subscripting logic. Likewise, reftypmod and refcollid will match the
671
+ * container's properties in a store, but could be different in a fetch.
672
+ *
673
+ * Any internal state data is ignored for the query jumbling.
674
+ *
675
+ * Note: for the cases where a container is returned, if refexpr yields a R/W
676
+ * expanded container, then the implementation is allowed to modify that
677
+ * object in-place and return the same object.
678
+ */
679
+ typedef struct SubscriptingRef
680
+ {
681
+ Expr xpr;
682
+ /* type of the container proper */
683
+ Oid refcontainertype pg_node_attr(query_jumble_ignore);
684
+ /* the container type's pg_type.typelem */
685
+ Oid refelemtype pg_node_attr(query_jumble_ignore);
686
+ /* type of the SubscriptingRef's result */
687
+ Oid refrestype pg_node_attr(query_jumble_ignore);
688
+ /* typmod of the result */
689
+ int32 reftypmod pg_node_attr(query_jumble_ignore);
690
+ /* collation of result, or InvalidOid if none */
691
+ Oid refcollid pg_node_attr(query_jumble_ignore);
692
+ /* expressions that evaluate to upper container indexes */
693
+ List *refupperindexpr;
694
+
695
+ /*
696
+ * expressions that evaluate to lower container indexes, or NIL for single
697
+ * container element.
698
+ */
699
+ List *reflowerindexpr;
700
+ /* the expression that evaluates to a container value */
701
+ Expr *refexpr;
702
+ /* expression for the source value, or NULL if fetch */
703
+ Expr *refassgnexpr;
704
+ } SubscriptingRef;
705
+
706
+ /*
707
+ * CoercionContext - distinguishes the allowed set of type casts
708
+ *
709
+ * NB: ordering of the alternatives is significant; later (larger) values
710
+ * allow more casts than earlier ones.
711
+ */
712
+ typedef enum CoercionContext
713
+ {
714
+ COERCION_IMPLICIT, /* coercion in context of expression */
715
+ COERCION_ASSIGNMENT, /* coercion in context of assignment */
716
+ COERCION_PLPGSQL, /* if no assignment cast, use CoerceViaIO */
717
+ COERCION_EXPLICIT, /* explicit cast operation */
718
+ } CoercionContext;
719
+
720
+ /*
721
+ * CoercionForm - how to display a FuncExpr or related node
722
+ *
723
+ * "Coercion" is a bit of a misnomer, since this value records other
724
+ * special syntaxes besides casts, but for now we'll keep this naming.
725
+ *
726
+ * NB: equal() ignores CoercionForm fields, therefore this *must* not carry
727
+ * any semantically significant information. We need that behavior so that
728
+ * the planner will consider equivalent implicit and explicit casts to be
729
+ * equivalent. In cases where those actually behave differently, the coercion
730
+ * function's arguments will be different.
731
+ */
732
+ typedef enum CoercionForm
733
+ {
734
+ COERCE_EXPLICIT_CALL, /* display as a function call */
735
+ COERCE_EXPLICIT_CAST, /* display as an explicit cast */
736
+ COERCE_IMPLICIT_CAST, /* implicit cast, so hide it */
737
+ COERCE_SQL_SYNTAX, /* display with SQL-mandated special syntax */
738
+ } CoercionForm;
739
+
740
+ /*
741
+ * FuncExpr - expression node for a function call
742
+ *
743
+ * Collation information is irrelevant for the query jumbling, only the
744
+ * arguments and the function OID matter.
745
+ */
746
+ typedef struct FuncExpr
747
+ {
748
+ Expr xpr;
749
+ /* PG_PROC OID of the function */
750
+ Oid funcid;
751
+ /* PG_TYPE OID of result value */
752
+ Oid funcresulttype pg_node_attr(query_jumble_ignore);
753
+ /* true if function returns set */
754
+ bool funcretset pg_node_attr(query_jumble_ignore);
755
+
756
+ /*
757
+ * true if variadic arguments have been combined into an array last
758
+ * argument
759
+ */
760
+ bool funcvariadic pg_node_attr(query_jumble_ignore);
761
+ /* how to display this function call */
762
+ CoercionForm funcformat pg_node_attr(query_jumble_ignore);
763
+ /* OID of collation of result */
764
+ Oid funccollid pg_node_attr(query_jumble_ignore);
765
+ /* OID of collation that function should use */
766
+ Oid inputcollid pg_node_attr(query_jumble_ignore);
767
+ /* arguments to the function */
768
+ List *args;
769
+ /* token location, or -1 if unknown */
770
+ ParseLoc location;
771
+ } FuncExpr;
772
+
773
+ /*
774
+ * NamedArgExpr - a named argument of a function
775
+ *
776
+ * This node type can only appear in the args list of a FuncCall or FuncExpr
777
+ * node. We support pure positional call notation (no named arguments),
778
+ * named notation (all arguments are named), and mixed notation (unnamed
779
+ * arguments followed by named ones).
780
+ *
781
+ * Parse analysis sets argnumber to the positional index of the argument,
782
+ * but doesn't rearrange the argument list.
783
+ *
784
+ * The planner will convert argument lists to pure positional notation
785
+ * during expression preprocessing, so execution never sees a NamedArgExpr.
786
+ */
787
+ typedef struct NamedArgExpr
788
+ {
789
+ Expr xpr;
790
+ /* the argument expression */
791
+ Expr *arg;
792
+ /* the name */
793
+ char *name pg_node_attr(query_jumble_ignore);
794
+ /* argument's number in positional notation */
795
+ int argnumber;
796
+ /* argument name location, or -1 if unknown */
797
+ ParseLoc location;
798
+ } NamedArgExpr;
799
+
800
+ /*
801
+ * OpExpr - expression node for an operator invocation
802
+ *
803
+ * Semantically, this is essentially the same as a function call.
804
+ *
805
+ * Note that opfuncid is not necessarily filled in immediately on creation
806
+ * of the node. The planner makes sure it is valid before passing the node
807
+ * tree to the executor, but during parsing/planning opfuncid can be 0.
808
+ * Therefore, equal() will accept a zero value as being equal to other values.
809
+ *
810
+ * Internal state information and collation data is irrelevant for the query
811
+ * jumbling.
812
+ */
813
+ typedef struct OpExpr
814
+ {
815
+ Expr xpr;
816
+
817
+ /* PG_OPERATOR OID of the operator */
818
+ Oid opno;
819
+
820
+ /* PG_PROC OID of underlying function */
821
+ Oid opfuncid pg_node_attr(equal_ignore_if_zero, query_jumble_ignore);
822
+
823
+ /* PG_TYPE OID of result value */
824
+ Oid opresulttype pg_node_attr(query_jumble_ignore);
825
+
826
+ /* true if operator returns set */
827
+ bool opretset pg_node_attr(query_jumble_ignore);
828
+
829
+ /* OID of collation of result */
830
+ Oid opcollid pg_node_attr(query_jumble_ignore);
831
+
832
+ /* OID of collation that operator should use */
833
+ Oid inputcollid pg_node_attr(query_jumble_ignore);
834
+
835
+ /* arguments to the operator (1 or 2) */
836
+ List *args;
837
+
838
+ /* token location, or -1 if unknown */
839
+ ParseLoc location;
840
+ } OpExpr;
841
+
842
+ /*
843
+ * DistinctExpr - expression node for "x IS DISTINCT FROM y"
844
+ *
845
+ * Except for the nodetag, this is represented identically to an OpExpr
846
+ * referencing the "=" operator for x and y.
847
+ * We use "=", not the more obvious "<>", because more datatypes have "="
848
+ * than "<>". This means the executor must invert the operator result.
849
+ * Note that the operator function won't be called at all if either input
850
+ * is NULL, since then the result can be determined directly.
851
+ */
852
+ typedef OpExpr DistinctExpr;
853
+
854
+ /*
855
+ * NullIfExpr - a NULLIF expression
856
+ *
857
+ * Like DistinctExpr, this is represented the same as an OpExpr referencing
858
+ * the "=" operator for x and y.
859
+ */
860
+ typedef OpExpr NullIfExpr;
861
+
862
+ /*
863
+ * ScalarArrayOpExpr - expression node for "scalar op ANY/ALL (array)"
864
+ *
865
+ * The operator must yield boolean. It is applied to the left operand
866
+ * and each element of the righthand array, and the results are combined
867
+ * with OR or AND (for ANY or ALL respectively). The node representation
868
+ * is almost the same as for the underlying operator, but we need a useOr
869
+ * flag to remember whether it's ANY or ALL, and we don't have to store
870
+ * the result type (or the collation) because it must be boolean.
871
+ *
872
+ * A ScalarArrayOpExpr with a valid hashfuncid is evaluated during execution
873
+ * by building a hash table containing the Const values from the RHS arg.
874
+ * This table is probed during expression evaluation. The planner will set
875
+ * hashfuncid to the hash function which must be used to build and probe the
876
+ * hash table. The executor determines if it should use hash-based checks or
877
+ * the more traditional means based on if the hashfuncid is set or not.
878
+ *
879
+ * When performing hashed NOT IN, the negfuncid will also be set to the
880
+ * equality function which the hash table must use to build and probe the hash
881
+ * table. opno and opfuncid will remain set to the <> operator and its
882
+ * corresponding function and won't be used during execution. For
883
+ * non-hashtable based NOT INs, negfuncid will be set to InvalidOid. See
884
+ * convert_saop_to_hashed_saop().
885
+ *
886
+ * Similar to OpExpr, opfuncid, hashfuncid, and negfuncid are not necessarily
887
+ * filled in right away, so will be ignored for equality if they are not set
888
+ * yet.
889
+ *
890
+ * OID entries of the internal function types are irrelevant for the query
891
+ * jumbling, but the operator OID and the arguments are.
892
+ */
893
+ typedef struct ScalarArrayOpExpr
894
+ {
895
+ Expr xpr;
896
+
897
+ /* PG_OPERATOR OID of the operator */
898
+ Oid opno;
899
+
900
+ /* PG_PROC OID of comparison function */
901
+ Oid opfuncid pg_node_attr(equal_ignore_if_zero, query_jumble_ignore);
902
+
903
+ /* PG_PROC OID of hash func or InvalidOid */
904
+ Oid hashfuncid pg_node_attr(equal_ignore_if_zero, query_jumble_ignore);
905
+
906
+ /* PG_PROC OID of negator of opfuncid function or InvalidOid. See above */
907
+ Oid negfuncid pg_node_attr(equal_ignore_if_zero, query_jumble_ignore);
908
+
909
+ /* true for ANY, false for ALL */
910
+ bool useOr;
911
+
912
+ /* OID of collation that operator should use */
913
+ Oid inputcollid pg_node_attr(query_jumble_ignore);
914
+
915
+ /* the scalar and array operands */
916
+ List *args;
917
+
918
+ /* token location, or -1 if unknown */
919
+ ParseLoc location;
920
+ } ScalarArrayOpExpr;
921
+
922
+ /*
923
+ * BoolExpr - expression node for the basic Boolean operators AND, OR, NOT
924
+ *
925
+ * Notice the arguments are given as a List. For NOT, of course the list
926
+ * must always have exactly one element. For AND and OR, there can be two
927
+ * or more arguments.
928
+ */
929
+ typedef enum BoolExprType
930
+ {
931
+ AND_EXPR, OR_EXPR, NOT_EXPR
932
+ } BoolExprType;
933
+
934
+ typedef struct BoolExpr
935
+ {
936
+ pg_node_attr(custom_read_write)
937
+
938
+ Expr xpr;
939
+ BoolExprType boolop;
940
+ List *args; /* arguments to this expression */
941
+ ParseLoc location; /* token location, or -1 if unknown */
942
+ } BoolExpr;
943
+
944
+ /*
945
+ * SubLink
946
+ *
947
+ * A SubLink represents a subselect appearing in an expression, and in some
948
+ * cases also the combining operator(s) just above it. The subLinkType
949
+ * indicates the form of the expression represented:
950
+ * EXISTS_SUBLINK EXISTS(SELECT ...)
951
+ * ALL_SUBLINK (lefthand) op ALL (SELECT ...)
952
+ * ANY_SUBLINK (lefthand) op ANY (SELECT ...)
953
+ * ROWCOMPARE_SUBLINK (lefthand) op (SELECT ...)
954
+ * EXPR_SUBLINK (SELECT with single targetlist item ...)
955
+ * MULTIEXPR_SUBLINK (SELECT with multiple targetlist items ...)
956
+ * ARRAY_SUBLINK ARRAY(SELECT with single targetlist item ...)
957
+ * CTE_SUBLINK WITH query (never actually part of an expression)
958
+ * For ALL, ANY, and ROWCOMPARE, the lefthand is a list of expressions of the
959
+ * same length as the subselect's targetlist. ROWCOMPARE will *always* have
960
+ * a list with more than one entry; if the subselect has just one target
961
+ * then the parser will create an EXPR_SUBLINK instead (and any operator
962
+ * above the subselect will be represented separately).
963
+ * ROWCOMPARE, EXPR, and MULTIEXPR require the subselect to deliver at most
964
+ * one row (if it returns no rows, the result is NULL).
965
+ * ALL, ANY, and ROWCOMPARE require the combining operators to deliver boolean
966
+ * results. ALL and ANY combine the per-row results using AND and OR
967
+ * semantics respectively.
968
+ * ARRAY requires just one target column, and creates an array of the target
969
+ * column's type using any number of rows resulting from the subselect.
970
+ *
971
+ * SubLink is classed as an Expr node, but it is not actually executable;
972
+ * it must be replaced in the expression tree by a SubPlan node during
973
+ * planning.
974
+ *
975
+ * NOTE: in the raw output of gram.y, testexpr contains just the raw form
976
+ * of the lefthand expression (if any), and operName is the String name of
977
+ * the combining operator. Also, subselect is a raw parsetree. During parse
978
+ * analysis, the parser transforms testexpr into a complete boolean expression
979
+ * that compares the lefthand value(s) to PARAM_SUBLINK nodes representing the
980
+ * output columns of the subselect. And subselect is transformed to a Query.
981
+ * This is the representation seen in saved rules and in the rewriter.
982
+ *
983
+ * In EXISTS, EXPR, MULTIEXPR, and ARRAY SubLinks, testexpr and operName
984
+ * are unused and are always null.
985
+ *
986
+ * subLinkId is currently used only for MULTIEXPR SubLinks, and is zero in
987
+ * other SubLinks. This number identifies different multiple-assignment
988
+ * subqueries within an UPDATE statement's SET list. It is unique only
989
+ * within a particular targetlist. The output column(s) of the MULTIEXPR
990
+ * are referenced by PARAM_MULTIEXPR Params appearing elsewhere in the tlist.
991
+ *
992
+ * The CTE_SUBLINK case never occurs in actual SubLink nodes, but it is used
993
+ * in SubPlans generated for WITH subqueries.
994
+ */
995
+ typedef enum SubLinkType
996
+ {
997
+ EXISTS_SUBLINK,
998
+ ALL_SUBLINK,
999
+ ANY_SUBLINK,
1000
+ ROWCOMPARE_SUBLINK,
1001
+ EXPR_SUBLINK,
1002
+ MULTIEXPR_SUBLINK,
1003
+ ARRAY_SUBLINK,
1004
+ CTE_SUBLINK, /* for SubPlans only */
1005
+ } SubLinkType;
1006
+
1007
+
1008
+ typedef struct SubLink
1009
+ {
1010
+ Expr xpr;
1011
+ SubLinkType subLinkType; /* see above */
1012
+ int subLinkId; /* ID (1..n); 0 if not MULTIEXPR */
1013
+ Node *testexpr; /* outer-query test for ALL/ANY/ROWCOMPARE */
1014
+ /* originally specified operator name */
1015
+ List *operName pg_node_attr(query_jumble_ignore);
1016
+ /* subselect as Query* or raw parsetree */
1017
+ Node *subselect;
1018
+ ParseLoc location; /* token location, or -1 if unknown */
1019
+ } SubLink;
1020
+
1021
+ /*
1022
+ * SubPlan - executable expression node for a subplan (sub-SELECT)
1023
+ *
1024
+ * The planner replaces SubLink nodes in expression trees with SubPlan
1025
+ * nodes after it has finished planning the subquery. SubPlan references
1026
+ * a sub-plantree stored in the subplans list of the toplevel PlannedStmt.
1027
+ * (We avoid a direct link to make it easier to copy expression trees
1028
+ * without causing multiple processing of the subplan.)
1029
+ *
1030
+ * In an ordinary subplan, testexpr points to an executable expression
1031
+ * (OpExpr, an AND/OR tree of OpExprs, or RowCompareExpr) for the combining
1032
+ * operator(s); the left-hand arguments are the original lefthand expressions,
1033
+ * and the right-hand arguments are PARAM_EXEC Param nodes representing the
1034
+ * outputs of the sub-select. (NOTE: runtime coercion functions may be
1035
+ * inserted as well.) This is just the same expression tree as testexpr in
1036
+ * the original SubLink node, but the PARAM_SUBLINK nodes are replaced by
1037
+ * suitably numbered PARAM_EXEC nodes.
1038
+ *
1039
+ * If the sub-select becomes an initplan rather than a subplan, the executable
1040
+ * expression is part of the outer plan's expression tree (and the SubPlan
1041
+ * node itself is not, but rather is found in the outer plan's initPlan
1042
+ * list). In this case testexpr is NULL to avoid duplication.
1043
+ *
1044
+ * The planner also derives lists of the values that need to be passed into
1045
+ * and out of the subplan. Input values are represented as a list "args" of
1046
+ * expressions to be evaluated in the outer-query context (currently these
1047
+ * args are always just Vars, but in principle they could be any expression).
1048
+ * The values are assigned to the global PARAM_EXEC params indexed by parParam
1049
+ * (the parParam and args lists must have the same ordering). setParam is a
1050
+ * list of the PARAM_EXEC params that are computed by the sub-select, if it
1051
+ * is an initplan or MULTIEXPR plan; they are listed in order by sub-select
1052
+ * output column position. (parParam and setParam are integer Lists, not
1053
+ * Bitmapsets, because their ordering is significant.)
1054
+ *
1055
+ * Also, the planner computes startup and per-call costs for use of the
1056
+ * SubPlan. Note that these include the cost of the subquery proper,
1057
+ * evaluation of the testexpr if any, and any hashtable management overhead.
1058
+ */
1059
+ typedef struct SubPlan
1060
+ {
1061
+ pg_node_attr(no_query_jumble)
1062
+
1063
+ Expr xpr;
1064
+ /* Fields copied from original SubLink: */
1065
+ SubLinkType subLinkType; /* see above */
1066
+ /* The combining operators, transformed to an executable expression: */
1067
+ Node *testexpr; /* OpExpr or RowCompareExpr expression tree */
1068
+ List *paramIds; /* IDs of Params embedded in the above */
1069
+ /* Identification of the Plan tree to use: */
1070
+ int plan_id; /* Index (from 1) in PlannedStmt.subplans */
1071
+ /* Identification of the SubPlan for EXPLAIN and debugging purposes: */
1072
+ char *plan_name; /* A name assigned during planning */
1073
+ /* Extra data useful for determining subplan's output type: */
1074
+ Oid firstColType; /* Type of first column of subplan result */
1075
+ int32 firstColTypmod; /* Typmod of first column of subplan result */
1076
+ Oid firstColCollation; /* Collation of first column of subplan
1077
+ * result */
1078
+ /* Information about execution strategy: */
1079
+ bool useHashTable; /* true to store subselect output in a hash
1080
+ * table (implies we are doing "IN") */
1081
+ bool unknownEqFalse; /* true if it's okay to return FALSE when the
1082
+ * spec result is UNKNOWN; this allows much
1083
+ * simpler handling of null values */
1084
+ bool parallel_safe; /* is the subplan parallel-safe? */
1085
+ /* Note: parallel_safe does not consider contents of testexpr or args */
1086
+ /* Information for passing params into and out of the subselect: */
1087
+ /* setParam and parParam are lists of integers (param IDs) */
1088
+ List *setParam; /* initplan and MULTIEXPR subqueries have to
1089
+ * set these Params for parent plan */
1090
+ List *parParam; /* indices of input Params from parent plan */
1091
+ List *args; /* exprs to pass as parParam values */
1092
+ /* Estimated execution costs: */
1093
+ Cost startup_cost; /* one-time setup cost */
1094
+ Cost per_call_cost; /* cost for each subplan evaluation */
1095
+ } SubPlan;
1096
+
1097
+ /*
1098
+ * AlternativeSubPlan - expression node for a choice among SubPlans
1099
+ *
1100
+ * This is used only transiently during planning: by the time the plan
1101
+ * reaches the executor, all AlternativeSubPlan nodes have been removed.
1102
+ *
1103
+ * The subplans are given as a List so that the node definition need not
1104
+ * change if there's ever more than two alternatives. For the moment,
1105
+ * though, there are always exactly two; and the first one is the fast-start
1106
+ * plan.
1107
+ */
1108
+ typedef struct AlternativeSubPlan
1109
+ {
1110
+ pg_node_attr(no_query_jumble)
1111
+
1112
+ Expr xpr;
1113
+ List *subplans; /* SubPlan(s) with equivalent results */
1114
+ } AlternativeSubPlan;
1115
+
1116
+ /* ----------------
1117
+ * FieldSelect
1118
+ *
1119
+ * FieldSelect represents the operation of extracting one field from a tuple
1120
+ * value. At runtime, the input expression is expected to yield a rowtype
1121
+ * Datum. The specified field number is extracted and returned as a Datum.
1122
+ * ----------------
1123
+ */
1124
+
1125
+ typedef struct FieldSelect
1126
+ {
1127
+ Expr xpr;
1128
+ Expr *arg; /* input expression */
1129
+ AttrNumber fieldnum; /* attribute number of field to extract */
1130
+ /* type of the field (result type of this node) */
1131
+ Oid resulttype pg_node_attr(query_jumble_ignore);
1132
+ /* output typmod (usually -1) */
1133
+ int32 resulttypmod pg_node_attr(query_jumble_ignore);
1134
+ /* OID of collation of the field */
1135
+ Oid resultcollid pg_node_attr(query_jumble_ignore);
1136
+ } FieldSelect;
1137
+
1138
+ /* ----------------
1139
+ * FieldStore
1140
+ *
1141
+ * FieldStore represents the operation of modifying one field in a tuple
1142
+ * value, yielding a new tuple value (the input is not touched!). Like
1143
+ * the assign case of SubscriptingRef, this is used to implement UPDATE of a
1144
+ * portion of a column.
1145
+ *
1146
+ * resulttype is always a named composite type (not a domain). To update
1147
+ * a composite domain value, apply CoerceToDomain to the FieldStore.
1148
+ *
1149
+ * A single FieldStore can actually represent updates of several different
1150
+ * fields. The parser only generates FieldStores with single-element lists,
1151
+ * but the planner will collapse multiple updates of the same base column
1152
+ * into one FieldStore.
1153
+ * ----------------
1154
+ */
1155
+
1156
+ typedef struct FieldStore
1157
+ {
1158
+ Expr xpr;
1159
+ Expr *arg; /* input tuple value */
1160
+ List *newvals; /* new value(s) for field(s) */
1161
+ /* integer list of field attnums */
1162
+ List *fieldnums pg_node_attr(query_jumble_ignore);
1163
+ /* type of result (same as type of arg) */
1164
+ Oid resulttype pg_node_attr(query_jumble_ignore);
1165
+ /* Like RowExpr, we deliberately omit a typmod and collation here */
1166
+ } FieldStore;
1167
+
1168
+ /* ----------------
1169
+ * RelabelType
1170
+ *
1171
+ * RelabelType represents a "dummy" type coercion between two binary-
1172
+ * compatible datatypes, such as reinterpreting the result of an OID
1173
+ * expression as an int4. It is a no-op at runtime; we only need it
1174
+ * to provide a place to store the correct type to be attributed to
1175
+ * the expression result during type resolution. (We can't get away
1176
+ * with just overwriting the type field of the input expression node,
1177
+ * so we need a separate node to show the coercion's result type.)
1178
+ * ----------------
1179
+ */
1180
+
1181
+ typedef struct RelabelType
1182
+ {
1183
+ Expr xpr;
1184
+ Expr *arg; /* input expression */
1185
+ Oid resulttype; /* output type of coercion expression */
1186
+ /* output typmod (usually -1) */
1187
+ int32 resulttypmod pg_node_attr(query_jumble_ignore);
1188
+ /* OID of collation, or InvalidOid if none */
1189
+ Oid resultcollid pg_node_attr(query_jumble_ignore);
1190
+ /* how to display this node */
1191
+ CoercionForm relabelformat pg_node_attr(query_jumble_ignore);
1192
+ ParseLoc location; /* token location, or -1 if unknown */
1193
+ } RelabelType;
1194
+
1195
+ /* ----------------
1196
+ * CoerceViaIO
1197
+ *
1198
+ * CoerceViaIO represents a type coercion between two types whose textual
1199
+ * representations are compatible, implemented by invoking the source type's
1200
+ * typoutput function then the destination type's typinput function.
1201
+ * ----------------
1202
+ */
1203
+
1204
+ typedef struct CoerceViaIO
1205
+ {
1206
+ Expr xpr;
1207
+ Expr *arg; /* input expression */
1208
+ Oid resulttype; /* output type of coercion */
1209
+ /* output typmod is not stored, but is presumed -1 */
1210
+ /* OID of collation, or InvalidOid if none */
1211
+ Oid resultcollid pg_node_attr(query_jumble_ignore);
1212
+ /* how to display this node */
1213
+ CoercionForm coerceformat pg_node_attr(query_jumble_ignore);
1214
+ ParseLoc location; /* token location, or -1 if unknown */
1215
+ } CoerceViaIO;
1216
+
1217
+ /* ----------------
1218
+ * ArrayCoerceExpr
1219
+ *
1220
+ * ArrayCoerceExpr represents a type coercion from one array type to another,
1221
+ * which is implemented by applying the per-element coercion expression
1222
+ * "elemexpr" to each element of the source array. Within elemexpr, the
1223
+ * source element is represented by a CaseTestExpr node. Note that even if
1224
+ * elemexpr is a no-op (that is, just CaseTestExpr + RelabelType), the
1225
+ * coercion still requires some effort: we have to fix the element type OID
1226
+ * stored in the array header.
1227
+ * ----------------
1228
+ */
1229
+
1230
+ typedef struct ArrayCoerceExpr
1231
+ {
1232
+ Expr xpr;
1233
+ Expr *arg; /* input expression (yields an array) */
1234
+ Expr *elemexpr; /* expression representing per-element work */
1235
+ Oid resulttype; /* output type of coercion (an array type) */
1236
+ /* output typmod (also element typmod) */
1237
+ int32 resulttypmod pg_node_attr(query_jumble_ignore);
1238
+ /* OID of collation, or InvalidOid if none */
1239
+ Oid resultcollid pg_node_attr(query_jumble_ignore);
1240
+ /* how to display this node */
1241
+ CoercionForm coerceformat pg_node_attr(query_jumble_ignore);
1242
+ ParseLoc location; /* token location, or -1 if unknown */
1243
+ } ArrayCoerceExpr;
1244
+
1245
+ /* ----------------
1246
+ * ConvertRowtypeExpr
1247
+ *
1248
+ * ConvertRowtypeExpr represents a type coercion from one composite type
1249
+ * to another, where the source type is guaranteed to contain all the columns
1250
+ * needed for the destination type plus possibly others; the columns need not
1251
+ * be in the same positions, but are matched up by name. This is primarily
1252
+ * used to convert a whole-row value of an inheritance child table into a
1253
+ * valid whole-row value of its parent table's rowtype. Both resulttype
1254
+ * and the exposed type of "arg" must be named composite types (not domains).
1255
+ * ----------------
1256
+ */
1257
+
1258
+ typedef struct ConvertRowtypeExpr
1259
+ {
1260
+ Expr xpr;
1261
+ Expr *arg; /* input expression */
1262
+ Oid resulttype; /* output type (always a composite type) */
1263
+ /* Like RowExpr, we deliberately omit a typmod and collation here */
1264
+ /* how to display this node */
1265
+ CoercionForm convertformat pg_node_attr(query_jumble_ignore);
1266
+ ParseLoc location; /* token location, or -1 if unknown */
1267
+ } ConvertRowtypeExpr;
1268
+
1269
+ /*----------
1270
+ * CollateExpr - COLLATE
1271
+ *
1272
+ * The planner replaces CollateExpr with RelabelType during expression
1273
+ * preprocessing, so execution never sees a CollateExpr.
1274
+ *----------
1275
+ */
1276
+ typedef struct CollateExpr
1277
+ {
1278
+ Expr xpr;
1279
+ Expr *arg; /* input expression */
1280
+ Oid collOid; /* collation's OID */
1281
+ ParseLoc location; /* token location, or -1 if unknown */
1282
+ } CollateExpr;
1283
+
1284
+ /*----------
1285
+ * CaseExpr - a CASE expression
1286
+ *
1287
+ * We support two distinct forms of CASE expression:
1288
+ * CASE WHEN boolexpr THEN expr [ WHEN boolexpr THEN expr ... ]
1289
+ * CASE testexpr WHEN compexpr THEN expr [ WHEN compexpr THEN expr ... ]
1290
+ * These are distinguishable by the "arg" field being NULL in the first case
1291
+ * and the testexpr in the second case.
1292
+ *
1293
+ * In the raw grammar output for the second form, the condition expressions
1294
+ * of the WHEN clauses are just the comparison values. Parse analysis
1295
+ * converts these to valid boolean expressions of the form
1296
+ * CaseTestExpr '=' compexpr
1297
+ * where the CaseTestExpr node is a placeholder that emits the correct
1298
+ * value at runtime. This structure is used so that the testexpr need be
1299
+ * evaluated only once. Note that after parse analysis, the condition
1300
+ * expressions always yield boolean.
1301
+ *
1302
+ * Note: we can test whether a CaseExpr has been through parse analysis
1303
+ * yet by checking whether casetype is InvalidOid or not.
1304
+ *----------
1305
+ */
1306
+ typedef struct CaseExpr
1307
+ {
1308
+ Expr xpr;
1309
+ /* type of expression result */
1310
+ Oid casetype pg_node_attr(query_jumble_ignore);
1311
+ /* OID of collation, or InvalidOid if none */
1312
+ Oid casecollid pg_node_attr(query_jumble_ignore);
1313
+ Expr *arg; /* implicit equality comparison argument */
1314
+ List *args; /* the arguments (list of WHEN clauses) */
1315
+ Expr *defresult; /* the default result (ELSE clause) */
1316
+ ParseLoc location; /* token location, or -1 if unknown */
1317
+ } CaseExpr;
1318
+
1319
+ /*
1320
+ * CaseWhen - one arm of a CASE expression
1321
+ */
1322
+ typedef struct CaseWhen
1323
+ {
1324
+ Expr xpr;
1325
+ Expr *expr; /* condition expression */
1326
+ Expr *result; /* substitution result */
1327
+ ParseLoc location; /* token location, or -1 if unknown */
1328
+ } CaseWhen;
1329
+
1330
+ /*
1331
+ * Placeholder node for the test value to be processed by a CASE expression.
1332
+ * This is effectively like a Param, but can be implemented more simply
1333
+ * since we need only one replacement value at a time.
1334
+ *
1335
+ * We also abuse this node type for some other purposes, including:
1336
+ * * Placeholder for the current array element value in ArrayCoerceExpr;
1337
+ * see build_coercion_expression().
1338
+ * * Nested FieldStore/SubscriptingRef assignment expressions in INSERT/UPDATE;
1339
+ * see transformAssignmentIndirection().
1340
+ * * Placeholder for intermediate results in some SQL/JSON expression nodes,
1341
+ * such as JsonConstructorExpr.
1342
+ *
1343
+ * The uses in CaseExpr and ArrayCoerceExpr are safe only to the extent that
1344
+ * there is not any other CaseExpr or ArrayCoerceExpr between the value source
1345
+ * node and its child CaseTestExpr(s). This is true in the parse analysis
1346
+ * output, but the planner's function-inlining logic has to be careful not to
1347
+ * break it.
1348
+ *
1349
+ * The nested-assignment-expression case is safe because the only node types
1350
+ * that can be above such CaseTestExprs are FieldStore and SubscriptingRef.
1351
+ */
1352
+ typedef struct CaseTestExpr
1353
+ {
1354
+ Expr xpr;
1355
+ Oid typeId; /* type for substituted value */
1356
+ /* typemod for substituted value */
1357
+ int32 typeMod pg_node_attr(query_jumble_ignore);
1358
+ /* collation for the substituted value */
1359
+ Oid collation pg_node_attr(query_jumble_ignore);
1360
+ } CaseTestExpr;
1361
+
1362
+ /*
1363
+ * ArrayExpr - an ARRAY[] expression
1364
+ *
1365
+ * Note: if multidims is false, the constituent expressions all yield the
1366
+ * scalar type identified by element_typeid. If multidims is true, the
1367
+ * constituent expressions all yield arrays of element_typeid (ie, the same
1368
+ * type as array_typeid); at runtime we must check for compatible subscripts.
1369
+ */
1370
+ typedef struct ArrayExpr
1371
+ {
1372
+ Expr xpr;
1373
+ /* type of expression result */
1374
+ Oid array_typeid pg_node_attr(query_jumble_ignore);
1375
+ /* OID of collation, or InvalidOid if none */
1376
+ Oid array_collid pg_node_attr(query_jumble_ignore);
1377
+ /* common type of array elements */
1378
+ Oid element_typeid pg_node_attr(query_jumble_ignore);
1379
+ /* the array elements or sub-arrays */
1380
+ List *elements;
1381
+ /* true if elements are sub-arrays */
1382
+ bool multidims pg_node_attr(query_jumble_ignore);
1383
+ /* token location, or -1 if unknown */
1384
+ ParseLoc location;
1385
+ } ArrayExpr;
1386
+
1387
+ /*
1388
+ * RowExpr - a ROW() expression
1389
+ *
1390
+ * Note: the list of fields must have a one-for-one correspondence with
1391
+ * physical fields of the associated rowtype, although it is okay for it
1392
+ * to be shorter than the rowtype. That is, the N'th list element must
1393
+ * match up with the N'th physical field. When the N'th physical field
1394
+ * is a dropped column (attisdropped) then the N'th list element can just
1395
+ * be a NULL constant. (This case can only occur for named composite types,
1396
+ * not RECORD types, since those are built from the RowExpr itself rather
1397
+ * than vice versa.) It is important not to assume that length(args) is
1398
+ * the same as the number of columns logically present in the rowtype.
1399
+ *
1400
+ * colnames provides field names if the ROW() result is of type RECORD.
1401
+ * Names *must* be provided if row_typeid is RECORDOID; but if it is a
1402
+ * named composite type, colnames will be ignored in favor of using the
1403
+ * type's cataloged field names, so colnames should be NIL. Like the
1404
+ * args list, colnames is defined to be one-for-one with physical fields
1405
+ * of the rowtype (although dropped columns shouldn't appear in the
1406
+ * RECORD case, so this fine point is currently moot).
1407
+ */
1408
+ typedef struct RowExpr
1409
+ {
1410
+ Expr xpr;
1411
+ List *args; /* the fields */
1412
+
1413
+ /* RECORDOID or a composite type's ID */
1414
+ Oid row_typeid pg_node_attr(query_jumble_ignore);
1415
+
1416
+ /*
1417
+ * row_typeid cannot be a domain over composite, only plain composite. To
1418
+ * create a composite domain value, apply CoerceToDomain to the RowExpr.
1419
+ *
1420
+ * Note: we deliberately do NOT store a typmod. Although a typmod will be
1421
+ * associated with specific RECORD types at runtime, it will differ for
1422
+ * different backends, and so cannot safely be stored in stored
1423
+ * parsetrees. We must assume typmod -1 for a RowExpr node.
1424
+ *
1425
+ * We don't need to store a collation either. The result type is
1426
+ * necessarily composite, and composite types never have a collation.
1427
+ */
1428
+
1429
+ /* how to display this node */
1430
+ CoercionForm row_format pg_node_attr(query_jumble_ignore);
1431
+
1432
+ /* list of String, or NIL */
1433
+ List *colnames pg_node_attr(query_jumble_ignore);
1434
+
1435
+ ParseLoc location; /* token location, or -1 if unknown */
1436
+ } RowExpr;
1437
+
1438
+ /*
1439
+ * RowCompareExpr - row-wise comparison, such as (a, b) <= (1, 2)
1440
+ *
1441
+ * We support row comparison for any operator that can be determined to
1442
+ * act like =, <>, <, <=, >, or >= (we determine this by looking for the
1443
+ * operator in btree opfamilies). Note that the same operator name might
1444
+ * map to a different operator for each pair of row elements, since the
1445
+ * element datatypes can vary.
1446
+ *
1447
+ * A RowCompareExpr node is only generated for the < <= > >= cases;
1448
+ * the = and <> cases are translated to simple AND or OR combinations
1449
+ * of the pairwise comparisons. However, we include = and <> in the
1450
+ * RowCompareType enum for the convenience of parser logic.
1451
+ */
1452
+ typedef enum RowCompareType
1453
+ {
1454
+ /* Values of this enum are chosen to match btree strategy numbers */
1455
+ ROWCOMPARE_LT = 1, /* BTLessStrategyNumber */
1456
+ ROWCOMPARE_LE = 2, /* BTLessEqualStrategyNumber */
1457
+ ROWCOMPARE_EQ = 3, /* BTEqualStrategyNumber */
1458
+ ROWCOMPARE_GE = 4, /* BTGreaterEqualStrategyNumber */
1459
+ ROWCOMPARE_GT = 5, /* BTGreaterStrategyNumber */
1460
+ ROWCOMPARE_NE = 6, /* no such btree strategy */
1461
+ } RowCompareType;
1462
+
1463
+ typedef struct RowCompareExpr
1464
+ {
1465
+ Expr xpr;
1466
+
1467
+ /* LT LE GE or GT, never EQ or NE */
1468
+ RowCompareType rctype;
1469
+ /* OID list of pairwise comparison ops */
1470
+ List *opnos pg_node_attr(query_jumble_ignore);
1471
+ /* OID list of containing operator families */
1472
+ List *opfamilies pg_node_attr(query_jumble_ignore);
1473
+ /* OID list of collations for comparisons */
1474
+ List *inputcollids pg_node_attr(query_jumble_ignore);
1475
+ /* the left-hand input arguments */
1476
+ List *largs;
1477
+ /* the right-hand input arguments */
1478
+ List *rargs;
1479
+ } RowCompareExpr;
1480
+
1481
+ /*
1482
+ * CoalesceExpr - a COALESCE expression
1483
+ */
1484
+ typedef struct CoalesceExpr
1485
+ {
1486
+ Expr xpr;
1487
+ /* type of expression result */
1488
+ Oid coalescetype pg_node_attr(query_jumble_ignore);
1489
+ /* OID of collation, or InvalidOid if none */
1490
+ Oid coalescecollid pg_node_attr(query_jumble_ignore);
1491
+ /* the arguments */
1492
+ List *args;
1493
+ /* token location, or -1 if unknown */
1494
+ ParseLoc location;
1495
+ } CoalesceExpr;
1496
+
1497
+ /*
1498
+ * MinMaxExpr - a GREATEST or LEAST function
1499
+ */
1500
+ typedef enum MinMaxOp
1501
+ {
1502
+ IS_GREATEST,
1503
+ IS_LEAST
1504
+ } MinMaxOp;
1505
+
1506
+ typedef struct MinMaxExpr
1507
+ {
1508
+ Expr xpr;
1509
+ /* common type of arguments and result */
1510
+ Oid minmaxtype pg_node_attr(query_jumble_ignore);
1511
+ /* OID of collation of result */
1512
+ Oid minmaxcollid pg_node_attr(query_jumble_ignore);
1513
+ /* OID of collation that function should use */
1514
+ Oid inputcollid pg_node_attr(query_jumble_ignore);
1515
+ /* function to execute */
1516
+ MinMaxOp op;
1517
+ /* the arguments */
1518
+ List *args;
1519
+ /* token location, or -1 if unknown */
1520
+ ParseLoc location;
1521
+ } MinMaxExpr;
1522
+
1523
+ /*
1524
+ * SQLValueFunction - parameterless functions with special grammar productions
1525
+ *
1526
+ * The SQL standard categorizes some of these as <datetime value function>
1527
+ * and others as <general value specification>. We call 'em SQLValueFunctions
1528
+ * for lack of a better term. We store type and typmod of the result so that
1529
+ * some code doesn't need to know each function individually, and because
1530
+ * we would need to store typmod anyway for some of the datetime functions.
1531
+ * Note that currently, all variants return non-collating datatypes, so we do
1532
+ * not need a collation field; also, all these functions are stable.
1533
+ */
1534
+ typedef enum SQLValueFunctionOp
1535
+ {
1536
+ SVFOP_CURRENT_DATE,
1537
+ SVFOP_CURRENT_TIME,
1538
+ SVFOP_CURRENT_TIME_N,
1539
+ SVFOP_CURRENT_TIMESTAMP,
1540
+ SVFOP_CURRENT_TIMESTAMP_N,
1541
+ SVFOP_LOCALTIME,
1542
+ SVFOP_LOCALTIME_N,
1543
+ SVFOP_LOCALTIMESTAMP,
1544
+ SVFOP_LOCALTIMESTAMP_N,
1545
+ SVFOP_CURRENT_ROLE,
1546
+ SVFOP_CURRENT_USER,
1547
+ SVFOP_USER,
1548
+ SVFOP_SESSION_USER,
1549
+ SVFOP_CURRENT_CATALOG,
1550
+ SVFOP_CURRENT_SCHEMA,
1551
+ } SQLValueFunctionOp;
1552
+
1553
+ typedef struct SQLValueFunction
1554
+ {
1555
+ Expr xpr;
1556
+ SQLValueFunctionOp op; /* which function this is */
1557
+
1558
+ /*
1559
+ * Result type/typmod. Type is fully determined by "op", so no need to
1560
+ * include this Oid in the query jumbling.
1561
+ */
1562
+ Oid type pg_node_attr(query_jumble_ignore);
1563
+ int32 typmod;
1564
+ ParseLoc location; /* token location, or -1 if unknown */
1565
+ } SQLValueFunction;
1566
+
1567
+ /*
1568
+ * XmlExpr - various SQL/XML functions requiring special grammar productions
1569
+ *
1570
+ * 'name' carries the "NAME foo" argument (already XML-escaped).
1571
+ * 'named_args' and 'arg_names' represent an xml_attribute list.
1572
+ * 'args' carries all other arguments.
1573
+ *
1574
+ * Note: result type/typmod/collation are not stored, but can be deduced
1575
+ * from the XmlExprOp. The type/typmod fields are just used for display
1576
+ * purposes, and are NOT necessarily the true result type of the node.
1577
+ */
1578
+ typedef enum XmlExprOp
1579
+ {
1580
+ IS_XMLCONCAT, /* XMLCONCAT(args) */
1581
+ IS_XMLELEMENT, /* XMLELEMENT(name, xml_attributes, args) */
1582
+ IS_XMLFOREST, /* XMLFOREST(xml_attributes) */
1583
+ IS_XMLPARSE, /* XMLPARSE(text, is_doc, preserve_ws) */
1584
+ IS_XMLPI, /* XMLPI(name [, args]) */
1585
+ IS_XMLROOT, /* XMLROOT(xml, version, standalone) */
1586
+ IS_XMLSERIALIZE, /* XMLSERIALIZE(is_document, xmlval, indent) */
1587
+ IS_DOCUMENT, /* xmlval IS DOCUMENT */
1588
+ } XmlExprOp;
1589
+
1590
+ typedef enum XmlOptionType
1591
+ {
1592
+ XMLOPTION_DOCUMENT,
1593
+ XMLOPTION_CONTENT,
1594
+ } XmlOptionType;
1595
+
1596
+ typedef struct XmlExpr
1597
+ {
1598
+ Expr xpr;
1599
+ /* xml function ID */
1600
+ XmlExprOp op;
1601
+ /* name in xml(NAME foo ...) syntaxes */
1602
+ char *name pg_node_attr(query_jumble_ignore);
1603
+ /* non-XML expressions for xml_attributes */
1604
+ List *named_args;
1605
+ /* parallel list of String values */
1606
+ List *arg_names pg_node_attr(query_jumble_ignore);
1607
+ /* list of expressions */
1608
+ List *args;
1609
+ /* DOCUMENT or CONTENT */
1610
+ XmlOptionType xmloption pg_node_attr(query_jumble_ignore);
1611
+ /* INDENT option for XMLSERIALIZE */
1612
+ bool indent;
1613
+ /* target type/typmod for XMLSERIALIZE */
1614
+ Oid type pg_node_attr(query_jumble_ignore);
1615
+ int32 typmod pg_node_attr(query_jumble_ignore);
1616
+ /* token location, or -1 if unknown */
1617
+ ParseLoc location;
1618
+ } XmlExpr;
1619
+
1620
+ /*
1621
+ * JsonEncoding -
1622
+ * representation of JSON ENCODING clause
1623
+ */
1624
+ typedef enum JsonEncoding
1625
+ {
1626
+ JS_ENC_DEFAULT, /* unspecified */
1627
+ JS_ENC_UTF8,
1628
+ JS_ENC_UTF16,
1629
+ JS_ENC_UTF32,
1630
+ } JsonEncoding;
1631
+
1632
+ /*
1633
+ * JsonFormatType -
1634
+ * enumeration of JSON formats used in JSON FORMAT clause
1635
+ */
1636
+ typedef enum JsonFormatType
1637
+ {
1638
+ JS_FORMAT_DEFAULT, /* unspecified */
1639
+ JS_FORMAT_JSON, /* FORMAT JSON [ENCODING ...] */
1640
+ JS_FORMAT_JSONB, /* implicit internal format for RETURNING
1641
+ * jsonb */
1642
+ } JsonFormatType;
1643
+
1644
+ /*
1645
+ * JsonFormat -
1646
+ * representation of JSON FORMAT clause
1647
+ */
1648
+ typedef struct JsonFormat
1649
+ {
1650
+ NodeTag type;
1651
+ JsonFormatType format_type; /* format type */
1652
+ JsonEncoding encoding; /* JSON encoding */
1653
+ ParseLoc location; /* token location, or -1 if unknown */
1654
+ } JsonFormat;
1655
+
1656
+ /*
1657
+ * JsonReturning -
1658
+ * transformed representation of JSON RETURNING clause
1659
+ */
1660
+ typedef struct JsonReturning
1661
+ {
1662
+ NodeTag type;
1663
+ JsonFormat *format; /* output JSON format */
1664
+ Oid typid; /* target type Oid */
1665
+ int32 typmod; /* target type modifier */
1666
+ } JsonReturning;
1667
+
1668
+ /*
1669
+ * JsonValueExpr -
1670
+ * representation of JSON value expression (expr [FORMAT JsonFormat])
1671
+ *
1672
+ * The actual value is obtained by evaluating formatted_expr. raw_expr is
1673
+ * only there for displaying the original user-written expression and is not
1674
+ * evaluated by ExecInterpExpr() and eval_const_expressions_mutator().
1675
+ */
1676
+ typedef struct JsonValueExpr
1677
+ {
1678
+ NodeTag type;
1679
+ Expr *raw_expr; /* raw expression */
1680
+ Expr *formatted_expr; /* formatted expression */
1681
+ JsonFormat *format; /* FORMAT clause, if specified */
1682
+ } JsonValueExpr;
1683
+
1684
+ typedef enum JsonConstructorType
1685
+ {
1686
+ JSCTOR_JSON_OBJECT = 1,
1687
+ JSCTOR_JSON_ARRAY = 2,
1688
+ JSCTOR_JSON_OBJECTAGG = 3,
1689
+ JSCTOR_JSON_ARRAYAGG = 4,
1690
+ JSCTOR_JSON_PARSE = 5,
1691
+ JSCTOR_JSON_SCALAR = 6,
1692
+ JSCTOR_JSON_SERIALIZE = 7,
1693
+ } JsonConstructorType;
1694
+
1695
+ /*
1696
+ * JsonConstructorExpr -
1697
+ * wrapper over FuncExpr/Aggref/WindowFunc for SQL/JSON constructors
1698
+ */
1699
+ typedef struct JsonConstructorExpr
1700
+ {
1701
+ Expr xpr;
1702
+ JsonConstructorType type; /* constructor type */
1703
+ List *args;
1704
+ Expr *func; /* underlying json[b]_xxx() function call */
1705
+ Expr *coercion; /* coercion to RETURNING type */
1706
+ JsonReturning *returning; /* RETURNING clause */
1707
+ bool absent_on_null; /* ABSENT ON NULL? */
1708
+ bool unique; /* WITH UNIQUE KEYS? (JSON_OBJECT[AGG] only) */
1709
+ ParseLoc location;
1710
+ } JsonConstructorExpr;
1711
+
1712
+ /*
1713
+ * JsonValueType -
1714
+ * representation of JSON item type in IS JSON predicate
1715
+ */
1716
+ typedef enum JsonValueType
1717
+ {
1718
+ JS_TYPE_ANY, /* IS JSON [VALUE] */
1719
+ JS_TYPE_OBJECT, /* IS JSON OBJECT */
1720
+ JS_TYPE_ARRAY, /* IS JSON ARRAY */
1721
+ JS_TYPE_SCALAR, /* IS JSON SCALAR */
1722
+ } JsonValueType;
1723
+
1724
+ /*
1725
+ * JsonIsPredicate -
1726
+ * representation of IS JSON predicate
1727
+ */
1728
+ typedef struct JsonIsPredicate
1729
+ {
1730
+ NodeTag type;
1731
+ Node *expr; /* subject expression */
1732
+ JsonFormat *format; /* FORMAT clause, if specified */
1733
+ JsonValueType item_type; /* JSON item type */
1734
+ bool unique_keys; /* check key uniqueness? */
1735
+ ParseLoc location; /* token location, or -1 if unknown */
1736
+ } JsonIsPredicate;
1737
+
1738
+ /* Nodes used in SQL/JSON query functions */
1739
+
1740
+ /*
1741
+ * JsonWrapper -
1742
+ * representation of WRAPPER clause for JSON_QUERY()
1743
+ */
1744
+ typedef enum JsonWrapper
1745
+ {
1746
+ JSW_UNSPEC,
1747
+ JSW_NONE,
1748
+ JSW_CONDITIONAL,
1749
+ JSW_UNCONDITIONAL,
1750
+ } JsonWrapper;
1751
+
1752
+ /*
1753
+ * JsonBehaviorType -
1754
+ * enumeration of behavior types used in SQL/JSON ON ERROR/EMPTY clauses
1755
+ *
1756
+ * If enum members are reordered, get_json_behavior() from ruleutils.c
1757
+ * must be updated accordingly.
1758
+ */
1759
+ typedef enum JsonBehaviorType
1760
+ {
1761
+ JSON_BEHAVIOR_NULL = 0,
1762
+ JSON_BEHAVIOR_ERROR,
1763
+ JSON_BEHAVIOR_EMPTY,
1764
+ JSON_BEHAVIOR_TRUE,
1765
+ JSON_BEHAVIOR_FALSE,
1766
+ JSON_BEHAVIOR_UNKNOWN,
1767
+ JSON_BEHAVIOR_EMPTY_ARRAY,
1768
+ JSON_BEHAVIOR_EMPTY_OBJECT,
1769
+ JSON_BEHAVIOR_DEFAULT,
1770
+ } JsonBehaviorType;
1771
+
1772
+ /*
1773
+ * JsonBehavior
1774
+ * Specifications for ON ERROR / ON EMPTY behaviors of SQL/JSON
1775
+ * query functions specified by a JsonExpr
1776
+ *
1777
+ * 'expr' is the expression to emit when a given behavior (EMPTY or ERROR)
1778
+ * occurs on evaluating the SQL/JSON query function. 'coerce' is set to true
1779
+ * if 'expr' isn't already of the expected target type given by
1780
+ * JsonExpr.returning.
1781
+ */
1782
+ typedef struct JsonBehavior
1783
+ {
1784
+ NodeTag type;
1785
+
1786
+ JsonBehaviorType btype;
1787
+ Node *expr;
1788
+ bool coerce;
1789
+ ParseLoc location; /* token location, or -1 if unknown */
1790
+ } JsonBehavior;
1791
+
1792
+ /*
1793
+ * JsonExprOp -
1794
+ * enumeration of SQL/JSON query function types
1795
+ */
1796
+ typedef enum JsonExprOp
1797
+ {
1798
+ JSON_EXISTS_OP, /* JSON_EXISTS() */
1799
+ JSON_QUERY_OP, /* JSON_QUERY() */
1800
+ JSON_VALUE_OP, /* JSON_VALUE() */
1801
+ JSON_TABLE_OP, /* JSON_TABLE() */
1802
+ } JsonExprOp;
1803
+
1804
+ /*
1805
+ * JsonExpr -
1806
+ * Transformed representation of JSON_VALUE(), JSON_QUERY(), and
1807
+ * JSON_EXISTS()
1808
+ */
1809
+ typedef struct JsonExpr
1810
+ {
1811
+ Expr xpr;
1812
+
1813
+ JsonExprOp op;
1814
+
1815
+ char *column_name; /* JSON_TABLE() column name or NULL if this is
1816
+ * not for a JSON_TABLE() */
1817
+
1818
+ /* jsonb-valued expression to query */
1819
+ Node *formatted_expr;
1820
+
1821
+ /* Format of the above expression needed by ruleutils.c */
1822
+ JsonFormat *format;
1823
+
1824
+ /* jsonpath-valued expression containing the query pattern */
1825
+ Node *path_spec;
1826
+
1827
+ /* Expected type/format of the output. */
1828
+ JsonReturning *returning;
1829
+
1830
+ /* Information about the PASSING argument expressions */
1831
+ List *passing_names;
1832
+ List *passing_values;
1833
+
1834
+ /* User-specified or default ON EMPTY and ON ERROR behaviors */
1835
+ JsonBehavior *on_empty;
1836
+ JsonBehavior *on_error;
1837
+
1838
+ /*
1839
+ * Information about converting the result of jsonpath functions
1840
+ * JsonPathQuery() and JsonPathValue() to the RETURNING type.
1841
+ */
1842
+ bool use_io_coercion;
1843
+ bool use_json_coercion;
1844
+
1845
+ /* WRAPPER specification for JSON_QUERY */
1846
+ JsonWrapper wrapper;
1847
+
1848
+ /* KEEP or OMIT QUOTES for singleton scalars returned by JSON_QUERY() */
1849
+ bool omit_quotes;
1850
+
1851
+ /* JsonExpr's collation. */
1852
+ Oid collation;
1853
+
1854
+ /* Original JsonFuncExpr's location */
1855
+ ParseLoc location;
1856
+ } JsonExpr;
1857
+
1858
+ /*
1859
+ * JsonTablePath
1860
+ * A JSON path expression to be computed as part of evaluating
1861
+ * a JSON_TABLE plan node
1862
+ */
1863
+ typedef struct JsonTablePath
1864
+ {
1865
+ NodeTag type;
1866
+
1867
+ Const *value;
1868
+ char *name;
1869
+ } JsonTablePath;
1870
+
1871
+ /*
1872
+ * JsonTablePlan -
1873
+ * Abstract class to represent different types of JSON_TABLE "plans".
1874
+ * A plan is used to generate a "row pattern" value by evaluating a JSON
1875
+ * path expression against an input JSON document, which is then used for
1876
+ * populating JSON_TABLE() columns
1877
+ */
1878
+ typedef struct JsonTablePlan
1879
+ {
1880
+ pg_node_attr(abstract)
1881
+
1882
+ NodeTag type;
1883
+ } JsonTablePlan;
1884
+
1885
+ /*
1886
+ * JSON_TABLE plan to evaluate a JSON path expression and NESTED paths, if
1887
+ * any.
1888
+ */
1889
+ typedef struct JsonTablePathScan
1890
+ {
1891
+ JsonTablePlan plan;
1892
+
1893
+ /* JSON path to evaluate */
1894
+ JsonTablePath *path;
1895
+
1896
+ /*
1897
+ * ERROR/EMPTY ON ERROR behavior; only significant in the plan for the
1898
+ * top-level path.
1899
+ */
1900
+ bool errorOnError;
1901
+
1902
+ /* Plan(s) for nested columns, if any. */
1903
+ JsonTablePlan *child;
1904
+
1905
+ /*
1906
+ * 0-based index in TableFunc.colvalexprs of the 1st and the last column
1907
+ * covered by this plan. Both are -1 if all columns are nested and thus
1908
+ * computed by the child plan(s).
1909
+ */
1910
+ int colMin;
1911
+ int colMax;
1912
+ } JsonTablePathScan;
1913
+
1914
+ /*
1915
+ * JsonTableSiblingJoin -
1916
+ * Plan to join rows of sibling NESTED COLUMNS clauses in the same parent
1917
+ * COLUMNS clause
1918
+ */
1919
+ typedef struct JsonTableSiblingJoin
1920
+ {
1921
+ JsonTablePlan plan;
1922
+
1923
+ JsonTablePlan *lplan;
1924
+ JsonTablePlan *rplan;
1925
+ } JsonTableSiblingJoin;
1926
+
1927
+ /* ----------------
1928
+ * NullTest
1929
+ *
1930
+ * NullTest represents the operation of testing a value for NULLness.
1931
+ * The appropriate test is performed and returned as a boolean Datum.
1932
+ *
1933
+ * When argisrow is false, this simply represents a test for the null value.
1934
+ *
1935
+ * When argisrow is true, the input expression must yield a rowtype, and
1936
+ * the node implements "row IS [NOT] NULL" per the SQL standard. This
1937
+ * includes checking individual fields for NULLness when the row datum
1938
+ * itself isn't NULL.
1939
+ *
1940
+ * NOTE: the combination of a rowtype input and argisrow==false does NOT
1941
+ * correspond to the SQL notation "row IS [NOT] NULL"; instead, this case
1942
+ * represents the SQL notation "row IS [NOT] DISTINCT FROM NULL".
1943
+ * ----------------
1944
+ */
1945
+
1946
+ typedef enum NullTestType
1947
+ {
1948
+ IS_NULL, IS_NOT_NULL
1949
+ } NullTestType;
1950
+
1951
+ typedef struct NullTest
1952
+ {
1953
+ Expr xpr;
1954
+ Expr *arg; /* input expression */
1955
+ NullTestType nulltesttype; /* IS NULL, IS NOT NULL */
1956
+ /* T to perform field-by-field null checks */
1957
+ bool argisrow pg_node_attr(query_jumble_ignore);
1958
+ ParseLoc location; /* token location, or -1 if unknown */
1959
+ } NullTest;
1960
+
1961
+ /*
1962
+ * BooleanTest
1963
+ *
1964
+ * BooleanTest represents the operation of determining whether a boolean
1965
+ * is TRUE, FALSE, or UNKNOWN (ie, NULL). All six meaningful combinations
1966
+ * are supported. Note that a NULL input does *not* cause a NULL result.
1967
+ * The appropriate test is performed and returned as a boolean Datum.
1968
+ */
1969
+
1970
+ typedef enum BoolTestType
1971
+ {
1972
+ IS_TRUE, IS_NOT_TRUE, IS_FALSE, IS_NOT_FALSE, IS_UNKNOWN, IS_NOT_UNKNOWN
1973
+ } BoolTestType;
1974
+
1975
+ typedef struct BooleanTest
1976
+ {
1977
+ Expr xpr;
1978
+ Expr *arg; /* input expression */
1979
+ BoolTestType booltesttype; /* test type */
1980
+ ParseLoc location; /* token location, or -1 if unknown */
1981
+ } BooleanTest;
1982
+
1983
+
1984
+ /*
1985
+ * MergeAction
1986
+ *
1987
+ * Transformed representation of a WHEN clause in a MERGE statement
1988
+ */
1989
+
1990
+ typedef enum MergeMatchKind
1991
+ {
1992
+ MERGE_WHEN_MATCHED,
1993
+ MERGE_WHEN_NOT_MATCHED_BY_SOURCE,
1994
+ MERGE_WHEN_NOT_MATCHED_BY_TARGET
1995
+ } MergeMatchKind;
1996
+
1997
+ #define NUM_MERGE_MATCH_KINDS (MERGE_WHEN_NOT_MATCHED_BY_TARGET + 1)
1998
+
1999
+ typedef struct MergeAction
2000
+ {
2001
+ NodeTag type;
2002
+ MergeMatchKind matchKind; /* MATCHED/NOT MATCHED BY SOURCE/TARGET */
2003
+ CmdType commandType; /* INSERT/UPDATE/DELETE/DO NOTHING */
2004
+ /* OVERRIDING clause */
2005
+ OverridingKind override pg_node_attr(query_jumble_ignore);
2006
+ Node *qual; /* transformed WHEN conditions */
2007
+ List *targetList; /* the target list (of TargetEntry) */
2008
+ /* target attribute numbers of an UPDATE */
2009
+ List *updateColnos pg_node_attr(query_jumble_ignore);
2010
+ } MergeAction;
2011
+
2012
+ /*
2013
+ * CoerceToDomain
2014
+ *
2015
+ * CoerceToDomain represents the operation of coercing a value to a domain
2016
+ * type. At runtime (and not before) the precise set of constraints to be
2017
+ * checked will be determined. If the value passes, it is returned as the
2018
+ * result; if not, an error is raised. Note that this is equivalent to
2019
+ * RelabelType in the scenario where no constraints are applied.
2020
+ */
2021
+ typedef struct CoerceToDomain
2022
+ {
2023
+ Expr xpr;
2024
+ Expr *arg; /* input expression */
2025
+ Oid resulttype; /* domain type ID (result type) */
2026
+ /* output typmod (currently always -1) */
2027
+ int32 resulttypmod pg_node_attr(query_jumble_ignore);
2028
+ /* OID of collation, or InvalidOid if none */
2029
+ Oid resultcollid pg_node_attr(query_jumble_ignore);
2030
+ /* how to display this node */
2031
+ CoercionForm coercionformat pg_node_attr(query_jumble_ignore);
2032
+ ParseLoc location; /* token location, or -1 if unknown */
2033
+ } CoerceToDomain;
2034
+
2035
+ /*
2036
+ * Placeholder node for the value to be processed by a domain's check
2037
+ * constraint. This is effectively like a Param, but can be implemented more
2038
+ * simply since we need only one replacement value at a time.
2039
+ *
2040
+ * Note: the typeId/typeMod/collation will be set from the domain's base type,
2041
+ * not the domain itself. This is because we shouldn't consider the value
2042
+ * to be a member of the domain if we haven't yet checked its constraints.
2043
+ */
2044
+ typedef struct CoerceToDomainValue
2045
+ {
2046
+ Expr xpr;
2047
+ /* type for substituted value */
2048
+ Oid typeId;
2049
+ /* typemod for substituted value */
2050
+ int32 typeMod pg_node_attr(query_jumble_ignore);
2051
+ /* collation for the substituted value */
2052
+ Oid collation pg_node_attr(query_jumble_ignore);
2053
+ /* token location, or -1 if unknown */
2054
+ ParseLoc location;
2055
+ } CoerceToDomainValue;
2056
+
2057
+ /*
2058
+ * Placeholder node for a DEFAULT marker in an INSERT or UPDATE command.
2059
+ *
2060
+ * This is not an executable expression: it must be replaced by the actual
2061
+ * column default expression during rewriting. But it is convenient to
2062
+ * treat it as an expression node during parsing and rewriting.
2063
+ */
2064
+ typedef struct SetToDefault
2065
+ {
2066
+ Expr xpr;
2067
+ /* type for substituted value */
2068
+ Oid typeId;
2069
+ /* typemod for substituted value */
2070
+ int32 typeMod pg_node_attr(query_jumble_ignore);
2071
+ /* collation for the substituted value */
2072
+ Oid collation pg_node_attr(query_jumble_ignore);
2073
+ /* token location, or -1 if unknown */
2074
+ ParseLoc location;
2075
+ } SetToDefault;
2076
+
2077
+ /*
2078
+ * Node representing [WHERE] CURRENT OF cursor_name
2079
+ *
2080
+ * CURRENT OF is a bit like a Var, in that it carries the rangetable index
2081
+ * of the target relation being constrained; this aids placing the expression
2082
+ * correctly during planning. We can assume however that its "levelsup" is
2083
+ * always zero, due to the syntactic constraints on where it can appear.
2084
+ * Also, cvarno will always be a true RT index, never INNER_VAR etc.
2085
+ *
2086
+ * The referenced cursor can be represented either as a hardwired string
2087
+ * or as a reference to a run-time parameter of type REFCURSOR. The latter
2088
+ * case is for the convenience of plpgsql.
2089
+ */
2090
+ typedef struct CurrentOfExpr
2091
+ {
2092
+ Expr xpr;
2093
+ Index cvarno; /* RT index of target relation */
2094
+ char *cursor_name; /* name of referenced cursor, or NULL */
2095
+ int cursor_param; /* refcursor parameter number, or 0 */
2096
+ } CurrentOfExpr;
2097
+
2098
+ /*
2099
+ * NextValueExpr - get next value from sequence
2100
+ *
2101
+ * This has the same effect as calling the nextval() function, but it does not
2102
+ * check permissions on the sequence. This is used for identity columns,
2103
+ * where the sequence is an implicit dependency without its own permissions.
2104
+ */
2105
+ typedef struct NextValueExpr
2106
+ {
2107
+ Expr xpr;
2108
+ Oid seqid;
2109
+ Oid typeId;
2110
+ } NextValueExpr;
2111
+
2112
+ /*
2113
+ * InferenceElem - an element of a unique index inference specification
2114
+ *
2115
+ * This mostly matches the structure of IndexElems, but having a dedicated
2116
+ * primnode allows for a clean separation between the use of index parameters
2117
+ * by utility commands, and this node.
2118
+ */
2119
+ typedef struct InferenceElem
2120
+ {
2121
+ Expr xpr;
2122
+ Node *expr; /* expression to infer from, or NULL */
2123
+ Oid infercollid; /* OID of collation, or InvalidOid */
2124
+ Oid inferopclass; /* OID of att opclass, or InvalidOid */
2125
+ } InferenceElem;
2126
+
2127
+ /*--------------------
2128
+ * TargetEntry -
2129
+ * a target entry (used in query target lists)
2130
+ *
2131
+ * Strictly speaking, a TargetEntry isn't an expression node (since it can't
2132
+ * be evaluated by ExecEvalExpr). But we treat it as one anyway, since in
2133
+ * very many places it's convenient to process a whole query targetlist as a
2134
+ * single expression tree.
2135
+ *
2136
+ * In a SELECT's targetlist, resno should always be equal to the item's
2137
+ * ordinal position (counting from 1). However, in an INSERT or UPDATE
2138
+ * targetlist, resno represents the attribute number of the destination
2139
+ * column for the item; so there may be missing or out-of-order resnos.
2140
+ * It is even legal to have duplicated resnos; consider
2141
+ * UPDATE table SET arraycol[1] = ..., arraycol[2] = ..., ...
2142
+ * In an INSERT, the rewriter and planner will normalize the tlist by
2143
+ * reordering it into physical column order and filling in default values
2144
+ * for any columns not assigned values by the original query. In an UPDATE,
2145
+ * after the rewriter merges multiple assignments for the same column, the
2146
+ * planner extracts the target-column numbers into a separate "update_colnos"
2147
+ * list, and then renumbers the tlist elements serially. Thus, tlist resnos
2148
+ * match ordinal position in all tlists seen by the executor; but it is wrong
2149
+ * to assume that before planning has happened.
2150
+ *
2151
+ * resname is required to represent the correct column name in non-resjunk
2152
+ * entries of top-level SELECT targetlists, since it will be used as the
2153
+ * column title sent to the frontend. In most other contexts it is only
2154
+ * a debugging aid, and may be wrong or even NULL. (In particular, it may
2155
+ * be wrong in a tlist from a stored rule, if the referenced column has been
2156
+ * renamed by ALTER TABLE since the rule was made. Also, the planner tends
2157
+ * to store NULL rather than look up a valid name for tlist entries in
2158
+ * non-toplevel plan nodes.) In resjunk entries, resname should be either
2159
+ * a specific system-generated name (such as "ctid") or NULL; anything else
2160
+ * risks confusing ExecGetJunkAttribute!
2161
+ *
2162
+ * ressortgroupref is used in the representation of ORDER BY, GROUP BY, and
2163
+ * DISTINCT items. Targetlist entries with ressortgroupref=0 are not
2164
+ * sort/group items. If ressortgroupref>0, then this item is an ORDER BY,
2165
+ * GROUP BY, and/or DISTINCT target value. No two entries in a targetlist
2166
+ * may have the same nonzero ressortgroupref --- but there is no particular
2167
+ * meaning to the nonzero values, except as tags. (For example, one must
2168
+ * not assume that lower ressortgroupref means a more significant sort key.)
2169
+ * The order of the associated SortGroupClause lists determine the semantics.
2170
+ *
2171
+ * resorigtbl/resorigcol identify the source of the column, if it is a
2172
+ * simple reference to a column of a base table (or view). If it is not
2173
+ * a simple reference, these fields are zeroes.
2174
+ *
2175
+ * If resjunk is true then the column is a working column (such as a sort key)
2176
+ * that should be removed from the final output of the query. Resjunk columns
2177
+ * must have resnos that cannot duplicate any regular column's resno. Also
2178
+ * note that there are places that assume resjunk columns come after non-junk
2179
+ * columns.
2180
+ *--------------------
2181
+ */
2182
+ typedef struct TargetEntry
2183
+ {
2184
+ Expr xpr;
2185
+ /* expression to evaluate */
2186
+ Expr *expr;
2187
+ /* attribute number (see notes above) */
2188
+ AttrNumber resno;
2189
+ /* name of the column (could be NULL) */
2190
+ char *resname pg_node_attr(query_jumble_ignore);
2191
+ /* nonzero if referenced by a sort/group clause */
2192
+ Index ressortgroupref;
2193
+ /* OID of column's source table */
2194
+ Oid resorigtbl pg_node_attr(query_jumble_ignore);
2195
+ /* column's number in source table */
2196
+ AttrNumber resorigcol pg_node_attr(query_jumble_ignore);
2197
+ /* set to true to eliminate the attribute from final target list */
2198
+ bool resjunk pg_node_attr(query_jumble_ignore);
2199
+ } TargetEntry;
2200
+
2201
+
2202
+ /* ----------------------------------------------------------------
2203
+ * node types for join trees
2204
+ *
2205
+ * The leaves of a join tree structure are RangeTblRef nodes. Above
2206
+ * these, JoinExpr nodes can appear to denote a specific kind of join
2207
+ * or qualified join. Also, FromExpr nodes can appear to denote an
2208
+ * ordinary cross-product join ("FROM foo, bar, baz WHERE ...").
2209
+ * FromExpr is like a JoinExpr of jointype JOIN_INNER, except that it
2210
+ * may have any number of child nodes, not just two.
2211
+ *
2212
+ * NOTE: the top level of a Query's jointree is always a FromExpr.
2213
+ * Even if the jointree contains no rels, there will be a FromExpr.
2214
+ *
2215
+ * NOTE: the qualification expressions present in JoinExpr nodes are
2216
+ * *in addition to* the query's main WHERE clause, which appears as the
2217
+ * qual of the top-level FromExpr. The reason for associating quals with
2218
+ * specific nodes in the jointree is that the position of a qual is critical
2219
+ * when outer joins are present. (If we enforce a qual too soon or too late,
2220
+ * that may cause the outer join to produce the wrong set of NULL-extended
2221
+ * rows.) If all joins are inner joins then all the qual positions are
2222
+ * semantically interchangeable.
2223
+ *
2224
+ * NOTE: in the raw output of gram.y, a join tree contains RangeVar,
2225
+ * RangeSubselect, and RangeFunction nodes, which are all replaced by
2226
+ * RangeTblRef nodes during the parse analysis phase. Also, the top-level
2227
+ * FromExpr is added during parse analysis; the grammar regards FROM and
2228
+ * WHERE as separate.
2229
+ * ----------------------------------------------------------------
2230
+ */
2231
+
2232
+ /*
2233
+ * RangeTblRef - reference to an entry in the query's rangetable
2234
+ *
2235
+ * We could use direct pointers to the RT entries and skip having these
2236
+ * nodes, but multiple pointers to the same node in a querytree cause
2237
+ * lots of headaches, so it seems better to store an index into the RT.
2238
+ */
2239
+ typedef struct RangeTblRef
2240
+ {
2241
+ NodeTag type;
2242
+ int rtindex;
2243
+ } RangeTblRef;
2244
+
2245
+ /*----------
2246
+ * JoinExpr - for SQL JOIN expressions
2247
+ *
2248
+ * isNatural, usingClause, and quals are interdependent. The user can write
2249
+ * only one of NATURAL, USING(), or ON() (this is enforced by the grammar).
2250
+ * If he writes NATURAL then parse analysis generates the equivalent USING()
2251
+ * list, and from that fills in "quals" with the right equality comparisons.
2252
+ * If he writes USING() then "quals" is filled with equality comparisons.
2253
+ * If he writes ON() then only "quals" is set. Note that NATURAL/USING
2254
+ * are not equivalent to ON() since they also affect the output column list.
2255
+ *
2256
+ * alias is an Alias node representing the AS alias-clause attached to the
2257
+ * join expression, or NULL if no clause. NB: presence or absence of the
2258
+ * alias has a critical impact on semantics, because a join with an alias
2259
+ * restricts visibility of the tables/columns inside it.
2260
+ *
2261
+ * join_using_alias is an Alias node representing the join correlation
2262
+ * name that SQL:2016 and later allow to be attached to JOIN/USING.
2263
+ * Its column alias list includes only the common column names from USING,
2264
+ * and it does not restrict visibility of the join's input tables.
2265
+ *
2266
+ * During parse analysis, an RTE is created for the Join, and its index
2267
+ * is filled into rtindex. This RTE is present mainly so that Vars can
2268
+ * be created that refer to the outputs of the join. The planner sometimes
2269
+ * generates JoinExprs internally; these can have rtindex = 0 if there are
2270
+ * no join alias variables referencing such joins.
2271
+ *----------
2272
+ */
2273
+ typedef struct JoinExpr
2274
+ {
2275
+ NodeTag type;
2276
+ JoinType jointype; /* type of join */
2277
+ bool isNatural; /* Natural join? Will need to shape table */
2278
+ Node *larg; /* left subtree */
2279
+ Node *rarg; /* right subtree */
2280
+ /* USING clause, if any (list of String) */
2281
+ List *usingClause pg_node_attr(query_jumble_ignore);
2282
+ /* alias attached to USING clause, if any */
2283
+ Alias *join_using_alias pg_node_attr(query_jumble_ignore);
2284
+ /* qualifiers on join, if any */
2285
+ Node *quals;
2286
+ /* user-written alias clause, if any */
2287
+ Alias *alias pg_node_attr(query_jumble_ignore);
2288
+ /* RT index assigned for join, or 0 */
2289
+ int rtindex;
2290
+ } JoinExpr;
2291
+
2292
+ /*----------
2293
+ * FromExpr - represents a FROM ... WHERE ... construct
2294
+ *
2295
+ * This is both more flexible than a JoinExpr (it can have any number of
2296
+ * children, including zero) and less so --- we don't need to deal with
2297
+ * aliases and so on. The output column set is implicitly just the union
2298
+ * of the outputs of the children.
2299
+ *----------
2300
+ */
2301
+ typedef struct FromExpr
2302
+ {
2303
+ NodeTag type;
2304
+ List *fromlist; /* List of join subtrees */
2305
+ Node *quals; /* qualifiers on join, if any */
2306
+ } FromExpr;
2307
+
2308
+ /*----------
2309
+ * OnConflictExpr - represents an ON CONFLICT DO ... expression
2310
+ *
2311
+ * The optimizer requires a list of inference elements, and optionally a WHERE
2312
+ * clause to infer a unique index. The unique index (or, occasionally,
2313
+ * indexes) inferred are used to arbitrate whether or not the alternative ON
2314
+ * CONFLICT path is taken.
2315
+ *----------
2316
+ */
2317
+ typedef struct OnConflictExpr
2318
+ {
2319
+ NodeTag type;
2320
+ OnConflictAction action; /* DO NOTHING or UPDATE? */
2321
+
2322
+ /* Arbiter */
2323
+ List *arbiterElems; /* unique index arbiter list (of
2324
+ * InferenceElem's) */
2325
+ Node *arbiterWhere; /* unique index arbiter WHERE clause */
2326
+ Oid constraint; /* pg_constraint OID for arbiter */
2327
+
2328
+ /* ON CONFLICT UPDATE */
2329
+ List *onConflictSet; /* List of ON CONFLICT SET TargetEntrys */
2330
+ Node *onConflictWhere; /* qualifiers to restrict UPDATE to */
2331
+ int exclRelIndex; /* RT index of 'excluded' relation */
2332
+ List *exclRelTlist; /* tlist of the EXCLUDED pseudo relation */
2333
+ } OnConflictExpr;
2334
+
2335
+ #endif /* PRIMNODES_H */