gitlab-pg_query 1.3.1 → 2.0.4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (480) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +217 -99
  3. data/README.md +92 -69
  4. data/Rakefile +85 -5
  5. data/ext/pg_query/extconf.rb +3 -40
  6. data/ext/pg_query/guc-file.c +0 -0
  7. data/ext/pg_query/include/access/amapi.h +246 -0
  8. data/ext/pg_query/include/access/attmap.h +52 -0
  9. data/ext/pg_query/include/access/attnum.h +64 -0
  10. data/ext/pg_query/include/access/clog.h +61 -0
  11. data/ext/pg_query/include/access/commit_ts.h +77 -0
  12. data/ext/pg_query/include/access/detoast.h +92 -0
  13. data/ext/pg_query/include/access/genam.h +228 -0
  14. data/ext/pg_query/include/access/gin.h +78 -0
  15. data/ext/pg_query/include/access/htup.h +89 -0
  16. data/ext/pg_query/include/access/htup_details.h +819 -0
  17. data/ext/pg_query/include/access/itup.h +161 -0
  18. data/ext/pg_query/include/access/parallel.h +82 -0
  19. data/ext/pg_query/include/access/printtup.h +35 -0
  20. data/ext/pg_query/include/access/relation.h +28 -0
  21. data/ext/pg_query/include/access/relscan.h +176 -0
  22. data/ext/pg_query/include/access/rmgr.h +35 -0
  23. data/ext/pg_query/include/access/rmgrlist.h +49 -0
  24. data/ext/pg_query/include/access/sdir.h +58 -0
  25. data/ext/pg_query/include/access/skey.h +151 -0
  26. data/ext/pg_query/include/access/stratnum.h +83 -0
  27. data/ext/pg_query/include/access/sysattr.h +29 -0
  28. data/ext/pg_query/include/access/table.h +27 -0
  29. data/ext/pg_query/include/access/tableam.h +1825 -0
  30. data/ext/pg_query/include/access/transam.h +265 -0
  31. data/ext/pg_query/include/access/tupconvert.h +51 -0
  32. data/ext/pg_query/include/access/tupdesc.h +154 -0
  33. data/ext/pg_query/include/access/tupmacs.h +247 -0
  34. data/ext/pg_query/include/access/twophase.h +61 -0
  35. data/ext/pg_query/include/access/xact.h +463 -0
  36. data/ext/pg_query/include/access/xlog.h +398 -0
  37. data/ext/pg_query/include/access/xlog_internal.h +330 -0
  38. data/ext/pg_query/include/access/xlogdefs.h +109 -0
  39. data/ext/pg_query/include/access/xloginsert.h +64 -0
  40. data/ext/pg_query/include/access/xlogreader.h +327 -0
  41. data/ext/pg_query/include/access/xlogrecord.h +227 -0
  42. data/ext/pg_query/include/bootstrap/bootstrap.h +62 -0
  43. data/ext/pg_query/include/c.h +1322 -0
  44. data/ext/pg_query/include/catalog/catalog.h +42 -0
  45. data/ext/pg_query/include/catalog/catversion.h +58 -0
  46. data/ext/pg_query/include/catalog/dependency.h +275 -0
  47. data/ext/pg_query/include/catalog/genbki.h +64 -0
  48. data/ext/pg_query/include/catalog/index.h +199 -0
  49. data/ext/pg_query/include/catalog/indexing.h +366 -0
  50. data/ext/pg_query/include/catalog/namespace.h +188 -0
  51. data/ext/pg_query/include/catalog/objectaccess.h +197 -0
  52. data/ext/pg_query/include/catalog/objectaddress.h +84 -0
  53. data/ext/pg_query/include/catalog/pg_aggregate.h +176 -0
  54. data/ext/pg_query/include/catalog/pg_aggregate_d.h +77 -0
  55. data/ext/pg_query/include/catalog/pg_am.h +60 -0
  56. data/ext/pg_query/include/catalog/pg_am_d.h +45 -0
  57. data/ext/pg_query/include/catalog/pg_attribute.h +204 -0
  58. data/ext/pg_query/include/catalog/pg_attribute_d.h +59 -0
  59. data/ext/pg_query/include/catalog/pg_authid.h +58 -0
  60. data/ext/pg_query/include/catalog/pg_authid_d.h +49 -0
  61. data/ext/pg_query/include/catalog/pg_class.h +200 -0
  62. data/ext/pg_query/include/catalog/pg_class_d.h +103 -0
  63. data/ext/pg_query/include/catalog/pg_collation.h +73 -0
  64. data/ext/pg_query/include/catalog/pg_collation_d.h +45 -0
  65. data/ext/pg_query/include/catalog/pg_constraint.h +247 -0
  66. data/ext/pg_query/include/catalog/pg_constraint_d.h +67 -0
  67. data/ext/pg_query/include/catalog/pg_control.h +250 -0
  68. data/ext/pg_query/include/catalog/pg_conversion.h +72 -0
  69. data/ext/pg_query/include/catalog/pg_conversion_d.h +35 -0
  70. data/ext/pg_query/include/catalog/pg_depend.h +73 -0
  71. data/ext/pg_query/include/catalog/pg_depend_d.h +34 -0
  72. data/ext/pg_query/include/catalog/pg_event_trigger.h +51 -0
  73. data/ext/pg_query/include/catalog/pg_event_trigger_d.h +34 -0
  74. data/ext/pg_query/include/catalog/pg_index.h +80 -0
  75. data/ext/pg_query/include/catalog/pg_index_d.h +56 -0
  76. data/ext/pg_query/include/catalog/pg_language.h +67 -0
  77. data/ext/pg_query/include/catalog/pg_language_d.h +39 -0
  78. data/ext/pg_query/include/catalog/pg_namespace.h +59 -0
  79. data/ext/pg_query/include/catalog/pg_namespace_d.h +34 -0
  80. data/ext/pg_query/include/catalog/pg_opclass.h +85 -0
  81. data/ext/pg_query/include/catalog/pg_opclass_d.h +49 -0
  82. data/ext/pg_query/include/catalog/pg_operator.h +102 -0
  83. data/ext/pg_query/include/catalog/pg_operator_d.h +106 -0
  84. data/ext/pg_query/include/catalog/pg_opfamily.h +60 -0
  85. data/ext/pg_query/include/catalog/pg_opfamily_d.h +47 -0
  86. data/ext/pg_query/include/catalog/pg_partitioned_table.h +63 -0
  87. data/ext/pg_query/include/catalog/pg_partitioned_table_d.h +35 -0
  88. data/ext/pg_query/include/catalog/pg_proc.h +211 -0
  89. data/ext/pg_query/include/catalog/pg_proc_d.h +99 -0
  90. data/ext/pg_query/include/catalog/pg_publication.h +115 -0
  91. data/ext/pg_query/include/catalog/pg_publication_d.h +36 -0
  92. data/ext/pg_query/include/catalog/pg_replication_origin.h +57 -0
  93. data/ext/pg_query/include/catalog/pg_replication_origin_d.h +29 -0
  94. data/ext/pg_query/include/catalog/pg_statistic.h +275 -0
  95. data/ext/pg_query/include/catalog/pg_statistic_d.h +194 -0
  96. data/ext/pg_query/include/catalog/pg_statistic_ext.h +74 -0
  97. data/ext/pg_query/include/catalog/pg_statistic_ext_d.h +40 -0
  98. data/ext/pg_query/include/catalog/pg_transform.h +45 -0
  99. data/ext/pg_query/include/catalog/pg_transform_d.h +32 -0
  100. data/ext/pg_query/include/catalog/pg_trigger.h +137 -0
  101. data/ext/pg_query/include/catalog/pg_trigger_d.h +106 -0
  102. data/ext/pg_query/include/catalog/pg_ts_config.h +50 -0
  103. data/ext/pg_query/include/catalog/pg_ts_config_d.h +32 -0
  104. data/ext/pg_query/include/catalog/pg_ts_dict.h +54 -0
  105. data/ext/pg_query/include/catalog/pg_ts_dict_d.h +33 -0
  106. data/ext/pg_query/include/catalog/pg_ts_parser.h +57 -0
  107. data/ext/pg_query/include/catalog/pg_ts_parser_d.h +35 -0
  108. data/ext/pg_query/include/catalog/pg_ts_template.h +48 -0
  109. data/ext/pg_query/include/catalog/pg_ts_template_d.h +32 -0
  110. data/ext/pg_query/include/catalog/pg_type.h +372 -0
  111. data/ext/pg_query/include/catalog/pg_type_d.h +285 -0
  112. data/ext/pg_query/include/catalog/storage.h +48 -0
  113. data/ext/pg_query/include/commands/async.h +54 -0
  114. data/ext/pg_query/include/commands/dbcommands.h +35 -0
  115. data/ext/pg_query/include/commands/defrem.h +173 -0
  116. data/ext/pg_query/include/commands/event_trigger.h +88 -0
  117. data/ext/pg_query/include/commands/explain.h +127 -0
  118. data/ext/pg_query/include/commands/prepare.h +61 -0
  119. data/ext/pg_query/include/commands/tablespace.h +67 -0
  120. data/ext/pg_query/include/commands/trigger.h +277 -0
  121. data/ext/pg_query/include/commands/user.h +37 -0
  122. data/ext/pg_query/include/commands/vacuum.h +293 -0
  123. data/ext/pg_query/include/commands/variable.h +38 -0
  124. data/ext/pg_query/include/common/file_perm.h +56 -0
  125. data/ext/pg_query/include/common/hashfn.h +104 -0
  126. data/ext/pg_query/include/common/ip.h +37 -0
  127. data/ext/pg_query/include/common/keywords.h +33 -0
  128. data/ext/pg_query/include/common/kwlookup.h +44 -0
  129. data/ext/pg_query/include/common/relpath.h +90 -0
  130. data/ext/pg_query/include/common/string.h +19 -0
  131. data/ext/pg_query/include/common/unicode_combining_table.h +196 -0
  132. data/ext/pg_query/include/datatype/timestamp.h +197 -0
  133. data/ext/pg_query/include/executor/execdesc.h +70 -0
  134. data/ext/pg_query/include/executor/executor.h +614 -0
  135. data/ext/pg_query/include/executor/functions.h +41 -0
  136. data/ext/pg_query/include/executor/instrument.h +101 -0
  137. data/ext/pg_query/include/executor/spi.h +175 -0
  138. data/ext/pg_query/include/executor/tablefunc.h +67 -0
  139. data/ext/pg_query/include/executor/tuptable.h +487 -0
  140. data/ext/pg_query/include/fmgr.h +775 -0
  141. data/ext/pg_query/include/funcapi.h +348 -0
  142. data/ext/pg_query/include/getaddrinfo.h +162 -0
  143. data/ext/pg_query/include/jit/jit.h +105 -0
  144. data/ext/pg_query/include/kwlist_d.h +1072 -0
  145. data/ext/pg_query/include/lib/ilist.h +727 -0
  146. data/ext/pg_query/include/lib/pairingheap.h +102 -0
  147. data/ext/pg_query/include/lib/simplehash.h +1059 -0
  148. data/ext/pg_query/include/lib/stringinfo.h +161 -0
  149. data/ext/pg_query/include/libpq/auth.h +29 -0
  150. data/ext/pg_query/include/libpq/crypt.h +46 -0
  151. data/ext/pg_query/include/libpq/hba.h +140 -0
  152. data/ext/pg_query/include/libpq/libpq-be.h +326 -0
  153. data/ext/pg_query/include/libpq/libpq.h +133 -0
  154. data/ext/pg_query/include/libpq/pqcomm.h +208 -0
  155. data/ext/pg_query/include/libpq/pqformat.h +210 -0
  156. data/ext/pg_query/include/libpq/pqsignal.h +42 -0
  157. data/ext/pg_query/include/mb/pg_wchar.h +672 -0
  158. data/ext/pg_query/include/mb/stringinfo_mb.h +24 -0
  159. data/ext/pg_query/include/miscadmin.h +476 -0
  160. data/ext/pg_query/include/nodes/bitmapset.h +122 -0
  161. data/ext/pg_query/include/nodes/execnodes.h +2520 -0
  162. data/ext/pg_query/include/nodes/extensible.h +160 -0
  163. data/ext/pg_query/include/nodes/lockoptions.h +61 -0
  164. data/ext/pg_query/include/nodes/makefuncs.h +108 -0
  165. data/ext/pg_query/include/nodes/memnodes.h +108 -0
  166. data/ext/pg_query/include/nodes/nodeFuncs.h +162 -0
  167. data/ext/pg_query/include/nodes/nodes.h +842 -0
  168. data/ext/pg_query/include/nodes/params.h +170 -0
  169. data/ext/pg_query/include/nodes/parsenodes.h +3579 -0
  170. data/ext/pg_query/include/nodes/pathnodes.h +2556 -0
  171. data/ext/pg_query/include/nodes/pg_list.h +605 -0
  172. data/ext/pg_query/include/nodes/plannodes.h +1251 -0
  173. data/ext/pg_query/include/nodes/primnodes.h +1541 -0
  174. data/ext/pg_query/include/nodes/print.h +34 -0
  175. data/ext/pg_query/include/nodes/tidbitmap.h +75 -0
  176. data/ext/pg_query/include/nodes/value.h +61 -0
  177. data/ext/pg_query/include/optimizer/cost.h +206 -0
  178. data/ext/pg_query/include/optimizer/geqo.h +88 -0
  179. data/ext/pg_query/include/optimizer/geqo_gene.h +45 -0
  180. data/ext/pg_query/include/optimizer/optimizer.h +199 -0
  181. data/ext/pg_query/include/optimizer/paths.h +249 -0
  182. data/ext/pg_query/include/optimizer/planmain.h +119 -0
  183. data/ext/pg_query/include/parser/analyze.h +49 -0
  184. data/ext/pg_query/include/parser/gram.h +1067 -0
  185. data/ext/pg_query/include/parser/gramparse.h +75 -0
  186. data/ext/pg_query/include/parser/kwlist.h +477 -0
  187. data/ext/pg_query/include/parser/parse_agg.h +68 -0
  188. data/ext/pg_query/include/parser/parse_clause.h +54 -0
  189. data/ext/pg_query/include/parser/parse_coerce.h +97 -0
  190. data/ext/pg_query/include/parser/parse_collate.h +27 -0
  191. data/ext/pg_query/include/parser/parse_expr.h +26 -0
  192. data/ext/pg_query/include/parser/parse_func.h +73 -0
  193. data/ext/pg_query/include/parser/parse_node.h +327 -0
  194. data/ext/pg_query/include/parser/parse_oper.h +67 -0
  195. data/ext/pg_query/include/parser/parse_relation.h +123 -0
  196. data/ext/pg_query/include/parser/parse_target.h +46 -0
  197. data/ext/pg_query/include/parser/parse_type.h +60 -0
  198. data/ext/pg_query/include/parser/parser.h +41 -0
  199. data/ext/pg_query/include/parser/parsetree.h +61 -0
  200. data/ext/pg_query/include/parser/scanner.h +152 -0
  201. data/ext/pg_query/include/parser/scansup.h +30 -0
  202. data/ext/pg_query/include/partitioning/partdefs.h +26 -0
  203. data/ext/pg_query/include/pg_config.h +989 -0
  204. data/ext/pg_query/include/pg_config_ext.h +8 -0
  205. data/ext/pg_query/include/pg_config_manual.h +350 -0
  206. data/ext/pg_query/include/pg_config_os.h +8 -0
  207. data/ext/pg_query/include/pg_getopt.h +56 -0
  208. data/ext/pg_query/include/pg_query.h +121 -0
  209. data/ext/pg_query/include/pg_query_enum_defs.c +2454 -0
  210. data/ext/pg_query/include/pg_query_fingerprint_conds.c +875 -0
  211. data/ext/pg_query/include/pg_query_fingerprint_defs.c +12413 -0
  212. data/ext/pg_query/include/pg_query_json_helper.c +61 -0
  213. data/ext/pg_query/include/pg_query_outfuncs_conds.c +686 -0
  214. data/ext/pg_query/include/pg_query_outfuncs_defs.c +2437 -0
  215. data/ext/pg_query/include/pg_query_readfuncs_conds.c +222 -0
  216. data/ext/pg_query/include/pg_query_readfuncs_defs.c +2878 -0
  217. data/ext/pg_query/include/pg_trace.h +17 -0
  218. data/ext/pg_query/include/pgstat.h +1487 -0
  219. data/ext/pg_query/include/pgtime.h +84 -0
  220. data/ext/pg_query/include/pl_gram.h +385 -0
  221. data/ext/pg_query/include/pl_reserved_kwlist.h +52 -0
  222. data/ext/pg_query/include/pl_reserved_kwlist_d.h +114 -0
  223. data/ext/pg_query/include/pl_unreserved_kwlist.h +112 -0
  224. data/ext/pg_query/include/pl_unreserved_kwlist_d.h +246 -0
  225. data/ext/pg_query/include/plerrcodes.h +990 -0
  226. data/ext/pg_query/include/plpgsql.h +1347 -0
  227. data/ext/pg_query/include/port.h +524 -0
  228. data/ext/pg_query/include/port/atomics.h +524 -0
  229. data/ext/pg_query/include/port/atomics/arch-arm.h +26 -0
  230. data/ext/pg_query/include/port/atomics/arch-ppc.h +254 -0
  231. data/ext/pg_query/include/port/atomics/arch-x86.h +252 -0
  232. data/ext/pg_query/include/port/atomics/fallback.h +170 -0
  233. data/ext/pg_query/include/port/atomics/generic-gcc.h +286 -0
  234. data/ext/pg_query/include/port/atomics/generic.h +401 -0
  235. data/ext/pg_query/include/port/pg_bitutils.h +226 -0
  236. data/ext/pg_query/include/port/pg_bswap.h +161 -0
  237. data/ext/pg_query/include/port/pg_crc32c.h +101 -0
  238. data/ext/pg_query/include/portability/instr_time.h +256 -0
  239. data/ext/pg_query/include/postgres.h +764 -0
  240. data/ext/pg_query/include/postgres_ext.h +74 -0
  241. data/ext/pg_query/include/postmaster/autovacuum.h +83 -0
  242. data/ext/pg_query/include/postmaster/bgworker.h +161 -0
  243. data/ext/pg_query/include/postmaster/bgworker_internals.h +64 -0
  244. data/ext/pg_query/include/postmaster/bgwriter.h +45 -0
  245. data/ext/pg_query/include/postmaster/fork_process.h +17 -0
  246. data/ext/pg_query/include/postmaster/interrupt.h +32 -0
  247. data/ext/pg_query/include/postmaster/pgarch.h +39 -0
  248. data/ext/pg_query/include/postmaster/postmaster.h +77 -0
  249. data/ext/pg_query/include/postmaster/syslogger.h +98 -0
  250. data/ext/pg_query/include/postmaster/walwriter.h +21 -0
  251. data/ext/pg_query/include/protobuf-c.h +1106 -0
  252. data/ext/pg_query/include/protobuf-c/protobuf-c.h +1106 -0
  253. data/ext/pg_query/include/protobuf/pg_query.pb-c.h +10846 -0
  254. data/ext/pg_query/include/protobuf/pg_query.pb.h +124718 -0
  255. data/ext/pg_query/include/regex/regex.h +184 -0
  256. data/ext/pg_query/include/replication/logicallauncher.h +31 -0
  257. data/ext/pg_query/include/replication/logicalproto.h +110 -0
  258. data/ext/pg_query/include/replication/logicalworker.h +19 -0
  259. data/ext/pg_query/include/replication/origin.h +73 -0
  260. data/ext/pg_query/include/replication/reorderbuffer.h +467 -0
  261. data/ext/pg_query/include/replication/slot.h +219 -0
  262. data/ext/pg_query/include/replication/syncrep.h +115 -0
  263. data/ext/pg_query/include/replication/walreceiver.h +340 -0
  264. data/ext/pg_query/include/replication/walsender.h +74 -0
  265. data/ext/pg_query/include/rewrite/prs2lock.h +46 -0
  266. data/ext/pg_query/include/rewrite/rewriteHandler.h +40 -0
  267. data/ext/pg_query/include/rewrite/rewriteManip.h +87 -0
  268. data/ext/pg_query/include/rewrite/rewriteSupport.h +26 -0
  269. data/ext/pg_query/include/storage/backendid.h +37 -0
  270. data/ext/pg_query/include/storage/block.h +121 -0
  271. data/ext/pg_query/include/storage/buf.h +46 -0
  272. data/ext/pg_query/include/storage/bufmgr.h +292 -0
  273. data/ext/pg_query/include/storage/bufpage.h +459 -0
  274. data/ext/pg_query/include/storage/condition_variable.h +62 -0
  275. data/ext/pg_query/include/storage/dsm.h +61 -0
  276. data/ext/pg_query/include/storage/dsm_impl.h +75 -0
  277. data/ext/pg_query/include/storage/fd.h +168 -0
  278. data/ext/pg_query/include/storage/ipc.h +81 -0
  279. data/ext/pg_query/include/storage/item.h +19 -0
  280. data/ext/pg_query/include/storage/itemid.h +184 -0
  281. data/ext/pg_query/include/storage/itemptr.h +206 -0
  282. data/ext/pg_query/include/storage/large_object.h +100 -0
  283. data/ext/pg_query/include/storage/latch.h +190 -0
  284. data/ext/pg_query/include/storage/lmgr.h +114 -0
  285. data/ext/pg_query/include/storage/lock.h +612 -0
  286. data/ext/pg_query/include/storage/lockdefs.h +59 -0
  287. data/ext/pg_query/include/storage/lwlock.h +232 -0
  288. data/ext/pg_query/include/storage/lwlocknames.h +51 -0
  289. data/ext/pg_query/include/storage/off.h +57 -0
  290. data/ext/pg_query/include/storage/pg_sema.h +61 -0
  291. data/ext/pg_query/include/storage/pg_shmem.h +90 -0
  292. data/ext/pg_query/include/storage/pmsignal.h +94 -0
  293. data/ext/pg_query/include/storage/predicate.h +87 -0
  294. data/ext/pg_query/include/storage/proc.h +333 -0
  295. data/ext/pg_query/include/storage/proclist_types.h +51 -0
  296. data/ext/pg_query/include/storage/procsignal.h +75 -0
  297. data/ext/pg_query/include/storage/relfilenode.h +99 -0
  298. data/ext/pg_query/include/storage/s_lock.h +1047 -0
  299. data/ext/pg_query/include/storage/sharedfileset.h +45 -0
  300. data/ext/pg_query/include/storage/shm_mq.h +85 -0
  301. data/ext/pg_query/include/storage/shm_toc.h +58 -0
  302. data/ext/pg_query/include/storage/shmem.h +81 -0
  303. data/ext/pg_query/include/storage/sinval.h +153 -0
  304. data/ext/pg_query/include/storage/sinvaladt.h +43 -0
  305. data/ext/pg_query/include/storage/smgr.h +109 -0
  306. data/ext/pg_query/include/storage/spin.h +77 -0
  307. data/ext/pg_query/include/storage/standby.h +91 -0
  308. data/ext/pg_query/include/storage/standbydefs.h +74 -0
  309. data/ext/pg_query/include/storage/sync.h +62 -0
  310. data/ext/pg_query/include/tcop/cmdtag.h +58 -0
  311. data/ext/pg_query/include/tcop/cmdtaglist.h +217 -0
  312. data/ext/pg_query/include/tcop/deparse_utility.h +108 -0
  313. data/ext/pg_query/include/tcop/dest.h +149 -0
  314. data/ext/pg_query/include/tcop/fastpath.h +21 -0
  315. data/ext/pg_query/include/tcop/pquery.h +45 -0
  316. data/ext/pg_query/include/tcop/tcopprot.h +89 -0
  317. data/ext/pg_query/include/tcop/utility.h +108 -0
  318. data/ext/pg_query/include/tsearch/ts_cache.h +98 -0
  319. data/ext/pg_query/include/utils/acl.h +312 -0
  320. data/ext/pg_query/include/utils/aclchk_internal.h +45 -0
  321. data/ext/pg_query/include/utils/array.h +458 -0
  322. data/ext/pg_query/include/utils/builtins.h +127 -0
  323. data/ext/pg_query/include/utils/bytea.h +27 -0
  324. data/ext/pg_query/include/utils/catcache.h +231 -0
  325. data/ext/pg_query/include/utils/date.h +90 -0
  326. data/ext/pg_query/include/utils/datetime.h +343 -0
  327. data/ext/pg_query/include/utils/datum.h +68 -0
  328. data/ext/pg_query/include/utils/dsa.h +123 -0
  329. data/ext/pg_query/include/utils/dynahash.h +19 -0
  330. data/ext/pg_query/include/utils/elog.h +439 -0
  331. data/ext/pg_query/include/utils/errcodes.h +352 -0
  332. data/ext/pg_query/include/utils/expandeddatum.h +159 -0
  333. data/ext/pg_query/include/utils/expandedrecord.h +231 -0
  334. data/ext/pg_query/include/utils/float.h +356 -0
  335. data/ext/pg_query/include/utils/fmgroids.h +2657 -0
  336. data/ext/pg_query/include/utils/fmgrprotos.h +2646 -0
  337. data/ext/pg_query/include/utils/fmgrtab.h +48 -0
  338. data/ext/pg_query/include/utils/guc.h +443 -0
  339. data/ext/pg_query/include/utils/guc_tables.h +272 -0
  340. data/ext/pg_query/include/utils/hsearch.h +149 -0
  341. data/ext/pg_query/include/utils/inval.h +64 -0
  342. data/ext/pg_query/include/utils/lsyscache.h +197 -0
  343. data/ext/pg_query/include/utils/memdebug.h +82 -0
  344. data/ext/pg_query/include/utils/memutils.h +225 -0
  345. data/ext/pg_query/include/utils/numeric.h +76 -0
  346. data/ext/pg_query/include/utils/palloc.h +136 -0
  347. data/ext/pg_query/include/utils/partcache.h +102 -0
  348. data/ext/pg_query/include/utils/pg_locale.h +119 -0
  349. data/ext/pg_query/include/utils/pg_lsn.h +29 -0
  350. data/ext/pg_query/include/utils/pidfile.h +56 -0
  351. data/ext/pg_query/include/utils/plancache.h +235 -0
  352. data/ext/pg_query/include/utils/portal.h +241 -0
  353. data/ext/pg_query/include/utils/probes.h +114 -0
  354. data/ext/pg_query/include/utils/ps_status.h +25 -0
  355. data/ext/pg_query/include/utils/queryenvironment.h +74 -0
  356. data/ext/pg_query/include/utils/regproc.h +28 -0
  357. data/ext/pg_query/include/utils/rel.h +644 -0
  358. data/ext/pg_query/include/utils/relcache.h +151 -0
  359. data/ext/pg_query/include/utils/reltrigger.h +81 -0
  360. data/ext/pg_query/include/utils/resowner.h +86 -0
  361. data/ext/pg_query/include/utils/rls.h +50 -0
  362. data/ext/pg_query/include/utils/ruleutils.h +44 -0
  363. data/ext/pg_query/include/utils/sharedtuplestore.h +61 -0
  364. data/ext/pg_query/include/utils/snapmgr.h +158 -0
  365. data/ext/pg_query/include/utils/snapshot.h +206 -0
  366. data/ext/pg_query/include/utils/sortsupport.h +276 -0
  367. data/ext/pg_query/include/utils/syscache.h +219 -0
  368. data/ext/pg_query/include/utils/timeout.h +88 -0
  369. data/ext/pg_query/include/utils/timestamp.h +116 -0
  370. data/ext/pg_query/include/utils/tuplesort.h +277 -0
  371. data/ext/pg_query/include/utils/tuplestore.h +91 -0
  372. data/ext/pg_query/include/utils/typcache.h +202 -0
  373. data/ext/pg_query/include/utils/tzparser.h +39 -0
  374. data/ext/pg_query/include/utils/varlena.h +39 -0
  375. data/ext/pg_query/include/utils/xml.h +84 -0
  376. data/ext/pg_query/include/xxhash.h +5445 -0
  377. data/ext/pg_query/include/xxhash/xxhash.h +5445 -0
  378. data/ext/pg_query/pg_query.c +104 -0
  379. data/ext/pg_query/pg_query.pb-c.c +37628 -0
  380. data/ext/pg_query/pg_query_deparse.c +9959 -0
  381. data/ext/pg_query/pg_query_fingerprint.c +295 -0
  382. data/ext/pg_query/pg_query_fingerprint.h +8 -0
  383. data/ext/pg_query/pg_query_internal.h +24 -0
  384. data/ext/pg_query/pg_query_json_plpgsql.c +738 -0
  385. data/ext/pg_query/pg_query_json_plpgsql.h +9 -0
  386. data/ext/pg_query/pg_query_normalize.c +439 -0
  387. data/ext/pg_query/pg_query_outfuncs.h +10 -0
  388. data/ext/pg_query/pg_query_outfuncs_json.c +297 -0
  389. data/ext/pg_query/pg_query_outfuncs_protobuf.c +237 -0
  390. data/ext/pg_query/pg_query_parse.c +148 -0
  391. data/ext/pg_query/pg_query_parse_plpgsql.c +460 -0
  392. data/ext/pg_query/pg_query_readfuncs.h +11 -0
  393. data/ext/pg_query/pg_query_readfuncs_protobuf.c +142 -0
  394. data/ext/pg_query/pg_query_ruby.c +108 -12
  395. data/ext/pg_query/pg_query_scan.c +173 -0
  396. data/ext/pg_query/pg_query_split.c +221 -0
  397. data/ext/pg_query/protobuf-c.c +3660 -0
  398. data/ext/pg_query/src_backend_catalog_namespace.c +1051 -0
  399. data/ext/pg_query/src_backend_catalog_pg_proc.c +142 -0
  400. data/ext/pg_query/src_backend_commands_define.c +117 -0
  401. data/ext/pg_query/src_backend_libpq_pqcomm.c +651 -0
  402. data/ext/pg_query/src_backend_nodes_bitmapset.c +513 -0
  403. data/ext/pg_query/src_backend_nodes_copyfuncs.c +6013 -0
  404. data/ext/pg_query/src_backend_nodes_equalfuncs.c +4003 -0
  405. data/ext/pg_query/src_backend_nodes_extensible.c +99 -0
  406. data/ext/pg_query/src_backend_nodes_list.c +922 -0
  407. data/ext/pg_query/src_backend_nodes_makefuncs.c +417 -0
  408. data/ext/pg_query/src_backend_nodes_nodeFuncs.c +1363 -0
  409. data/ext/pg_query/src_backend_nodes_value.c +84 -0
  410. data/ext/pg_query/src_backend_parser_gram.c +47456 -0
  411. data/ext/pg_query/src_backend_parser_parse_expr.c +313 -0
  412. data/ext/pg_query/src_backend_parser_parser.c +497 -0
  413. data/ext/pg_query/src_backend_parser_scan.c +7091 -0
  414. data/ext/pg_query/src_backend_parser_scansup.c +160 -0
  415. data/ext/pg_query/src_backend_postmaster_postmaster.c +2230 -0
  416. data/ext/pg_query/src_backend_storage_ipc_ipc.c +192 -0
  417. data/ext/pg_query/src_backend_storage_lmgr_s_lock.c +370 -0
  418. data/ext/pg_query/src_backend_tcop_postgres.c +776 -0
  419. data/ext/pg_query/src_backend_utils_adt_datum.c +326 -0
  420. data/ext/pg_query/src_backend_utils_adt_expandeddatum.c +98 -0
  421. data/ext/pg_query/src_backend_utils_adt_format_type.c +136 -0
  422. data/ext/pg_query/src_backend_utils_adt_ruleutils.c +1683 -0
  423. data/ext/pg_query/src_backend_utils_error_assert.c +74 -0
  424. data/ext/pg_query/src_backend_utils_error_elog.c +1748 -0
  425. data/ext/pg_query/src_backend_utils_fmgr_fmgr.c +570 -0
  426. data/ext/pg_query/src_backend_utils_hash_dynahash.c +1086 -0
  427. data/ext/pg_query/src_backend_utils_init_globals.c +168 -0
  428. data/ext/pg_query/src_backend_utils_mb_mbutils.c +839 -0
  429. data/ext/pg_query/src_backend_utils_misc_guc.c +1831 -0
  430. data/ext/pg_query/src_backend_utils_mmgr_aset.c +1560 -0
  431. data/ext/pg_query/src_backend_utils_mmgr_mcxt.c +1006 -0
  432. data/ext/pg_query/src_common_encnames.c +158 -0
  433. data/ext/pg_query/src_common_keywords.c +39 -0
  434. data/ext/pg_query/src_common_kwlist_d.h +1081 -0
  435. data/ext/pg_query/src_common_kwlookup.c +91 -0
  436. data/ext/pg_query/src_common_psprintf.c +158 -0
  437. data/ext/pg_query/src_common_string.c +86 -0
  438. data/ext/pg_query/src_common_stringinfo.c +336 -0
  439. data/ext/pg_query/src_common_wchar.c +1651 -0
  440. data/ext/pg_query/src_pl_plpgsql_src_pl_comp.c +1133 -0
  441. data/ext/pg_query/src_pl_plpgsql_src_pl_funcs.c +877 -0
  442. data/ext/pg_query/src_pl_plpgsql_src_pl_gram.c +6533 -0
  443. data/ext/pg_query/src_pl_plpgsql_src_pl_handler.c +107 -0
  444. data/ext/pg_query/src_pl_plpgsql_src_pl_reserved_kwlist_d.h +123 -0
  445. data/ext/pg_query/src_pl_plpgsql_src_pl_scanner.c +671 -0
  446. data/ext/pg_query/src_pl_plpgsql_src_pl_unreserved_kwlist_d.h +255 -0
  447. data/ext/pg_query/src_port_erand48.c +127 -0
  448. data/ext/pg_query/src_port_pg_bitutils.c +246 -0
  449. data/ext/pg_query/src_port_pgsleep.c +69 -0
  450. data/ext/pg_query/src_port_pgstrcasecmp.c +83 -0
  451. data/ext/pg_query/src_port_qsort.c +240 -0
  452. data/ext/pg_query/src_port_random.c +31 -0
  453. data/ext/pg_query/src_port_snprintf.c +1449 -0
  454. data/ext/pg_query/src_port_strerror.c +324 -0
  455. data/ext/pg_query/src_port_strnlen.c +39 -0
  456. data/ext/pg_query/xxhash.c +43 -0
  457. data/lib/pg_query.rb +7 -4
  458. data/lib/pg_query/constants.rb +21 -0
  459. data/lib/pg_query/deparse.rb +15 -1581
  460. data/lib/pg_query/filter_columns.rb +88 -85
  461. data/lib/pg_query/fingerprint.rb +122 -87
  462. data/lib/pg_query/json_field_names.rb +1402 -0
  463. data/lib/pg_query/node.rb +31 -0
  464. data/lib/pg_query/param_refs.rb +42 -37
  465. data/lib/pg_query/parse.rb +220 -203
  466. data/lib/pg_query/parse_error.rb +1 -1
  467. data/lib/pg_query/pg_query_pb.rb +3211 -0
  468. data/lib/pg_query/scan.rb +23 -0
  469. data/lib/pg_query/treewalker.rb +24 -40
  470. data/lib/pg_query/truncate.rb +71 -42
  471. data/lib/pg_query/version.rb +2 -2
  472. metadata +472 -11
  473. data/ext/pg_query/pg_query_ruby.h +0 -10
  474. data/lib/pg_query/deep_dup.rb +0 -16
  475. data/lib/pg_query/deparse/alter_table.rb +0 -42
  476. data/lib/pg_query/deparse/interval.rb +0 -105
  477. data/lib/pg_query/deparse/keywords.rb +0 -159
  478. data/lib/pg_query/deparse/rename.rb +0 -41
  479. data/lib/pg_query/legacy_parsetree.rb +0 -109
  480. data/lib/pg_query/node_types.rb +0 -296
@@ -0,0 +1,1541 @@
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-2020, 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
+ /* ----------------------------------------------------------------
26
+ * node definitions
27
+ * ----------------------------------------------------------------
28
+ */
29
+
30
+ /*
31
+ * Alias -
32
+ * specifies an alias for a range variable; the alias might also
33
+ * specify renaming of columns within the table.
34
+ *
35
+ * Note: colnames is a list of Value nodes (always strings). In Alias structs
36
+ * associated with RTEs, there may be entries corresponding to dropped
37
+ * columns; these are normally empty strings (""). See parsenodes.h for info.
38
+ */
39
+ typedef struct Alias
40
+ {
41
+ NodeTag type;
42
+ char *aliasname; /* aliased rel name (never qualified) */
43
+ List *colnames; /* optional list of column aliases */
44
+ } Alias;
45
+
46
+ /* What to do at commit time for temporary relations */
47
+ typedef enum OnCommitAction
48
+ {
49
+ ONCOMMIT_NOOP, /* No ON COMMIT clause (do nothing) */
50
+ ONCOMMIT_PRESERVE_ROWS, /* ON COMMIT PRESERVE ROWS (do nothing) */
51
+ ONCOMMIT_DELETE_ROWS, /* ON COMMIT DELETE ROWS */
52
+ ONCOMMIT_DROP /* ON COMMIT DROP */
53
+ } OnCommitAction;
54
+
55
+ /*
56
+ * RangeVar - range variable, used in FROM clauses
57
+ *
58
+ * Also used to represent table names in utility statements; there, the alias
59
+ * field is not used, and inh tells whether to apply the operation
60
+ * recursively to child tables. In some contexts it is also useful to carry
61
+ * a TEMP table indication here.
62
+ */
63
+ typedef struct RangeVar
64
+ {
65
+ NodeTag type;
66
+ char *catalogname; /* the catalog (database) name, or NULL */
67
+ char *schemaname; /* the schema name, or NULL */
68
+ char *relname; /* the relation/sequence name */
69
+ bool inh; /* expand rel by inheritance? recursively act
70
+ * on children? */
71
+ char relpersistence; /* see RELPERSISTENCE_* in pg_class.h */
72
+ Alias *alias; /* table alias & optional column aliases */
73
+ int location; /* token location, or -1 if unknown */
74
+ } RangeVar;
75
+
76
+ /*
77
+ * TableFunc - node for a table function, such as XMLTABLE.
78
+ *
79
+ * Entries in the ns_names list are either string Value nodes containing
80
+ * literal namespace names, or NULL pointers to represent DEFAULT.
81
+ */
82
+ typedef struct TableFunc
83
+ {
84
+ NodeTag type;
85
+ List *ns_uris; /* list of namespace URI expressions */
86
+ List *ns_names; /* list of namespace names or NULL */
87
+ Node *docexpr; /* input document expression */
88
+ Node *rowexpr; /* row filter expression */
89
+ List *colnames; /* column names (list of String) */
90
+ List *coltypes; /* OID list of column type OIDs */
91
+ List *coltypmods; /* integer list of column typmods */
92
+ List *colcollations; /* OID list of column collation OIDs */
93
+ List *colexprs; /* list of column filter expressions */
94
+ List *coldefexprs; /* list of column default expressions */
95
+ Bitmapset *notnulls; /* nullability flag for each output column */
96
+ int ordinalitycol; /* counts from 0; -1 if none specified */
97
+ int location; /* token location, or -1 if unknown */
98
+ } TableFunc;
99
+
100
+ /*
101
+ * IntoClause - target information for SELECT INTO, CREATE TABLE AS, and
102
+ * CREATE MATERIALIZED VIEW
103
+ *
104
+ * For CREATE MATERIALIZED VIEW, viewQuery is the parsed-but-not-rewritten
105
+ * SELECT Query for the view; otherwise it's NULL. (Although it's actually
106
+ * Query*, we declare it as Node* to avoid a forward reference.)
107
+ */
108
+ typedef struct IntoClause
109
+ {
110
+ NodeTag type;
111
+
112
+ RangeVar *rel; /* target relation name */
113
+ List *colNames; /* column names to assign, or NIL */
114
+ char *accessMethod; /* table access method */
115
+ List *options; /* options from WITH clause */
116
+ OnCommitAction onCommit; /* what do we do at COMMIT? */
117
+ char *tableSpaceName; /* table space to use, or NULL */
118
+ Node *viewQuery; /* materialized view's SELECT query */
119
+ bool skipData; /* true for WITH NO DATA */
120
+ } IntoClause;
121
+
122
+
123
+ /* ----------------------------------------------------------------
124
+ * node types for executable expressions
125
+ * ----------------------------------------------------------------
126
+ */
127
+
128
+ /*
129
+ * Expr - generic superclass for executable-expression nodes
130
+ *
131
+ * All node types that are used in executable expression trees should derive
132
+ * from Expr (that is, have Expr as their first field). Since Expr only
133
+ * contains NodeTag, this is a formality, but it is an easy form of
134
+ * documentation. See also the ExprState node types in execnodes.h.
135
+ */
136
+ typedef struct Expr
137
+ {
138
+ NodeTag type;
139
+ } Expr;
140
+
141
+ /*
142
+ * Var - expression node representing a variable (ie, a table column)
143
+ *
144
+ * In the parser and planner, varno and varattno identify the semantic
145
+ * referent, which is a base-relation column unless the reference is to a join
146
+ * USING column that isn't semantically equivalent to either join input column
147
+ * (because it is a FULL join or the input column requires a type coercion).
148
+ * In those cases varno and varattno refer to the JOIN RTE. (Early in the
149
+ * planner, we replace such join references by the implied expression; but up
150
+ * till then we want join reference Vars to keep their original identity for
151
+ * query-printing purposes.)
152
+ *
153
+ * At the end of planning, Var nodes appearing in upper-level plan nodes are
154
+ * reassigned to point to the outputs of their subplans; for example, in a
155
+ * join node varno becomes INNER_VAR or OUTER_VAR and varattno becomes the
156
+ * index of the proper element of that subplan's target list. Similarly,
157
+ * INDEX_VAR is used to identify Vars that reference an index column rather
158
+ * than a heap column. (In ForeignScan and CustomScan plan nodes, INDEX_VAR
159
+ * is abused to signify references to columns of a custom scan tuple type.)
160
+ *
161
+ * In the parser, varnosyn and varattnosyn are either identical to
162
+ * varno/varattno, or they specify the column's position in an aliased JOIN
163
+ * RTE that hides the semantic referent RTE's refname. This is a syntactic
164
+ * identifier as opposed to the semantic identifier; it tells ruleutils.c
165
+ * how to print the Var properly. varnosyn/varattnosyn retain their values
166
+ * throughout planning and execution, so they are particularly helpful to
167
+ * identify Vars when debugging. Note, however, that a Var that is generated
168
+ * in the planner and doesn't correspond to any simple relation column may
169
+ * have varnosyn = varattnosyn = 0.
170
+ */
171
+ #define INNER_VAR 65000 /* reference to inner subplan */
172
+ #define OUTER_VAR 65001 /* reference to outer subplan */
173
+ #define INDEX_VAR 65002 /* reference to index column */
174
+
175
+ #define IS_SPECIAL_VARNO(varno) ((varno) >= INNER_VAR)
176
+
177
+ /* Symbols for the indexes of the special RTE entries in rules */
178
+ #define PRS2_OLD_VARNO 1
179
+ #define PRS2_NEW_VARNO 2
180
+
181
+ typedef struct Var
182
+ {
183
+ Expr xpr;
184
+ Index varno; /* index of this var's relation in the range
185
+ * table, or INNER_VAR/OUTER_VAR/INDEX_VAR */
186
+ AttrNumber varattno; /* attribute number of this var, or zero for
187
+ * all attrs ("whole-row Var") */
188
+ Oid vartype; /* pg_type OID for the type of this var */
189
+ int32 vartypmod; /* pg_attribute typmod value */
190
+ Oid varcollid; /* OID of collation, or InvalidOid if none */
191
+ Index varlevelsup; /* for subquery variables referencing outer
192
+ * relations; 0 in a normal var, >0 means N
193
+ * levels up */
194
+ Index varnosyn; /* syntactic relation index (0 if unknown) */
195
+ AttrNumber varattnosyn; /* syntactic attribute number */
196
+ int location; /* token location, or -1 if unknown */
197
+ } Var;
198
+
199
+ /*
200
+ * Const
201
+ *
202
+ * Note: for varlena data types, we make a rule that a Const node's value
203
+ * must be in non-extended form (4-byte header, no compression or external
204
+ * references). This ensures that the Const node is self-contained and makes
205
+ * it more likely that equal() will see logically identical values as equal.
206
+ */
207
+ typedef struct Const
208
+ {
209
+ Expr xpr;
210
+ Oid consttype; /* pg_type OID of the constant's datatype */
211
+ int32 consttypmod; /* typmod value, if any */
212
+ Oid constcollid; /* OID of collation, or InvalidOid if none */
213
+ int constlen; /* typlen of the constant's datatype */
214
+ Datum constvalue; /* the constant's value */
215
+ bool constisnull; /* whether the constant is null (if true,
216
+ * constvalue is undefined) */
217
+ bool constbyval; /* whether this datatype is passed by value.
218
+ * If true, then all the information is stored
219
+ * in the Datum. If false, then the Datum
220
+ * contains a pointer to the information. */
221
+ int location; /* token location, or -1 if unknown */
222
+ } Const;
223
+
224
+ /*
225
+ * Param
226
+ *
227
+ * paramkind specifies the kind of parameter. The possible values
228
+ * for this field are:
229
+ *
230
+ * PARAM_EXTERN: The parameter value is supplied from outside the plan.
231
+ * Such parameters are numbered from 1 to n.
232
+ *
233
+ * PARAM_EXEC: The parameter is an internal executor parameter, used
234
+ * for passing values into and out of sub-queries or from
235
+ * nestloop joins to their inner scans.
236
+ * For historical reasons, such parameters are numbered from 0.
237
+ * These numbers are independent of PARAM_EXTERN numbers.
238
+ *
239
+ * PARAM_SUBLINK: The parameter represents an output column of a SubLink
240
+ * node's sub-select. The column number is contained in the
241
+ * `paramid' field. (This type of Param is converted to
242
+ * PARAM_EXEC during planning.)
243
+ *
244
+ * PARAM_MULTIEXPR: Like PARAM_SUBLINK, the parameter represents an
245
+ * output column of a SubLink node's sub-select, but here, the
246
+ * SubLink is always a MULTIEXPR SubLink. The high-order 16 bits
247
+ * of the `paramid' field contain the SubLink's subLinkId, and
248
+ * the low-order 16 bits contain the column number. (This type
249
+ * of Param is also converted to PARAM_EXEC during planning.)
250
+ */
251
+ typedef enum ParamKind
252
+ {
253
+ PARAM_EXTERN,
254
+ PARAM_EXEC,
255
+ PARAM_SUBLINK,
256
+ PARAM_MULTIEXPR
257
+ } ParamKind;
258
+
259
+ typedef struct Param
260
+ {
261
+ Expr xpr;
262
+ ParamKind paramkind; /* kind of parameter. See above */
263
+ int paramid; /* numeric ID for parameter */
264
+ Oid paramtype; /* pg_type OID of parameter's datatype */
265
+ int32 paramtypmod; /* typmod value, if known */
266
+ Oid paramcollid; /* OID of collation, or InvalidOid if none */
267
+ int location; /* token location, or -1 if unknown */
268
+ } Param;
269
+
270
+ /*
271
+ * Aggref
272
+ *
273
+ * The aggregate's args list is a targetlist, ie, a list of TargetEntry nodes.
274
+ *
275
+ * For a normal (non-ordered-set) aggregate, the non-resjunk TargetEntries
276
+ * represent the aggregate's regular arguments (if any) and resjunk TLEs can
277
+ * be added at the end to represent ORDER BY expressions that are not also
278
+ * arguments. As in a top-level Query, the TLEs can be marked with
279
+ * ressortgroupref indexes to let them be referenced by SortGroupClause
280
+ * entries in the aggorder and/or aggdistinct lists. This represents ORDER BY
281
+ * and DISTINCT operations to be applied to the aggregate input rows before
282
+ * they are passed to the transition function. The grammar only allows a
283
+ * simple "DISTINCT" specifier for the arguments, but we use the full
284
+ * query-level representation to allow more code sharing.
285
+ *
286
+ * For an ordered-set aggregate, the args list represents the WITHIN GROUP
287
+ * (aggregated) arguments, all of which will be listed in the aggorder list.
288
+ * DISTINCT is not supported in this case, so aggdistinct will be NIL.
289
+ * The direct arguments appear in aggdirectargs (as a list of plain
290
+ * expressions, not TargetEntry nodes).
291
+ *
292
+ * aggtranstype is the data type of the state transition values for this
293
+ * aggregate (resolved to an actual type, if agg's transtype is polymorphic).
294
+ * This is determined during planning and is InvalidOid before that.
295
+ *
296
+ * aggargtypes is an OID list of the data types of the direct and regular
297
+ * arguments. Normally it's redundant with the aggdirectargs and args lists,
298
+ * but in a combining aggregate, it's not because the args list has been
299
+ * replaced with a single argument representing the partial-aggregate
300
+ * transition values.
301
+ *
302
+ * aggsplit indicates the expected partial-aggregation mode for the Aggref's
303
+ * parent plan node. It's always set to AGGSPLIT_SIMPLE in the parser, but
304
+ * the planner might change it to something else. We use this mainly as
305
+ * a crosscheck that the Aggrefs match the plan; but note that when aggsplit
306
+ * indicates a non-final mode, aggtype reflects the transition data type
307
+ * not the SQL-level output type of the aggregate.
308
+ */
309
+ typedef struct Aggref
310
+ {
311
+ Expr xpr;
312
+ Oid aggfnoid; /* pg_proc Oid of the aggregate */
313
+ Oid aggtype; /* type Oid of result of the aggregate */
314
+ Oid aggcollid; /* OID of collation of result */
315
+ Oid inputcollid; /* OID of collation that function should use */
316
+ Oid aggtranstype; /* type Oid of aggregate's transition value */
317
+ List *aggargtypes; /* type Oids of direct and aggregated args */
318
+ List *aggdirectargs; /* direct arguments, if an ordered-set agg */
319
+ List *args; /* aggregated arguments and sort expressions */
320
+ List *aggorder; /* ORDER BY (list of SortGroupClause) */
321
+ List *aggdistinct; /* DISTINCT (list of SortGroupClause) */
322
+ Expr *aggfilter; /* FILTER expression, if any */
323
+ bool aggstar; /* true if argument list was really '*' */
324
+ bool aggvariadic; /* true if variadic arguments have been
325
+ * combined into an array last argument */
326
+ char aggkind; /* aggregate kind (see pg_aggregate.h) */
327
+ Index agglevelsup; /* > 0 if agg belongs to outer query */
328
+ AggSplit aggsplit; /* expected agg-splitting mode of parent Agg */
329
+ int location; /* token location, or -1 if unknown */
330
+ } Aggref;
331
+
332
+ /*
333
+ * GroupingFunc
334
+ *
335
+ * A GroupingFunc is a GROUPING(...) expression, which behaves in many ways
336
+ * like an aggregate function (e.g. it "belongs" to a specific query level,
337
+ * which might not be the one immediately containing it), but also differs in
338
+ * an important respect: it never evaluates its arguments, they merely
339
+ * designate expressions from the GROUP BY clause of the query level to which
340
+ * it belongs.
341
+ *
342
+ * The spec defines the evaluation of GROUPING() purely by syntactic
343
+ * replacement, but we make it a real expression for optimization purposes so
344
+ * that one Agg node can handle multiple grouping sets at once. Evaluating the
345
+ * result only needs the column positions to check against the grouping set
346
+ * being projected. However, for EXPLAIN to produce meaningful output, we have
347
+ * to keep the original expressions around, since expression deparse does not
348
+ * give us any feasible way to get at the GROUP BY clause.
349
+ *
350
+ * Also, we treat two GroupingFunc nodes as equal if they have equal arguments
351
+ * lists and agglevelsup, without comparing the refs and cols annotations.
352
+ *
353
+ * In raw parse output we have only the args list; parse analysis fills in the
354
+ * refs list, and the planner fills in the cols list.
355
+ */
356
+ typedef struct GroupingFunc
357
+ {
358
+ Expr xpr;
359
+ List *args; /* arguments, not evaluated but kept for
360
+ * benefit of EXPLAIN etc. */
361
+ List *refs; /* ressortgrouprefs of arguments */
362
+ List *cols; /* actual column positions set by planner */
363
+ Index agglevelsup; /* same as Aggref.agglevelsup */
364
+ int location; /* token location */
365
+ } GroupingFunc;
366
+
367
+ /*
368
+ * WindowFunc
369
+ */
370
+ typedef struct WindowFunc
371
+ {
372
+ Expr xpr;
373
+ Oid winfnoid; /* pg_proc Oid of the function */
374
+ Oid wintype; /* type Oid of result of the window function */
375
+ Oid wincollid; /* OID of collation of result */
376
+ Oid inputcollid; /* OID of collation that function should use */
377
+ List *args; /* arguments to the window function */
378
+ Expr *aggfilter; /* FILTER expression, if any */
379
+ Index winref; /* index of associated WindowClause */
380
+ bool winstar; /* true if argument list was really '*' */
381
+ bool winagg; /* is function a simple aggregate? */
382
+ int location; /* token location, or -1 if unknown */
383
+ } WindowFunc;
384
+
385
+ /* ----------------
386
+ * SubscriptingRef: describes a subscripting operation over a container
387
+ * (array, etc).
388
+ *
389
+ * A SubscriptingRef can describe fetching a single element from a container,
390
+ * fetching a part of container (e.g. array slice), storing a single element into
391
+ * a container, or storing a slice. The "store" cases work with an
392
+ * initial container value and a source value that is inserted into the
393
+ * appropriate part of the container; the result of the operation is an
394
+ * entire new modified container value.
395
+ *
396
+ * If reflowerindexpr = NIL, then we are fetching or storing a single container
397
+ * element at the subscripts given by refupperindexpr. Otherwise we are
398
+ * fetching or storing a container slice, that is a rectangular subcontainer
399
+ * with lower and upper bounds given by the index expressions.
400
+ * reflowerindexpr must be the same length as refupperindexpr when it
401
+ * is not NIL.
402
+ *
403
+ * In the slice case, individual expressions in the subscript lists can be
404
+ * NULL, meaning "substitute the array's current lower or upper bound".
405
+ *
406
+ * Note: the result datatype is the element type when fetching a single
407
+ * element; but it is the array type when doing subarray fetch or either
408
+ * type of store.
409
+ *
410
+ * Note: for the cases where a container is returned, if refexpr yields a R/W
411
+ * expanded container, then the implementation is allowed to modify that object
412
+ * in-place and return the same object.)
413
+ * ----------------
414
+ */
415
+ typedef struct SubscriptingRef
416
+ {
417
+ Expr xpr;
418
+ Oid refcontainertype; /* type of the container proper */
419
+ Oid refelemtype; /* type of the container elements */
420
+ int32 reftypmod; /* typmod of the container (and elements too) */
421
+ Oid refcollid; /* OID of collation, or InvalidOid if none */
422
+ List *refupperindexpr; /* expressions that evaluate to upper
423
+ * container indexes */
424
+ List *reflowerindexpr; /* expressions that evaluate to lower
425
+ * container indexes, or NIL for single
426
+ * container element */
427
+ Expr *refexpr; /* the expression that evaluates to a
428
+ * container value */
429
+
430
+ Expr *refassgnexpr; /* expression for the source value, or NULL if
431
+ * fetch */
432
+ } SubscriptingRef;
433
+
434
+ /*
435
+ * CoercionContext - distinguishes the allowed set of type casts
436
+ *
437
+ * NB: ordering of the alternatives is significant; later (larger) values
438
+ * allow more casts than earlier ones.
439
+ */
440
+ typedef enum CoercionContext
441
+ {
442
+ COERCION_IMPLICIT, /* coercion in context of expression */
443
+ COERCION_ASSIGNMENT, /* coercion in context of assignment */
444
+ COERCION_EXPLICIT /* explicit cast operation */
445
+ } CoercionContext;
446
+
447
+ /*
448
+ * CoercionForm - how to display a node that could have come from a cast
449
+ *
450
+ * NB: equal() ignores CoercionForm fields, therefore this *must* not carry
451
+ * any semantically significant information. We need that behavior so that
452
+ * the planner will consider equivalent implicit and explicit casts to be
453
+ * equivalent. In cases where those actually behave differently, the coercion
454
+ * function's arguments will be different.
455
+ */
456
+ typedef enum CoercionForm
457
+ {
458
+ COERCE_EXPLICIT_CALL, /* display as a function call */
459
+ COERCE_EXPLICIT_CAST, /* display as an explicit cast */
460
+ COERCE_IMPLICIT_CAST /* implicit cast, so hide it */
461
+ } CoercionForm;
462
+
463
+ /*
464
+ * FuncExpr - expression node for a function call
465
+ */
466
+ typedef struct FuncExpr
467
+ {
468
+ Expr xpr;
469
+ Oid funcid; /* PG_PROC OID of the function */
470
+ Oid funcresulttype; /* PG_TYPE OID of result value */
471
+ bool funcretset; /* true if function returns set */
472
+ bool funcvariadic; /* true if variadic arguments have been
473
+ * combined into an array last argument */
474
+ CoercionForm funcformat; /* how to display this function call */
475
+ Oid funccollid; /* OID of collation of result */
476
+ Oid inputcollid; /* OID of collation that function should use */
477
+ List *args; /* arguments to the function */
478
+ int location; /* token location, or -1 if unknown */
479
+ } FuncExpr;
480
+
481
+ /*
482
+ * NamedArgExpr - a named argument of a function
483
+ *
484
+ * This node type can only appear in the args list of a FuncCall or FuncExpr
485
+ * node. We support pure positional call notation (no named arguments),
486
+ * named notation (all arguments are named), and mixed notation (unnamed
487
+ * arguments followed by named ones).
488
+ *
489
+ * Parse analysis sets argnumber to the positional index of the argument,
490
+ * but doesn't rearrange the argument list.
491
+ *
492
+ * The planner will convert argument lists to pure positional notation
493
+ * during expression preprocessing, so execution never sees a NamedArgExpr.
494
+ */
495
+ typedef struct NamedArgExpr
496
+ {
497
+ Expr xpr;
498
+ Expr *arg; /* the argument expression */
499
+ char *name; /* the name */
500
+ int argnumber; /* argument's number in positional notation */
501
+ int location; /* argument name location, or -1 if unknown */
502
+ } NamedArgExpr;
503
+
504
+ /*
505
+ * OpExpr - expression node for an operator invocation
506
+ *
507
+ * Semantically, this is essentially the same as a function call.
508
+ *
509
+ * Note that opfuncid is not necessarily filled in immediately on creation
510
+ * of the node. The planner makes sure it is valid before passing the node
511
+ * tree to the executor, but during parsing/planning opfuncid can be 0.
512
+ */
513
+ typedef struct OpExpr
514
+ {
515
+ Expr xpr;
516
+ Oid opno; /* PG_OPERATOR OID of the operator */
517
+ Oid opfuncid; /* PG_PROC OID of underlying function */
518
+ Oid opresulttype; /* PG_TYPE OID of result value */
519
+ bool opretset; /* true if operator returns set */
520
+ Oid opcollid; /* OID of collation of result */
521
+ Oid inputcollid; /* OID of collation that operator should use */
522
+ List *args; /* arguments to the operator (1 or 2) */
523
+ int location; /* token location, or -1 if unknown */
524
+ } OpExpr;
525
+
526
+ /*
527
+ * DistinctExpr - expression node for "x IS DISTINCT FROM y"
528
+ *
529
+ * Except for the nodetag, this is represented identically to an OpExpr
530
+ * referencing the "=" operator for x and y.
531
+ * We use "=", not the more obvious "<>", because more datatypes have "="
532
+ * than "<>". This means the executor must invert the operator result.
533
+ * Note that the operator function won't be called at all if either input
534
+ * is NULL, since then the result can be determined directly.
535
+ */
536
+ typedef OpExpr DistinctExpr;
537
+
538
+ /*
539
+ * NullIfExpr - a NULLIF expression
540
+ *
541
+ * Like DistinctExpr, this is represented the same as an OpExpr referencing
542
+ * the "=" operator for x and y.
543
+ */
544
+ typedef OpExpr NullIfExpr;
545
+
546
+ /*
547
+ * ScalarArrayOpExpr - expression node for "scalar op ANY/ALL (array)"
548
+ *
549
+ * The operator must yield boolean. It is applied to the left operand
550
+ * and each element of the righthand array, and the results are combined
551
+ * with OR or AND (for ANY or ALL respectively). The node representation
552
+ * is almost the same as for the underlying operator, but we need a useOr
553
+ * flag to remember whether it's ANY or ALL, and we don't have to store
554
+ * the result type (or the collation) because it must be boolean.
555
+ */
556
+ typedef struct ScalarArrayOpExpr
557
+ {
558
+ Expr xpr;
559
+ Oid opno; /* PG_OPERATOR OID of the operator */
560
+ Oid opfuncid; /* PG_PROC OID of underlying function */
561
+ bool useOr; /* true for ANY, false for ALL */
562
+ Oid inputcollid; /* OID of collation that operator should use */
563
+ List *args; /* the scalar and array operands */
564
+ int location; /* token location, or -1 if unknown */
565
+ } ScalarArrayOpExpr;
566
+
567
+ /*
568
+ * BoolExpr - expression node for the basic Boolean operators AND, OR, NOT
569
+ *
570
+ * Notice the arguments are given as a List. For NOT, of course the list
571
+ * must always have exactly one element. For AND and OR, there can be two
572
+ * or more arguments.
573
+ */
574
+ typedef enum BoolExprType
575
+ {
576
+ AND_EXPR, OR_EXPR, NOT_EXPR
577
+ } BoolExprType;
578
+
579
+ typedef struct BoolExpr
580
+ {
581
+ Expr xpr;
582
+ BoolExprType boolop;
583
+ List *args; /* arguments to this expression */
584
+ int location; /* token location, or -1 if unknown */
585
+ } BoolExpr;
586
+
587
+ /*
588
+ * SubLink
589
+ *
590
+ * A SubLink represents a subselect appearing in an expression, and in some
591
+ * cases also the combining operator(s) just above it. The subLinkType
592
+ * indicates the form of the expression represented:
593
+ * EXISTS_SUBLINK EXISTS(SELECT ...)
594
+ * ALL_SUBLINK (lefthand) op ALL (SELECT ...)
595
+ * ANY_SUBLINK (lefthand) op ANY (SELECT ...)
596
+ * ROWCOMPARE_SUBLINK (lefthand) op (SELECT ...)
597
+ * EXPR_SUBLINK (SELECT with single targetlist item ...)
598
+ * MULTIEXPR_SUBLINK (SELECT with multiple targetlist items ...)
599
+ * ARRAY_SUBLINK ARRAY(SELECT with single targetlist item ...)
600
+ * CTE_SUBLINK WITH query (never actually part of an expression)
601
+ * For ALL, ANY, and ROWCOMPARE, the lefthand is a list of expressions of the
602
+ * same length as the subselect's targetlist. ROWCOMPARE will *always* have
603
+ * a list with more than one entry; if the subselect has just one target
604
+ * then the parser will create an EXPR_SUBLINK instead (and any operator
605
+ * above the subselect will be represented separately).
606
+ * ROWCOMPARE, EXPR, and MULTIEXPR require the subselect to deliver at most
607
+ * one row (if it returns no rows, the result is NULL).
608
+ * ALL, ANY, and ROWCOMPARE require the combining operators to deliver boolean
609
+ * results. ALL and ANY combine the per-row results using AND and OR
610
+ * semantics respectively.
611
+ * ARRAY requires just one target column, and creates an array of the target
612
+ * column's type using any number of rows resulting from the subselect.
613
+ *
614
+ * SubLink is classed as an Expr node, but it is not actually executable;
615
+ * it must be replaced in the expression tree by a SubPlan node during
616
+ * planning.
617
+ *
618
+ * NOTE: in the raw output of gram.y, testexpr contains just the raw form
619
+ * of the lefthand expression (if any), and operName is the String name of
620
+ * the combining operator. Also, subselect is a raw parsetree. During parse
621
+ * analysis, the parser transforms testexpr into a complete boolean expression
622
+ * that compares the lefthand value(s) to PARAM_SUBLINK nodes representing the
623
+ * output columns of the subselect. And subselect is transformed to a Query.
624
+ * This is the representation seen in saved rules and in the rewriter.
625
+ *
626
+ * In EXISTS, EXPR, MULTIEXPR, and ARRAY SubLinks, testexpr and operName
627
+ * are unused and are always null.
628
+ *
629
+ * subLinkId is currently used only for MULTIEXPR SubLinks, and is zero in
630
+ * other SubLinks. This number identifies different multiple-assignment
631
+ * subqueries within an UPDATE statement's SET list. It is unique only
632
+ * within a particular targetlist. The output column(s) of the MULTIEXPR
633
+ * are referenced by PARAM_MULTIEXPR Params appearing elsewhere in the tlist.
634
+ *
635
+ * The CTE_SUBLINK case never occurs in actual SubLink nodes, but it is used
636
+ * in SubPlans generated for WITH subqueries.
637
+ */
638
+ typedef enum SubLinkType
639
+ {
640
+ EXISTS_SUBLINK,
641
+ ALL_SUBLINK,
642
+ ANY_SUBLINK,
643
+ ROWCOMPARE_SUBLINK,
644
+ EXPR_SUBLINK,
645
+ MULTIEXPR_SUBLINK,
646
+ ARRAY_SUBLINK,
647
+ CTE_SUBLINK /* for SubPlans only */
648
+ } SubLinkType;
649
+
650
+
651
+ typedef struct SubLink
652
+ {
653
+ Expr xpr;
654
+ SubLinkType subLinkType; /* see above */
655
+ int subLinkId; /* ID (1..n); 0 if not MULTIEXPR */
656
+ Node *testexpr; /* outer-query test for ALL/ANY/ROWCOMPARE */
657
+ List *operName; /* originally specified operator name */
658
+ Node *subselect; /* subselect as Query* or raw parsetree */
659
+ int location; /* token location, or -1 if unknown */
660
+ } SubLink;
661
+
662
+ /*
663
+ * SubPlan - executable expression node for a subplan (sub-SELECT)
664
+ *
665
+ * The planner replaces SubLink nodes in expression trees with SubPlan
666
+ * nodes after it has finished planning the subquery. SubPlan references
667
+ * a sub-plantree stored in the subplans list of the toplevel PlannedStmt.
668
+ * (We avoid a direct link to make it easier to copy expression trees
669
+ * without causing multiple processing of the subplan.)
670
+ *
671
+ * In an ordinary subplan, testexpr points to an executable expression
672
+ * (OpExpr, an AND/OR tree of OpExprs, or RowCompareExpr) for the combining
673
+ * operator(s); the left-hand arguments are the original lefthand expressions,
674
+ * and the right-hand arguments are PARAM_EXEC Param nodes representing the
675
+ * outputs of the sub-select. (NOTE: runtime coercion functions may be
676
+ * inserted as well.) This is just the same expression tree as testexpr in
677
+ * the original SubLink node, but the PARAM_SUBLINK nodes are replaced by
678
+ * suitably numbered PARAM_EXEC nodes.
679
+ *
680
+ * If the sub-select becomes an initplan rather than a subplan, the executable
681
+ * expression is part of the outer plan's expression tree (and the SubPlan
682
+ * node itself is not, but rather is found in the outer plan's initPlan
683
+ * list). In this case testexpr is NULL to avoid duplication.
684
+ *
685
+ * The planner also derives lists of the values that need to be passed into
686
+ * and out of the subplan. Input values are represented as a list "args" of
687
+ * expressions to be evaluated in the outer-query context (currently these
688
+ * args are always just Vars, but in principle they could be any expression).
689
+ * The values are assigned to the global PARAM_EXEC params indexed by parParam
690
+ * (the parParam and args lists must have the same ordering). setParam is a
691
+ * list of the PARAM_EXEC params that are computed by the sub-select, if it
692
+ * is an initplan; they are listed in order by sub-select output column
693
+ * position. (parParam and setParam are integer Lists, not Bitmapsets,
694
+ * because their ordering is significant.)
695
+ *
696
+ * Also, the planner computes startup and per-call costs for use of the
697
+ * SubPlan. Note that these include the cost of the subquery proper,
698
+ * evaluation of the testexpr if any, and any hashtable management overhead.
699
+ */
700
+ typedef struct SubPlan
701
+ {
702
+ Expr xpr;
703
+ /* Fields copied from original SubLink: */
704
+ SubLinkType subLinkType; /* see above */
705
+ /* The combining operators, transformed to an executable expression: */
706
+ Node *testexpr; /* OpExpr or RowCompareExpr expression tree */
707
+ List *paramIds; /* IDs of Params embedded in the above */
708
+ /* Identification of the Plan tree to use: */
709
+ int plan_id; /* Index (from 1) in PlannedStmt.subplans */
710
+ /* Identification of the SubPlan for EXPLAIN and debugging purposes: */
711
+ char *plan_name; /* A name assigned during planning */
712
+ /* Extra data useful for determining subplan's output type: */
713
+ Oid firstColType; /* Type of first column of subplan result */
714
+ int32 firstColTypmod; /* Typmod of first column of subplan result */
715
+ Oid firstColCollation; /* Collation of first column of subplan
716
+ * result */
717
+ /* Information about execution strategy: */
718
+ bool useHashTable; /* true to store subselect output in a hash
719
+ * table (implies we are doing "IN") */
720
+ bool unknownEqFalse; /* true if it's okay to return FALSE when the
721
+ * spec result is UNKNOWN; this allows much
722
+ * simpler handling of null values */
723
+ bool parallel_safe; /* is the subplan parallel-safe? */
724
+ /* Note: parallel_safe does not consider contents of testexpr or args */
725
+ /* Information for passing params into and out of the subselect: */
726
+ /* setParam and parParam are lists of integers (param IDs) */
727
+ List *setParam; /* initplan subqueries have to set these
728
+ * Params for parent plan */
729
+ List *parParam; /* indices of input Params from parent plan */
730
+ List *args; /* exprs to pass as parParam values */
731
+ /* Estimated execution costs: */
732
+ Cost startup_cost; /* one-time setup cost */
733
+ Cost per_call_cost; /* cost for each subplan evaluation */
734
+ } SubPlan;
735
+
736
+ /*
737
+ * AlternativeSubPlan - expression node for a choice among SubPlans
738
+ *
739
+ * The subplans are given as a List so that the node definition need not
740
+ * change if there's ever more than two alternatives. For the moment,
741
+ * though, there are always exactly two; and the first one is the fast-start
742
+ * plan.
743
+ */
744
+ typedef struct AlternativeSubPlan
745
+ {
746
+ Expr xpr;
747
+ List *subplans; /* SubPlan(s) with equivalent results */
748
+ } AlternativeSubPlan;
749
+
750
+ /* ----------------
751
+ * FieldSelect
752
+ *
753
+ * FieldSelect represents the operation of extracting one field from a tuple
754
+ * value. At runtime, the input expression is expected to yield a rowtype
755
+ * Datum. The specified field number is extracted and returned as a Datum.
756
+ * ----------------
757
+ */
758
+
759
+ typedef struct FieldSelect
760
+ {
761
+ Expr xpr;
762
+ Expr *arg; /* input expression */
763
+ AttrNumber fieldnum; /* attribute number of field to extract */
764
+ Oid resulttype; /* type of the field (result type of this
765
+ * node) */
766
+ int32 resulttypmod; /* output typmod (usually -1) */
767
+ Oid resultcollid; /* OID of collation of the field */
768
+ } FieldSelect;
769
+
770
+ /* ----------------
771
+ * FieldStore
772
+ *
773
+ * FieldStore represents the operation of modifying one field in a tuple
774
+ * value, yielding a new tuple value (the input is not touched!). Like
775
+ * the assign case of SubscriptingRef, this is used to implement UPDATE of a
776
+ * portion of a column.
777
+ *
778
+ * resulttype is always a named composite type (not a domain). To update
779
+ * a composite domain value, apply CoerceToDomain to the FieldStore.
780
+ *
781
+ * A single FieldStore can actually represent updates of several different
782
+ * fields. The parser only generates FieldStores with single-element lists,
783
+ * but the planner will collapse multiple updates of the same base column
784
+ * into one FieldStore.
785
+ * ----------------
786
+ */
787
+
788
+ typedef struct FieldStore
789
+ {
790
+ Expr xpr;
791
+ Expr *arg; /* input tuple value */
792
+ List *newvals; /* new value(s) for field(s) */
793
+ List *fieldnums; /* integer list of field attnums */
794
+ Oid resulttype; /* type of result (same as type of arg) */
795
+ /* Like RowExpr, we deliberately omit a typmod and collation here */
796
+ } FieldStore;
797
+
798
+ /* ----------------
799
+ * RelabelType
800
+ *
801
+ * RelabelType represents a "dummy" type coercion between two binary-
802
+ * compatible datatypes, such as reinterpreting the result of an OID
803
+ * expression as an int4. It is a no-op at runtime; we only need it
804
+ * to provide a place to store the correct type to be attributed to
805
+ * the expression result during type resolution. (We can't get away
806
+ * with just overwriting the type field of the input expression node,
807
+ * so we need a separate node to show the coercion's result type.)
808
+ * ----------------
809
+ */
810
+
811
+ typedef struct RelabelType
812
+ {
813
+ Expr xpr;
814
+ Expr *arg; /* input expression */
815
+ Oid resulttype; /* output type of coercion expression */
816
+ int32 resulttypmod; /* output typmod (usually -1) */
817
+ Oid resultcollid; /* OID of collation, or InvalidOid if none */
818
+ CoercionForm relabelformat; /* how to display this node */
819
+ int location; /* token location, or -1 if unknown */
820
+ } RelabelType;
821
+
822
+ /* ----------------
823
+ * CoerceViaIO
824
+ *
825
+ * CoerceViaIO represents a type coercion between two types whose textual
826
+ * representations are compatible, implemented by invoking the source type's
827
+ * typoutput function then the destination type's typinput function.
828
+ * ----------------
829
+ */
830
+
831
+ typedef struct CoerceViaIO
832
+ {
833
+ Expr xpr;
834
+ Expr *arg; /* input expression */
835
+ Oid resulttype; /* output type of coercion */
836
+ /* output typmod is not stored, but is presumed -1 */
837
+ Oid resultcollid; /* OID of collation, or InvalidOid if none */
838
+ CoercionForm coerceformat; /* how to display this node */
839
+ int location; /* token location, or -1 if unknown */
840
+ } CoerceViaIO;
841
+
842
+ /* ----------------
843
+ * ArrayCoerceExpr
844
+ *
845
+ * ArrayCoerceExpr represents a type coercion from one array type to another,
846
+ * which is implemented by applying the per-element coercion expression
847
+ * "elemexpr" to each element of the source array. Within elemexpr, the
848
+ * source element is represented by a CaseTestExpr node. Note that even if
849
+ * elemexpr is a no-op (that is, just CaseTestExpr + RelabelType), the
850
+ * coercion still requires some effort: we have to fix the element type OID
851
+ * stored in the array header.
852
+ * ----------------
853
+ */
854
+
855
+ typedef struct ArrayCoerceExpr
856
+ {
857
+ Expr xpr;
858
+ Expr *arg; /* input expression (yields an array) */
859
+ Expr *elemexpr; /* expression representing per-element work */
860
+ Oid resulttype; /* output type of coercion (an array type) */
861
+ int32 resulttypmod; /* output typmod (also element typmod) */
862
+ Oid resultcollid; /* OID of collation, or InvalidOid if none */
863
+ CoercionForm coerceformat; /* how to display this node */
864
+ int location; /* token location, or -1 if unknown */
865
+ } ArrayCoerceExpr;
866
+
867
+ /* ----------------
868
+ * ConvertRowtypeExpr
869
+ *
870
+ * ConvertRowtypeExpr represents a type coercion from one composite type
871
+ * to another, where the source type is guaranteed to contain all the columns
872
+ * needed for the destination type plus possibly others; the columns need not
873
+ * be in the same positions, but are matched up by name. This is primarily
874
+ * used to convert a whole-row value of an inheritance child table into a
875
+ * valid whole-row value of its parent table's rowtype. Both resulttype
876
+ * and the exposed type of "arg" must be named composite types (not domains).
877
+ * ----------------
878
+ */
879
+
880
+ typedef struct ConvertRowtypeExpr
881
+ {
882
+ Expr xpr;
883
+ Expr *arg; /* input expression */
884
+ Oid resulttype; /* output type (always a composite type) */
885
+ /* Like RowExpr, we deliberately omit a typmod and collation here */
886
+ CoercionForm convertformat; /* how to display this node */
887
+ int location; /* token location, or -1 if unknown */
888
+ } ConvertRowtypeExpr;
889
+
890
+ /*----------
891
+ * CollateExpr - COLLATE
892
+ *
893
+ * The planner replaces CollateExpr with RelabelType during expression
894
+ * preprocessing, so execution never sees a CollateExpr.
895
+ *----------
896
+ */
897
+ typedef struct CollateExpr
898
+ {
899
+ Expr xpr;
900
+ Expr *arg; /* input expression */
901
+ Oid collOid; /* collation's OID */
902
+ int location; /* token location, or -1 if unknown */
903
+ } CollateExpr;
904
+
905
+ /*----------
906
+ * CaseExpr - a CASE expression
907
+ *
908
+ * We support two distinct forms of CASE expression:
909
+ * CASE WHEN boolexpr THEN expr [ WHEN boolexpr THEN expr ... ]
910
+ * CASE testexpr WHEN compexpr THEN expr [ WHEN compexpr THEN expr ... ]
911
+ * These are distinguishable by the "arg" field being NULL in the first case
912
+ * and the testexpr in the second case.
913
+ *
914
+ * In the raw grammar output for the second form, the condition expressions
915
+ * of the WHEN clauses are just the comparison values. Parse analysis
916
+ * converts these to valid boolean expressions of the form
917
+ * CaseTestExpr '=' compexpr
918
+ * where the CaseTestExpr node is a placeholder that emits the correct
919
+ * value at runtime. This structure is used so that the testexpr need be
920
+ * evaluated only once. Note that after parse analysis, the condition
921
+ * expressions always yield boolean.
922
+ *
923
+ * Note: we can test whether a CaseExpr has been through parse analysis
924
+ * yet by checking whether casetype is InvalidOid or not.
925
+ *----------
926
+ */
927
+ typedef struct CaseExpr
928
+ {
929
+ Expr xpr;
930
+ Oid casetype; /* type of expression result */
931
+ Oid casecollid; /* OID of collation, or InvalidOid if none */
932
+ Expr *arg; /* implicit equality comparison argument */
933
+ List *args; /* the arguments (list of WHEN clauses) */
934
+ Expr *defresult; /* the default result (ELSE clause) */
935
+ int location; /* token location, or -1 if unknown */
936
+ } CaseExpr;
937
+
938
+ /*
939
+ * CaseWhen - one arm of a CASE expression
940
+ */
941
+ typedef struct CaseWhen
942
+ {
943
+ Expr xpr;
944
+ Expr *expr; /* condition expression */
945
+ Expr *result; /* substitution result */
946
+ int location; /* token location, or -1 if unknown */
947
+ } CaseWhen;
948
+
949
+ /*
950
+ * Placeholder node for the test value to be processed by a CASE expression.
951
+ * This is effectively like a Param, but can be implemented more simply
952
+ * since we need only one replacement value at a time.
953
+ *
954
+ * We also abuse this node type for some other purposes, including:
955
+ * * Placeholder for the current array element value in ArrayCoerceExpr;
956
+ * see build_coercion_expression().
957
+ * * Nested FieldStore/SubscriptingRef assignment expressions in INSERT/UPDATE;
958
+ * see transformAssignmentIndirection().
959
+ *
960
+ * The uses in CaseExpr and ArrayCoerceExpr are safe only to the extent that
961
+ * there is not any other CaseExpr or ArrayCoerceExpr between the value source
962
+ * node and its child CaseTestExpr(s). This is true in the parse analysis
963
+ * output, but the planner's function-inlining logic has to be careful not to
964
+ * break it.
965
+ *
966
+ * The nested-assignment-expression case is safe because the only node types
967
+ * that can be above such CaseTestExprs are FieldStore and SubscriptingRef.
968
+ */
969
+ typedef struct CaseTestExpr
970
+ {
971
+ Expr xpr;
972
+ Oid typeId; /* type for substituted value */
973
+ int32 typeMod; /* typemod for substituted value */
974
+ Oid collation; /* collation for the substituted value */
975
+ } CaseTestExpr;
976
+
977
+ /*
978
+ * ArrayExpr - an ARRAY[] expression
979
+ *
980
+ * Note: if multidims is false, the constituent expressions all yield the
981
+ * scalar type identified by element_typeid. If multidims is true, the
982
+ * constituent expressions all yield arrays of element_typeid (ie, the same
983
+ * type as array_typeid); at runtime we must check for compatible subscripts.
984
+ */
985
+ typedef struct ArrayExpr
986
+ {
987
+ Expr xpr;
988
+ Oid array_typeid; /* type of expression result */
989
+ Oid array_collid; /* OID of collation, or InvalidOid if none */
990
+ Oid element_typeid; /* common type of array elements */
991
+ List *elements; /* the array elements or sub-arrays */
992
+ bool multidims; /* true if elements are sub-arrays */
993
+ int location; /* token location, or -1 if unknown */
994
+ } ArrayExpr;
995
+
996
+ /*
997
+ * RowExpr - a ROW() expression
998
+ *
999
+ * Note: the list of fields must have a one-for-one correspondence with
1000
+ * physical fields of the associated rowtype, although it is okay for it
1001
+ * to be shorter than the rowtype. That is, the N'th list element must
1002
+ * match up with the N'th physical field. When the N'th physical field
1003
+ * is a dropped column (attisdropped) then the N'th list element can just
1004
+ * be a NULL constant. (This case can only occur for named composite types,
1005
+ * not RECORD types, since those are built from the RowExpr itself rather
1006
+ * than vice versa.) It is important not to assume that length(args) is
1007
+ * the same as the number of columns logically present in the rowtype.
1008
+ *
1009
+ * colnames provides field names in cases where the names can't easily be
1010
+ * obtained otherwise. Names *must* be provided if row_typeid is RECORDOID.
1011
+ * If row_typeid identifies a known composite type, colnames can be NIL to
1012
+ * indicate the type's cataloged field names apply. Note that colnames can
1013
+ * be non-NIL even for a composite type, and typically is when the RowExpr
1014
+ * was created by expanding a whole-row Var. This is so that we can retain
1015
+ * the column alias names of the RTE that the Var referenced (which would
1016
+ * otherwise be very difficult to extract from the parsetree). Like the
1017
+ * args list, colnames is one-for-one with physical fields of the rowtype.
1018
+ */
1019
+ typedef struct RowExpr
1020
+ {
1021
+ Expr xpr;
1022
+ List *args; /* the fields */
1023
+ Oid row_typeid; /* RECORDOID or a composite type's ID */
1024
+
1025
+ /*
1026
+ * row_typeid cannot be a domain over composite, only plain composite. To
1027
+ * create a composite domain value, apply CoerceToDomain to the RowExpr.
1028
+ *
1029
+ * Note: we deliberately do NOT store a typmod. Although a typmod will be
1030
+ * associated with specific RECORD types at runtime, it will differ for
1031
+ * different backends, and so cannot safely be stored in stored
1032
+ * parsetrees. We must assume typmod -1 for a RowExpr node.
1033
+ *
1034
+ * We don't need to store a collation either. The result type is
1035
+ * necessarily composite, and composite types never have a collation.
1036
+ */
1037
+ CoercionForm row_format; /* how to display this node */
1038
+ List *colnames; /* list of String, or NIL */
1039
+ int location; /* token location, or -1 if unknown */
1040
+ } RowExpr;
1041
+
1042
+ /*
1043
+ * RowCompareExpr - row-wise comparison, such as (a, b) <= (1, 2)
1044
+ *
1045
+ * We support row comparison for any operator that can be determined to
1046
+ * act like =, <>, <, <=, >, or >= (we determine this by looking for the
1047
+ * operator in btree opfamilies). Note that the same operator name might
1048
+ * map to a different operator for each pair of row elements, since the
1049
+ * element datatypes can vary.
1050
+ *
1051
+ * A RowCompareExpr node is only generated for the < <= > >= cases;
1052
+ * the = and <> cases are translated to simple AND or OR combinations
1053
+ * of the pairwise comparisons. However, we include = and <> in the
1054
+ * RowCompareType enum for the convenience of parser logic.
1055
+ */
1056
+ typedef enum RowCompareType
1057
+ {
1058
+ /* Values of this enum are chosen to match btree strategy numbers */
1059
+ ROWCOMPARE_LT = 1, /* BTLessStrategyNumber */
1060
+ ROWCOMPARE_LE = 2, /* BTLessEqualStrategyNumber */
1061
+ ROWCOMPARE_EQ = 3, /* BTEqualStrategyNumber */
1062
+ ROWCOMPARE_GE = 4, /* BTGreaterEqualStrategyNumber */
1063
+ ROWCOMPARE_GT = 5, /* BTGreaterStrategyNumber */
1064
+ ROWCOMPARE_NE = 6 /* no such btree strategy */
1065
+ } RowCompareType;
1066
+
1067
+ typedef struct RowCompareExpr
1068
+ {
1069
+ Expr xpr;
1070
+ RowCompareType rctype; /* LT LE GE or GT, never EQ or NE */
1071
+ List *opnos; /* OID list of pairwise comparison ops */
1072
+ List *opfamilies; /* OID list of containing operator families */
1073
+ List *inputcollids; /* OID list of collations for comparisons */
1074
+ List *largs; /* the left-hand input arguments */
1075
+ List *rargs; /* the right-hand input arguments */
1076
+ } RowCompareExpr;
1077
+
1078
+ /*
1079
+ * CoalesceExpr - a COALESCE expression
1080
+ */
1081
+ typedef struct CoalesceExpr
1082
+ {
1083
+ Expr xpr;
1084
+ Oid coalescetype; /* type of expression result */
1085
+ Oid coalescecollid; /* OID of collation, or InvalidOid if none */
1086
+ List *args; /* the arguments */
1087
+ int location; /* token location, or -1 if unknown */
1088
+ } CoalesceExpr;
1089
+
1090
+ /*
1091
+ * MinMaxExpr - a GREATEST or LEAST function
1092
+ */
1093
+ typedef enum MinMaxOp
1094
+ {
1095
+ IS_GREATEST,
1096
+ IS_LEAST
1097
+ } MinMaxOp;
1098
+
1099
+ typedef struct MinMaxExpr
1100
+ {
1101
+ Expr xpr;
1102
+ Oid minmaxtype; /* common type of arguments and result */
1103
+ Oid minmaxcollid; /* OID of collation of result */
1104
+ Oid inputcollid; /* OID of collation that function should use */
1105
+ MinMaxOp op; /* function to execute */
1106
+ List *args; /* the arguments */
1107
+ int location; /* token location, or -1 if unknown */
1108
+ } MinMaxExpr;
1109
+
1110
+ /*
1111
+ * SQLValueFunction - parameterless functions with special grammar productions
1112
+ *
1113
+ * The SQL standard categorizes some of these as <datetime value function>
1114
+ * and others as <general value specification>. We call 'em SQLValueFunctions
1115
+ * for lack of a better term. We store type and typmod of the result so that
1116
+ * some code doesn't need to know each function individually, and because
1117
+ * we would need to store typmod anyway for some of the datetime functions.
1118
+ * Note that currently, all variants return non-collating datatypes, so we do
1119
+ * not need a collation field; also, all these functions are stable.
1120
+ */
1121
+ typedef enum SQLValueFunctionOp
1122
+ {
1123
+ SVFOP_CURRENT_DATE,
1124
+ SVFOP_CURRENT_TIME,
1125
+ SVFOP_CURRENT_TIME_N,
1126
+ SVFOP_CURRENT_TIMESTAMP,
1127
+ SVFOP_CURRENT_TIMESTAMP_N,
1128
+ SVFOP_LOCALTIME,
1129
+ SVFOP_LOCALTIME_N,
1130
+ SVFOP_LOCALTIMESTAMP,
1131
+ SVFOP_LOCALTIMESTAMP_N,
1132
+ SVFOP_CURRENT_ROLE,
1133
+ SVFOP_CURRENT_USER,
1134
+ SVFOP_USER,
1135
+ SVFOP_SESSION_USER,
1136
+ SVFOP_CURRENT_CATALOG,
1137
+ SVFOP_CURRENT_SCHEMA
1138
+ } SQLValueFunctionOp;
1139
+
1140
+ typedef struct SQLValueFunction
1141
+ {
1142
+ Expr xpr;
1143
+ SQLValueFunctionOp op; /* which function this is */
1144
+ Oid type; /* result type/typmod */
1145
+ int32 typmod;
1146
+ int location; /* token location, or -1 if unknown */
1147
+ } SQLValueFunction;
1148
+
1149
+ /*
1150
+ * XmlExpr - various SQL/XML functions requiring special grammar productions
1151
+ *
1152
+ * 'name' carries the "NAME foo" argument (already XML-escaped).
1153
+ * 'named_args' and 'arg_names' represent an xml_attribute list.
1154
+ * 'args' carries all other arguments.
1155
+ *
1156
+ * Note: result type/typmod/collation are not stored, but can be deduced
1157
+ * from the XmlExprOp. The type/typmod fields are just used for display
1158
+ * purposes, and are NOT necessarily the true result type of the node.
1159
+ */
1160
+ typedef enum XmlExprOp
1161
+ {
1162
+ IS_XMLCONCAT, /* XMLCONCAT(args) */
1163
+ IS_XMLELEMENT, /* XMLELEMENT(name, xml_attributes, args) */
1164
+ IS_XMLFOREST, /* XMLFOREST(xml_attributes) */
1165
+ IS_XMLPARSE, /* XMLPARSE(text, is_doc, preserve_ws) */
1166
+ IS_XMLPI, /* XMLPI(name [, args]) */
1167
+ IS_XMLROOT, /* XMLROOT(xml, version, standalone) */
1168
+ IS_XMLSERIALIZE, /* XMLSERIALIZE(is_document, xmlval) */
1169
+ IS_DOCUMENT /* xmlval IS DOCUMENT */
1170
+ } XmlExprOp;
1171
+
1172
+ typedef enum
1173
+ {
1174
+ XMLOPTION_DOCUMENT,
1175
+ XMLOPTION_CONTENT
1176
+ } XmlOptionType;
1177
+
1178
+ typedef struct XmlExpr
1179
+ {
1180
+ Expr xpr;
1181
+ XmlExprOp op; /* xml function ID */
1182
+ char *name; /* name in xml(NAME foo ...) syntaxes */
1183
+ List *named_args; /* non-XML expressions for xml_attributes */
1184
+ List *arg_names; /* parallel list of Value strings */
1185
+ List *args; /* list of expressions */
1186
+ XmlOptionType xmloption; /* DOCUMENT or CONTENT */
1187
+ Oid type; /* target type/typmod for XMLSERIALIZE */
1188
+ int32 typmod;
1189
+ int location; /* token location, or -1 if unknown */
1190
+ } XmlExpr;
1191
+
1192
+ /* ----------------
1193
+ * NullTest
1194
+ *
1195
+ * NullTest represents the operation of testing a value for NULLness.
1196
+ * The appropriate test is performed and returned as a boolean Datum.
1197
+ *
1198
+ * When argisrow is false, this simply represents a test for the null value.
1199
+ *
1200
+ * When argisrow is true, the input expression must yield a rowtype, and
1201
+ * the node implements "row IS [NOT] NULL" per the SQL standard. This
1202
+ * includes checking individual fields for NULLness when the row datum
1203
+ * itself isn't NULL.
1204
+ *
1205
+ * NOTE: the combination of a rowtype input and argisrow==false does NOT
1206
+ * correspond to the SQL notation "row IS [NOT] NULL"; instead, this case
1207
+ * represents the SQL notation "row IS [NOT] DISTINCT FROM NULL".
1208
+ * ----------------
1209
+ */
1210
+
1211
+ typedef enum NullTestType
1212
+ {
1213
+ IS_NULL, IS_NOT_NULL
1214
+ } NullTestType;
1215
+
1216
+ typedef struct NullTest
1217
+ {
1218
+ Expr xpr;
1219
+ Expr *arg; /* input expression */
1220
+ NullTestType nulltesttype; /* IS NULL, IS NOT NULL */
1221
+ bool argisrow; /* T to perform field-by-field null checks */
1222
+ int location; /* token location, or -1 if unknown */
1223
+ } NullTest;
1224
+
1225
+ /*
1226
+ * BooleanTest
1227
+ *
1228
+ * BooleanTest represents the operation of determining whether a boolean
1229
+ * is TRUE, FALSE, or UNKNOWN (ie, NULL). All six meaningful combinations
1230
+ * are supported. Note that a NULL input does *not* cause a NULL result.
1231
+ * The appropriate test is performed and returned as a boolean Datum.
1232
+ */
1233
+
1234
+ typedef enum BoolTestType
1235
+ {
1236
+ IS_TRUE, IS_NOT_TRUE, IS_FALSE, IS_NOT_FALSE, IS_UNKNOWN, IS_NOT_UNKNOWN
1237
+ } BoolTestType;
1238
+
1239
+ typedef struct BooleanTest
1240
+ {
1241
+ Expr xpr;
1242
+ Expr *arg; /* input expression */
1243
+ BoolTestType booltesttype; /* test type */
1244
+ int location; /* token location, or -1 if unknown */
1245
+ } BooleanTest;
1246
+
1247
+ /*
1248
+ * CoerceToDomain
1249
+ *
1250
+ * CoerceToDomain represents the operation of coercing a value to a domain
1251
+ * type. At runtime (and not before) the precise set of constraints to be
1252
+ * checked will be determined. If the value passes, it is returned as the
1253
+ * result; if not, an error is raised. Note that this is equivalent to
1254
+ * RelabelType in the scenario where no constraints are applied.
1255
+ */
1256
+ typedef struct CoerceToDomain
1257
+ {
1258
+ Expr xpr;
1259
+ Expr *arg; /* input expression */
1260
+ Oid resulttype; /* domain type ID (result type) */
1261
+ int32 resulttypmod; /* output typmod (currently always -1) */
1262
+ Oid resultcollid; /* OID of collation, or InvalidOid if none */
1263
+ CoercionForm coercionformat; /* how to display this node */
1264
+ int location; /* token location, or -1 if unknown */
1265
+ } CoerceToDomain;
1266
+
1267
+ /*
1268
+ * Placeholder node for the value to be processed by a domain's check
1269
+ * constraint. This is effectively like a Param, but can be implemented more
1270
+ * simply since we need only one replacement value at a time.
1271
+ *
1272
+ * Note: the typeId/typeMod/collation will be set from the domain's base type,
1273
+ * not the domain itself. This is because we shouldn't consider the value
1274
+ * to be a member of the domain if we haven't yet checked its constraints.
1275
+ */
1276
+ typedef struct CoerceToDomainValue
1277
+ {
1278
+ Expr xpr;
1279
+ Oid typeId; /* type for substituted value */
1280
+ int32 typeMod; /* typemod for substituted value */
1281
+ Oid collation; /* collation for the substituted value */
1282
+ int location; /* token location, or -1 if unknown */
1283
+ } CoerceToDomainValue;
1284
+
1285
+ /*
1286
+ * Placeholder node for a DEFAULT marker in an INSERT or UPDATE command.
1287
+ *
1288
+ * This is not an executable expression: it must be replaced by the actual
1289
+ * column default expression during rewriting. But it is convenient to
1290
+ * treat it as an expression node during parsing and rewriting.
1291
+ */
1292
+ typedef struct SetToDefault
1293
+ {
1294
+ Expr xpr;
1295
+ Oid typeId; /* type for substituted value */
1296
+ int32 typeMod; /* typemod for substituted value */
1297
+ Oid collation; /* collation for the substituted value */
1298
+ int location; /* token location, or -1 if unknown */
1299
+ } SetToDefault;
1300
+
1301
+ /*
1302
+ * Node representing [WHERE] CURRENT OF cursor_name
1303
+ *
1304
+ * CURRENT OF is a bit like a Var, in that it carries the rangetable index
1305
+ * of the target relation being constrained; this aids placing the expression
1306
+ * correctly during planning. We can assume however that its "levelsup" is
1307
+ * always zero, due to the syntactic constraints on where it can appear.
1308
+ *
1309
+ * The referenced cursor can be represented either as a hardwired string
1310
+ * or as a reference to a run-time parameter of type REFCURSOR. The latter
1311
+ * case is for the convenience of plpgsql.
1312
+ */
1313
+ typedef struct CurrentOfExpr
1314
+ {
1315
+ Expr xpr;
1316
+ Index cvarno; /* RT index of target relation */
1317
+ char *cursor_name; /* name of referenced cursor, or NULL */
1318
+ int cursor_param; /* refcursor parameter number, or 0 */
1319
+ } CurrentOfExpr;
1320
+
1321
+ /*
1322
+ * NextValueExpr - get next value from sequence
1323
+ *
1324
+ * This has the same effect as calling the nextval() function, but it does not
1325
+ * check permissions on the sequence. This is used for identity columns,
1326
+ * where the sequence is an implicit dependency without its own permissions.
1327
+ */
1328
+ typedef struct NextValueExpr
1329
+ {
1330
+ Expr xpr;
1331
+ Oid seqid;
1332
+ Oid typeId;
1333
+ } NextValueExpr;
1334
+
1335
+ /*
1336
+ * InferenceElem - an element of a unique index inference specification
1337
+ *
1338
+ * This mostly matches the structure of IndexElems, but having a dedicated
1339
+ * primnode allows for a clean separation between the use of index parameters
1340
+ * by utility commands, and this node.
1341
+ */
1342
+ typedef struct InferenceElem
1343
+ {
1344
+ Expr xpr;
1345
+ Node *expr; /* expression to infer from, or NULL */
1346
+ Oid infercollid; /* OID of collation, or InvalidOid */
1347
+ Oid inferopclass; /* OID of att opclass, or InvalidOid */
1348
+ } InferenceElem;
1349
+
1350
+ /*--------------------
1351
+ * TargetEntry -
1352
+ * a target entry (used in query target lists)
1353
+ *
1354
+ * Strictly speaking, a TargetEntry isn't an expression node (since it can't
1355
+ * be evaluated by ExecEvalExpr). But we treat it as one anyway, since in
1356
+ * very many places it's convenient to process a whole query targetlist as a
1357
+ * single expression tree.
1358
+ *
1359
+ * In a SELECT's targetlist, resno should always be equal to the item's
1360
+ * ordinal position (counting from 1). However, in an INSERT or UPDATE
1361
+ * targetlist, resno represents the attribute number of the destination
1362
+ * column for the item; so there may be missing or out-of-order resnos.
1363
+ * It is even legal to have duplicated resnos; consider
1364
+ * UPDATE table SET arraycol[1] = ..., arraycol[2] = ..., ...
1365
+ * The two meanings come together in the executor, because the planner
1366
+ * transforms INSERT/UPDATE tlists into a normalized form with exactly
1367
+ * one entry for each column of the destination table. Before that's
1368
+ * happened, however, it is risky to assume that resno == position.
1369
+ * Generally get_tle_by_resno() should be used rather than list_nth()
1370
+ * to fetch tlist entries by resno, and only in SELECT should you assume
1371
+ * that resno is a unique identifier.
1372
+ *
1373
+ * resname is required to represent the correct column name in non-resjunk
1374
+ * entries of top-level SELECT targetlists, since it will be used as the
1375
+ * column title sent to the frontend. In most other contexts it is only
1376
+ * a debugging aid, and may be wrong or even NULL. (In particular, it may
1377
+ * be wrong in a tlist from a stored rule, if the referenced column has been
1378
+ * renamed by ALTER TABLE since the rule was made. Also, the planner tends
1379
+ * to store NULL rather than look up a valid name for tlist entries in
1380
+ * non-toplevel plan nodes.) In resjunk entries, resname should be either
1381
+ * a specific system-generated name (such as "ctid") or NULL; anything else
1382
+ * risks confusing ExecGetJunkAttribute!
1383
+ *
1384
+ * ressortgroupref is used in the representation of ORDER BY, GROUP BY, and
1385
+ * DISTINCT items. Targetlist entries with ressortgroupref=0 are not
1386
+ * sort/group items. If ressortgroupref>0, then this item is an ORDER BY,
1387
+ * GROUP BY, and/or DISTINCT target value. No two entries in a targetlist
1388
+ * may have the same nonzero ressortgroupref --- but there is no particular
1389
+ * meaning to the nonzero values, except as tags. (For example, one must
1390
+ * not assume that lower ressortgroupref means a more significant sort key.)
1391
+ * The order of the associated SortGroupClause lists determine the semantics.
1392
+ *
1393
+ * resorigtbl/resorigcol identify the source of the column, if it is a
1394
+ * simple reference to a column of a base table (or view). If it is not
1395
+ * a simple reference, these fields are zeroes.
1396
+ *
1397
+ * If resjunk is true then the column is a working column (such as a sort key)
1398
+ * that should be removed from the final output of the query. Resjunk columns
1399
+ * must have resnos that cannot duplicate any regular column's resno. Also
1400
+ * note that there are places that assume resjunk columns come after non-junk
1401
+ * columns.
1402
+ *--------------------
1403
+ */
1404
+ typedef struct TargetEntry
1405
+ {
1406
+ Expr xpr;
1407
+ Expr *expr; /* expression to evaluate */
1408
+ AttrNumber resno; /* attribute number (see notes above) */
1409
+ char *resname; /* name of the column (could be NULL) */
1410
+ Index ressortgroupref; /* nonzero if referenced by a sort/group
1411
+ * clause */
1412
+ Oid resorigtbl; /* OID of column's source table */
1413
+ AttrNumber resorigcol; /* column's number in source table */
1414
+ bool resjunk; /* set to true to eliminate the attribute from
1415
+ * final target list */
1416
+ } TargetEntry;
1417
+
1418
+
1419
+ /* ----------------------------------------------------------------
1420
+ * node types for join trees
1421
+ *
1422
+ * The leaves of a join tree structure are RangeTblRef nodes. Above
1423
+ * these, JoinExpr nodes can appear to denote a specific kind of join
1424
+ * or qualified join. Also, FromExpr nodes can appear to denote an
1425
+ * ordinary cross-product join ("FROM foo, bar, baz WHERE ...").
1426
+ * FromExpr is like a JoinExpr of jointype JOIN_INNER, except that it
1427
+ * may have any number of child nodes, not just two.
1428
+ *
1429
+ * NOTE: the top level of a Query's jointree is always a FromExpr.
1430
+ * Even if the jointree contains no rels, there will be a FromExpr.
1431
+ *
1432
+ * NOTE: the qualification expressions present in JoinExpr nodes are
1433
+ * *in addition to* the query's main WHERE clause, which appears as the
1434
+ * qual of the top-level FromExpr. The reason for associating quals with
1435
+ * specific nodes in the jointree is that the position of a qual is critical
1436
+ * when outer joins are present. (If we enforce a qual too soon or too late,
1437
+ * that may cause the outer join to produce the wrong set of NULL-extended
1438
+ * rows.) If all joins are inner joins then all the qual positions are
1439
+ * semantically interchangeable.
1440
+ *
1441
+ * NOTE: in the raw output of gram.y, a join tree contains RangeVar,
1442
+ * RangeSubselect, and RangeFunction nodes, which are all replaced by
1443
+ * RangeTblRef nodes during the parse analysis phase. Also, the top-level
1444
+ * FromExpr is added during parse analysis; the grammar regards FROM and
1445
+ * WHERE as separate.
1446
+ * ----------------------------------------------------------------
1447
+ */
1448
+
1449
+ /*
1450
+ * RangeTblRef - reference to an entry in the query's rangetable
1451
+ *
1452
+ * We could use direct pointers to the RT entries and skip having these
1453
+ * nodes, but multiple pointers to the same node in a querytree cause
1454
+ * lots of headaches, so it seems better to store an index into the RT.
1455
+ */
1456
+ typedef struct RangeTblRef
1457
+ {
1458
+ NodeTag type;
1459
+ int rtindex;
1460
+ } RangeTblRef;
1461
+
1462
+ /*----------
1463
+ * JoinExpr - for SQL JOIN expressions
1464
+ *
1465
+ * isNatural, usingClause, and quals are interdependent. The user can write
1466
+ * only one of NATURAL, USING(), or ON() (this is enforced by the grammar).
1467
+ * If he writes NATURAL then parse analysis generates the equivalent USING()
1468
+ * list, and from that fills in "quals" with the right equality comparisons.
1469
+ * If he writes USING() then "quals" is filled with equality comparisons.
1470
+ * If he writes ON() then only "quals" is set. Note that NATURAL/USING
1471
+ * are not equivalent to ON() since they also affect the output column list.
1472
+ *
1473
+ * alias is an Alias node representing the AS alias-clause attached to the
1474
+ * join expression, or NULL if no clause. NB: presence or absence of the
1475
+ * alias has a critical impact on semantics, because a join with an alias
1476
+ * restricts visibility of the tables/columns inside it.
1477
+ *
1478
+ * During parse analysis, an RTE is created for the Join, and its index
1479
+ * is filled into rtindex. This RTE is present mainly so that Vars can
1480
+ * be created that refer to the outputs of the join. The planner sometimes
1481
+ * generates JoinExprs internally; these can have rtindex = 0 if there are
1482
+ * no join alias variables referencing such joins.
1483
+ *----------
1484
+ */
1485
+ typedef struct JoinExpr
1486
+ {
1487
+ NodeTag type;
1488
+ JoinType jointype; /* type of join */
1489
+ bool isNatural; /* Natural join? Will need to shape table */
1490
+ Node *larg; /* left subtree */
1491
+ Node *rarg; /* right subtree */
1492
+ List *usingClause; /* USING clause, if any (list of String) */
1493
+ Node *quals; /* qualifiers on join, if any */
1494
+ Alias *alias; /* user-written alias clause, if any */
1495
+ int rtindex; /* RT index assigned for join, or 0 */
1496
+ } JoinExpr;
1497
+
1498
+ /*----------
1499
+ * FromExpr - represents a FROM ... WHERE ... construct
1500
+ *
1501
+ * This is both more flexible than a JoinExpr (it can have any number of
1502
+ * children, including zero) and less so --- we don't need to deal with
1503
+ * aliases and so on. The output column set is implicitly just the union
1504
+ * of the outputs of the children.
1505
+ *----------
1506
+ */
1507
+ typedef struct FromExpr
1508
+ {
1509
+ NodeTag type;
1510
+ List *fromlist; /* List of join subtrees */
1511
+ Node *quals; /* qualifiers on join, if any */
1512
+ } FromExpr;
1513
+
1514
+ /*----------
1515
+ * OnConflictExpr - represents an ON CONFLICT DO ... expression
1516
+ *
1517
+ * The optimizer requires a list of inference elements, and optionally a WHERE
1518
+ * clause to infer a unique index. The unique index (or, occasionally,
1519
+ * indexes) inferred are used to arbitrate whether or not the alternative ON
1520
+ * CONFLICT path is taken.
1521
+ *----------
1522
+ */
1523
+ typedef struct OnConflictExpr
1524
+ {
1525
+ NodeTag type;
1526
+ OnConflictAction action; /* DO NOTHING or UPDATE? */
1527
+
1528
+ /* Arbiter */
1529
+ List *arbiterElems; /* unique index arbiter list (of
1530
+ * InferenceElem's) */
1531
+ Node *arbiterWhere; /* unique index arbiter WHERE clause */
1532
+ Oid constraint; /* pg_constraint OID for arbiter */
1533
+
1534
+ /* ON CONFLICT UPDATE */
1535
+ List *onConflictSet; /* List of ON CONFLICT SET TargetEntrys */
1536
+ Node *onConflictWhere; /* qualifiers to restrict UPDATE to */
1537
+ int exclRelIndex; /* RT index of 'excluded' relation */
1538
+ List *exclRelTlist; /* tlist of the EXCLUDED pseudo relation */
1539
+ } OnConflictExpr;
1540
+
1541
+ #endif /* PRIMNODES_H */