gitlab-pg_query 1.3.1 → 2.0.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (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,41 @@
1
+ /*-------------------------------------------------------------------------
2
+ *
3
+ * functions.h
4
+ * Declarations for execution of SQL-language functions.
5
+ *
6
+ *
7
+ * Portions Copyright (c) 1996-2020, PostgreSQL Global Development Group
8
+ * Portions Copyright (c) 1994, Regents of the University of California
9
+ *
10
+ * src/include/executor/functions.h
11
+ *
12
+ *-------------------------------------------------------------------------
13
+ */
14
+ #ifndef FUNCTIONS_H
15
+ #define FUNCTIONS_H
16
+
17
+ #include "nodes/execnodes.h"
18
+ #include "tcop/dest.h"
19
+
20
+ /* This struct is known only within executor/functions.c */
21
+ typedef struct SQLFunctionParseInfo *SQLFunctionParseInfoPtr;
22
+
23
+ extern Datum fmgr_sql(PG_FUNCTION_ARGS);
24
+
25
+ extern SQLFunctionParseInfoPtr prepare_sql_fn_parse_info(HeapTuple procedureTuple,
26
+ Node *call_expr,
27
+ Oid inputCollation);
28
+
29
+ extern void sql_fn_parser_setup(struct ParseState *pstate,
30
+ SQLFunctionParseInfoPtr pinfo);
31
+
32
+ extern void check_sql_fn_statements(List *queryTreeLists);
33
+
34
+ extern bool check_sql_fn_retval(List *queryTreeLists,
35
+ Oid rettype, TupleDesc rettupdesc,
36
+ bool insertDroppedCols,
37
+ List **resultTargetList);
38
+
39
+ extern DestReceiver *CreateSQLFunctionDestReceiver(void);
40
+
41
+ #endif /* FUNCTIONS_H */
@@ -0,0 +1,101 @@
1
+ /*-------------------------------------------------------------------------
2
+ *
3
+ * instrument.h
4
+ * definitions for run-time statistics collection
5
+ *
6
+ *
7
+ * Copyright (c) 2001-2020, PostgreSQL Global Development Group
8
+ *
9
+ * src/include/executor/instrument.h
10
+ *
11
+ *-------------------------------------------------------------------------
12
+ */
13
+ #ifndef INSTRUMENT_H
14
+ #define INSTRUMENT_H
15
+
16
+ #include "portability/instr_time.h"
17
+
18
+
19
+ typedef struct BufferUsage
20
+ {
21
+ long shared_blks_hit; /* # of shared buffer hits */
22
+ long shared_blks_read; /* # of shared disk blocks read */
23
+ long shared_blks_dirtied; /* # of shared blocks dirtied */
24
+ long shared_blks_written; /* # of shared disk blocks written */
25
+ long local_blks_hit; /* # of local buffer hits */
26
+ long local_blks_read; /* # of local disk blocks read */
27
+ long local_blks_dirtied; /* # of shared blocks dirtied */
28
+ long local_blks_written; /* # of local disk blocks written */
29
+ long temp_blks_read; /* # of temp blocks read */
30
+ long temp_blks_written; /* # of temp blocks written */
31
+ instr_time blk_read_time; /* time spent reading */
32
+ instr_time blk_write_time; /* time spent writing */
33
+ } BufferUsage;
34
+
35
+ typedef struct WalUsage
36
+ {
37
+ long wal_records; /* # of WAL records produced */
38
+ long wal_fpi; /* # of WAL full page images produced */
39
+ uint64 wal_bytes; /* size of WAL records produced */
40
+ } WalUsage;
41
+
42
+ /* Flag bits included in InstrAlloc's instrument_options bitmask */
43
+ typedef enum InstrumentOption
44
+ {
45
+ INSTRUMENT_TIMER = 1 << 0, /* needs timer (and row counts) */
46
+ INSTRUMENT_BUFFERS = 1 << 1, /* needs buffer usage */
47
+ INSTRUMENT_ROWS = 1 << 2, /* needs row count */
48
+ INSTRUMENT_WAL = 1 << 3, /* needs WAL usage */
49
+ INSTRUMENT_ALL = PG_INT32_MAX
50
+ } InstrumentOption;
51
+
52
+ typedef struct Instrumentation
53
+ {
54
+ /* Parameters set at node creation: */
55
+ bool need_timer; /* true if we need timer data */
56
+ bool need_bufusage; /* true if we need buffer usage data */
57
+ bool need_walusage; /* true if we need WAL usage data */
58
+ /* Info about current plan cycle: */
59
+ bool running; /* true if we've completed first tuple */
60
+ instr_time starttime; /* start time of current iteration of node */
61
+ instr_time counter; /* accumulated runtime for this node */
62
+ double firsttuple; /* time for first tuple of this cycle */
63
+ double tuplecount; /* # of tuples emitted so far this cycle */
64
+ BufferUsage bufusage_start; /* buffer usage at start */
65
+ WalUsage walusage_start; /* WAL usage at start */
66
+ /* Accumulated statistics across all completed cycles: */
67
+ double startup; /* total startup time (in seconds) */
68
+ double total; /* total time (in seconds) */
69
+ double ntuples; /* total tuples produced */
70
+ double ntuples2; /* secondary node-specific tuple counter */
71
+ double nloops; /* # of run cycles for this node */
72
+ double nfiltered1; /* # of tuples removed by scanqual or joinqual */
73
+ double nfiltered2; /* # of tuples removed by "other" quals */
74
+ BufferUsage bufusage; /* total buffer usage */
75
+ WalUsage walusage; /* total WAL usage */
76
+ } Instrumentation;
77
+
78
+ typedef struct WorkerInstrumentation
79
+ {
80
+ int num_workers; /* # of structures that follow */
81
+ Instrumentation instrument[FLEXIBLE_ARRAY_MEMBER];
82
+ } WorkerInstrumentation;
83
+
84
+ extern PGDLLIMPORT BufferUsage pgBufferUsage;
85
+ extern PGDLLIMPORT WalUsage pgWalUsage;
86
+
87
+ extern Instrumentation *InstrAlloc(int n, int instrument_options);
88
+ extern void InstrInit(Instrumentation *instr, int instrument_options);
89
+ extern void InstrStartNode(Instrumentation *instr);
90
+ extern void InstrStopNode(Instrumentation *instr, double nTuples);
91
+ extern void InstrEndLoop(Instrumentation *instr);
92
+ extern void InstrAggNode(Instrumentation *dst, Instrumentation *add);
93
+ extern void InstrStartParallelQuery(void);
94
+ extern void InstrEndParallelQuery(BufferUsage *bufusage, WalUsage *walusage);
95
+ extern void InstrAccumParallelQuery(BufferUsage *bufusage, WalUsage *walusage);
96
+ extern void BufferUsageAccumDiff(BufferUsage *dst,
97
+ const BufferUsage *add, const BufferUsage *sub);
98
+ extern void WalUsageAccumDiff(WalUsage *dst, const WalUsage *add,
99
+ const WalUsage *sub);
100
+
101
+ #endif /* INSTRUMENT_H */
@@ -0,0 +1,175 @@
1
+ /*-------------------------------------------------------------------------
2
+ *
3
+ * spi.h
4
+ * Server Programming Interface public declarations
5
+ *
6
+ * Portions Copyright (c) 1996-2020, PostgreSQL Global Development Group
7
+ * Portions Copyright (c) 1994, Regents of the University of California
8
+ *
9
+ * src/include/executor/spi.h
10
+ *
11
+ *-------------------------------------------------------------------------
12
+ */
13
+ #ifndef SPI_H
14
+ #define SPI_H
15
+
16
+ #include "commands/trigger.h"
17
+ #include "lib/ilist.h"
18
+ #include "nodes/parsenodes.h"
19
+ #include "utils/portal.h"
20
+
21
+
22
+ typedef struct SPITupleTable
23
+ {
24
+ /* Public members */
25
+ TupleDesc tupdesc; /* tuple descriptor */
26
+ HeapTuple *vals; /* array of tuples */
27
+ uint64 numvals; /* number of valid tuples */
28
+
29
+ /* Private members, not intended for external callers */
30
+ uint64 alloced; /* allocated length of vals array */
31
+ MemoryContext tuptabcxt; /* memory context of result table */
32
+ slist_node next; /* link for internal bookkeeping */
33
+ SubTransactionId subid; /* subxact in which tuptable was created */
34
+ } SPITupleTable;
35
+
36
+ /* Plans are opaque structs for standard users of SPI */
37
+ typedef struct _SPI_plan *SPIPlanPtr;
38
+
39
+ #define SPI_ERROR_CONNECT (-1)
40
+ #define SPI_ERROR_COPY (-2)
41
+ #define SPI_ERROR_OPUNKNOWN (-3)
42
+ #define SPI_ERROR_UNCONNECTED (-4)
43
+ #define SPI_ERROR_CURSOR (-5) /* not used anymore */
44
+ #define SPI_ERROR_ARGUMENT (-6)
45
+ #define SPI_ERROR_PARAM (-7)
46
+ #define SPI_ERROR_TRANSACTION (-8)
47
+ #define SPI_ERROR_NOATTRIBUTE (-9)
48
+ #define SPI_ERROR_NOOUTFUNC (-10)
49
+ #define SPI_ERROR_TYPUNKNOWN (-11)
50
+ #define SPI_ERROR_REL_DUPLICATE (-12)
51
+ #define SPI_ERROR_REL_NOT_FOUND (-13)
52
+
53
+ #define SPI_OK_CONNECT 1
54
+ #define SPI_OK_FINISH 2
55
+ #define SPI_OK_FETCH 3
56
+ #define SPI_OK_UTILITY 4
57
+ #define SPI_OK_SELECT 5
58
+ #define SPI_OK_SELINTO 6
59
+ #define SPI_OK_INSERT 7
60
+ #define SPI_OK_DELETE 8
61
+ #define SPI_OK_UPDATE 9
62
+ #define SPI_OK_CURSOR 10
63
+ #define SPI_OK_INSERT_RETURNING 11
64
+ #define SPI_OK_DELETE_RETURNING 12
65
+ #define SPI_OK_UPDATE_RETURNING 13
66
+ #define SPI_OK_REWRITTEN 14
67
+ #define SPI_OK_REL_REGISTER 15
68
+ #define SPI_OK_REL_UNREGISTER 16
69
+ #define SPI_OK_TD_REGISTER 17
70
+
71
+ #define SPI_OPT_NONATOMIC (1 << 0)
72
+
73
+ /* These used to be functions, now just no-ops for backwards compatibility */
74
+ #define SPI_push() ((void) 0)
75
+ #define SPI_pop() ((void) 0)
76
+ #define SPI_push_conditional() false
77
+ #define SPI_pop_conditional(pushed) ((void) 0)
78
+ #define SPI_restore_connection() ((void) 0)
79
+
80
+ extern PGDLLIMPORT uint64 SPI_processed;
81
+ extern PGDLLIMPORT SPITupleTable *SPI_tuptable;
82
+ extern PGDLLIMPORT int SPI_result;
83
+
84
+ extern int SPI_connect(void);
85
+ extern int SPI_connect_ext(int options);
86
+ extern int SPI_finish(void);
87
+ extern int SPI_execute(const char *src, bool read_only, long tcount);
88
+ extern int SPI_execute_plan(SPIPlanPtr plan, Datum *Values, const char *Nulls,
89
+ bool read_only, long tcount);
90
+ extern int SPI_execute_plan_with_paramlist(SPIPlanPtr plan,
91
+ ParamListInfo params,
92
+ bool read_only, long tcount);
93
+ extern int SPI_exec(const char *src, long tcount);
94
+ extern int SPI_execp(SPIPlanPtr plan, Datum *Values, const char *Nulls,
95
+ long tcount);
96
+ extern int SPI_execute_snapshot(SPIPlanPtr plan,
97
+ Datum *Values, const char *Nulls,
98
+ Snapshot snapshot,
99
+ Snapshot crosscheck_snapshot,
100
+ bool read_only, bool fire_triggers, long tcount);
101
+ extern int SPI_execute_with_args(const char *src,
102
+ int nargs, Oid *argtypes,
103
+ Datum *Values, const char *Nulls,
104
+ bool read_only, long tcount);
105
+ extern SPIPlanPtr SPI_prepare(const char *src, int nargs, Oid *argtypes);
106
+ extern SPIPlanPtr SPI_prepare_cursor(const char *src, int nargs, Oid *argtypes,
107
+ int cursorOptions);
108
+ extern SPIPlanPtr SPI_prepare_params(const char *src,
109
+ ParserSetupHook parserSetup,
110
+ void *parserSetupArg,
111
+ int cursorOptions);
112
+ extern int SPI_keepplan(SPIPlanPtr plan);
113
+ extern SPIPlanPtr SPI_saveplan(SPIPlanPtr plan);
114
+ extern int SPI_freeplan(SPIPlanPtr plan);
115
+
116
+ extern Oid SPI_getargtypeid(SPIPlanPtr plan, int argIndex);
117
+ extern int SPI_getargcount(SPIPlanPtr plan);
118
+ extern bool SPI_is_cursor_plan(SPIPlanPtr plan);
119
+ extern bool SPI_plan_is_valid(SPIPlanPtr plan);
120
+ extern const char *SPI_result_code_string(int code);
121
+
122
+ extern List *SPI_plan_get_plan_sources(SPIPlanPtr plan);
123
+ extern CachedPlan *SPI_plan_get_cached_plan(SPIPlanPtr plan);
124
+
125
+ extern HeapTuple SPI_copytuple(HeapTuple tuple);
126
+ extern HeapTupleHeader SPI_returntuple(HeapTuple tuple, TupleDesc tupdesc);
127
+ extern HeapTuple SPI_modifytuple(Relation rel, HeapTuple tuple, int natts,
128
+ int *attnum, Datum *Values, const char *Nulls);
129
+ extern int SPI_fnumber(TupleDesc tupdesc, const char *fname);
130
+ extern char *SPI_fname(TupleDesc tupdesc, int fnumber);
131
+ extern char *SPI_getvalue(HeapTuple tuple, TupleDesc tupdesc, int fnumber);
132
+ extern Datum SPI_getbinval(HeapTuple tuple, TupleDesc tupdesc, int fnumber, bool *isnull);
133
+ extern char *SPI_gettype(TupleDesc tupdesc, int fnumber);
134
+ extern Oid SPI_gettypeid(TupleDesc tupdesc, int fnumber);
135
+ extern char *SPI_getrelname(Relation rel);
136
+ extern char *SPI_getnspname(Relation rel);
137
+ extern void *SPI_palloc(Size size);
138
+ extern void *SPI_repalloc(void *pointer, Size size);
139
+ extern void SPI_pfree(void *pointer);
140
+ extern Datum SPI_datumTransfer(Datum value, bool typByVal, int typLen);
141
+ extern void SPI_freetuple(HeapTuple pointer);
142
+ extern void SPI_freetuptable(SPITupleTable *tuptable);
143
+
144
+ extern Portal SPI_cursor_open(const char *name, SPIPlanPtr plan,
145
+ Datum *Values, const char *Nulls, bool read_only);
146
+ extern Portal SPI_cursor_open_with_args(const char *name,
147
+ const char *src,
148
+ int nargs, Oid *argtypes,
149
+ Datum *Values, const char *Nulls,
150
+ bool read_only, int cursorOptions);
151
+ extern Portal SPI_cursor_open_with_paramlist(const char *name, SPIPlanPtr plan,
152
+ ParamListInfo params, bool read_only);
153
+ extern Portal SPI_cursor_find(const char *name);
154
+ extern void SPI_cursor_fetch(Portal portal, bool forward, long count);
155
+ extern void SPI_cursor_move(Portal portal, bool forward, long count);
156
+ extern void SPI_scroll_cursor_fetch(Portal, FetchDirection direction, long count);
157
+ extern void SPI_scroll_cursor_move(Portal, FetchDirection direction, long count);
158
+ extern void SPI_cursor_close(Portal portal);
159
+
160
+ extern int SPI_register_relation(EphemeralNamedRelation enr);
161
+ extern int SPI_unregister_relation(const char *name);
162
+ extern int SPI_register_trigger_data(TriggerData *tdata);
163
+
164
+ extern void SPI_start_transaction(void);
165
+ extern void SPI_commit(void);
166
+ extern void SPI_commit_and_chain(void);
167
+ extern void SPI_rollback(void);
168
+ extern void SPI_rollback_and_chain(void);
169
+
170
+ extern void SPICleanup(void);
171
+ extern void AtEOXact_SPI(bool isCommit);
172
+ extern void AtEOSubXact_SPI(bool isCommit, SubTransactionId mySubid);
173
+ extern bool SPI_inside_nonatomic_context(void);
174
+
175
+ #endif /* SPI_H */
@@ -0,0 +1,67 @@
1
+ /*-------------------------------------------------------------------------
2
+ *
3
+ * tablefunc.h
4
+ * interface for TableFunc executor node
5
+ *
6
+ * Portions Copyright (c) 1996-2020, PostgreSQL Global Development Group
7
+ * Portions Copyright (c) 1994, Regents of the University of California
8
+ *
9
+ * src/include/executor/tablefunc.h
10
+ *
11
+ *-------------------------------------------------------------------------
12
+ */
13
+ #ifndef _TABLEFUNC_H
14
+ #define _TABLEFUNC_H
15
+
16
+ /* Forward-declare this to avoid including execnodes.h here */
17
+ struct TableFuncScanState;
18
+
19
+ /*
20
+ * TableFuncRoutine holds function pointers used for generating content of
21
+ * table-producer functions, such as XMLTABLE.
22
+ *
23
+ * InitOpaque initializes table builder private objects. The output tuple
24
+ * descriptor, input functions for the columns, and typioparams are passed
25
+ * from executor state.
26
+ *
27
+ * SetDocument is called to define the input document. The table builder may
28
+ * apply additional transformations not exposed outside the table builder
29
+ * context.
30
+ *
31
+ * SetNamespace is called to pass namespace declarations from the table
32
+ * expression. This function may be NULL if namespaces are not supported by
33
+ * the table builder. Namespaces must be given before setting the row and
34
+ * column filters. If the name is given as NULL, the entry shall be for the
35
+ * default namespace.
36
+ *
37
+ * SetRowFilter is called do define the row-generating filter, which shall be
38
+ * used to extract each row from the input document.
39
+ *
40
+ * SetColumnFilter is called once for each column, to define the column-
41
+ * generating filter for the given column.
42
+ *
43
+ * FetchRow shall be called repeatedly until it returns that no more rows are
44
+ * found in the document. On each invocation it shall set state in the table
45
+ * builder context such that each subsequent GetValue call returns the values
46
+ * for the indicated column for the row being processed.
47
+ *
48
+ * DestroyOpaque shall release all resources associated with a table builder
49
+ * context. It may be called either because all rows have been consumed, or
50
+ * because an error occurred while processing the table expression.
51
+ */
52
+ typedef struct TableFuncRoutine
53
+ {
54
+ void (*InitOpaque) (struct TableFuncScanState *state, int natts);
55
+ void (*SetDocument) (struct TableFuncScanState *state, Datum value);
56
+ void (*SetNamespace) (struct TableFuncScanState *state, const char *name,
57
+ const char *uri);
58
+ void (*SetRowFilter) (struct TableFuncScanState *state, const char *path);
59
+ void (*SetColumnFilter) (struct TableFuncScanState *state,
60
+ const char *path, int colnum);
61
+ bool (*FetchRow) (struct TableFuncScanState *state);
62
+ Datum (*GetValue) (struct TableFuncScanState *state, int colnum,
63
+ Oid typid, int32 typmod, bool *isnull);
64
+ void (*DestroyOpaque) (struct TableFuncScanState *state);
65
+ } TableFuncRoutine;
66
+
67
+ #endif /* _TABLEFUNC_H */
@@ -0,0 +1,487 @@
1
+ /*-------------------------------------------------------------------------
2
+ *
3
+ * tuptable.h
4
+ * tuple table support stuff
5
+ *
6
+ *
7
+ * Portions Copyright (c) 1996-2020, PostgreSQL Global Development Group
8
+ * Portions Copyright (c) 1994, Regents of the University of California
9
+ *
10
+ * src/include/executor/tuptable.h
11
+ *
12
+ *-------------------------------------------------------------------------
13
+ */
14
+ #ifndef TUPTABLE_H
15
+ #define TUPTABLE_H
16
+
17
+ #include "access/htup.h"
18
+ #include "access/htup_details.h"
19
+ #include "access/sysattr.h"
20
+ #include "access/tupdesc.h"
21
+ #include "storage/buf.h"
22
+
23
+ /*----------
24
+ * The executor stores tuples in a "tuple table" which is a List of
25
+ * independent TupleTableSlots.
26
+ *
27
+ * There's various different types of tuple table slots, each being able to
28
+ * store different types of tuples. Additional types of slots can be added
29
+ * without modifying core code. The type of a slot is determined by the
30
+ * TupleTableSlotOps* passed to the slot creation routine. The builtin types
31
+ * of slots are
32
+ *
33
+ * 1. physical tuple in a disk buffer page (TTSOpsBufferHeapTuple)
34
+ * 2. physical tuple constructed in palloc'ed memory (TTSOpsHeapTuple)
35
+ * 3. "minimal" physical tuple constructed in palloc'ed memory
36
+ * (TTSOpsMinimalTuple)
37
+ * 4. "virtual" tuple consisting of Datum/isnull arrays (TTSOpsVirtual)
38
+ *
39
+ *
40
+ * The first two cases are similar in that they both deal with "materialized"
41
+ * tuples, but resource management is different. For a tuple in a disk page
42
+ * we need to hold a pin on the buffer until the TupleTableSlot's reference
43
+ * to the tuple is dropped; while for a palloc'd tuple we usually want the
44
+ * tuple pfree'd when the TupleTableSlot's reference is dropped.
45
+ *
46
+ * A "minimal" tuple is handled similarly to a palloc'd regular tuple.
47
+ * At present, minimal tuples never are stored in buffers, so there is no
48
+ * parallel to case 1. Note that a minimal tuple has no "system columns".
49
+ * (Actually, it could have an OID, but we have no need to access the OID.)
50
+ *
51
+ * A "virtual" tuple is an optimization used to minimize physical data copying
52
+ * in a nest of plan nodes. Until materialized pass-by-reference Datums in
53
+ * the slot point to storage that is not directly associated with the
54
+ * TupleTableSlot; generally they will point to part of a tuple stored in a
55
+ * lower plan node's output TupleTableSlot, or to a function result
56
+ * constructed in a plan node's per-tuple econtext. It is the responsibility
57
+ * of the generating plan node to be sure these resources are not released for
58
+ * as long as the virtual tuple needs to be valid or is materialized. Note
59
+ * also that a virtual tuple does not have any "system columns".
60
+ *
61
+ * The Datum/isnull arrays of a TupleTableSlot serve double duty. For virtual
62
+ * slots they are the authoritative data. For the other builtin slots,
63
+ * the arrays contain data extracted from the tuple. (In this state, any
64
+ * pass-by-reference Datums point into the physical tuple.) The extracted
65
+ * information is built "lazily", ie, only as needed. This serves to avoid
66
+ * repeated extraction of data from the physical tuple.
67
+ *
68
+ * A TupleTableSlot can also be "empty", indicated by flag TTS_FLAG_EMPTY set
69
+ * in tts_flags, holding no valid data. This is the only valid state for a
70
+ * freshly-created slot that has not yet had a tuple descriptor assigned to
71
+ * it. In this state, TTS_SHOULDFREE should not be set in tts_flags, tts_tuple
72
+ * must be NULL and tts_nvalid zero.
73
+ *
74
+ * The tupleDescriptor is simply referenced, not copied, by the TupleTableSlot
75
+ * code. The caller of ExecSetSlotDescriptor() is responsible for providing
76
+ * a descriptor that will live as long as the slot does. (Typically, both
77
+ * slots and descriptors are in per-query memory and are freed by memory
78
+ * context deallocation at query end; so it's not worth providing any extra
79
+ * mechanism to do more. However, the slot will increment the tupdesc
80
+ * reference count if a reference-counted tupdesc is supplied.)
81
+ *
82
+ * When TTS_SHOULDFREE is set in tts_flags, the physical tuple is "owned" by
83
+ * the slot and should be freed when the slot's reference to the tuple is
84
+ * dropped.
85
+ *
86
+ * tts_values/tts_isnull are allocated either when the slot is created (when
87
+ * the descriptor is provided), or when a descriptor is assigned to the slot;
88
+ * they are of length equal to the descriptor's natts.
89
+ *
90
+ * The TTS_FLAG_SLOW flag is saved state for
91
+ * slot_deform_heap_tuple, and should not be touched by any other code.
92
+ *----------
93
+ */
94
+
95
+ /* true = slot is empty */
96
+ #define TTS_FLAG_EMPTY (1 << 1)
97
+ #define TTS_EMPTY(slot) (((slot)->tts_flags & TTS_FLAG_EMPTY) != 0)
98
+
99
+ /* should pfree tuple "owned" by the slot? */
100
+ #define TTS_FLAG_SHOULDFREE (1 << 2)
101
+ #define TTS_SHOULDFREE(slot) (((slot)->tts_flags & TTS_FLAG_SHOULDFREE) != 0)
102
+
103
+ /* saved state for slot_deform_heap_tuple */
104
+ #define TTS_FLAG_SLOW (1 << 3)
105
+ #define TTS_SLOW(slot) (((slot)->tts_flags & TTS_FLAG_SLOW) != 0)
106
+
107
+ /* fixed tuple descriptor */
108
+ #define TTS_FLAG_FIXED (1 << 4)
109
+ #define TTS_FIXED(slot) (((slot)->tts_flags & TTS_FLAG_FIXED) != 0)
110
+
111
+ struct TupleTableSlotOps;
112
+ typedef struct TupleTableSlotOps TupleTableSlotOps;
113
+
114
+ /* base tuple table slot type */
115
+ typedef struct TupleTableSlot
116
+ {
117
+ NodeTag type;
118
+ #define FIELDNO_TUPLETABLESLOT_FLAGS 1
119
+ uint16 tts_flags; /* Boolean states */
120
+ #define FIELDNO_TUPLETABLESLOT_NVALID 2
121
+ AttrNumber tts_nvalid; /* # of valid values in tts_values */
122
+ const TupleTableSlotOps *const tts_ops; /* implementation of slot */
123
+ #define FIELDNO_TUPLETABLESLOT_TUPLEDESCRIPTOR 4
124
+ TupleDesc tts_tupleDescriptor; /* slot's tuple descriptor */
125
+ #define FIELDNO_TUPLETABLESLOT_VALUES 5
126
+ Datum *tts_values; /* current per-attribute values */
127
+ #define FIELDNO_TUPLETABLESLOT_ISNULL 6
128
+ bool *tts_isnull; /* current per-attribute isnull flags */
129
+ MemoryContext tts_mcxt; /* slot itself is in this context */
130
+ ItemPointerData tts_tid; /* stored tuple's tid */
131
+ Oid tts_tableOid; /* table oid of tuple */
132
+ } TupleTableSlot;
133
+
134
+ /* routines for a TupleTableSlot implementation */
135
+ struct TupleTableSlotOps
136
+ {
137
+ /* Minimum size of the slot */
138
+ size_t base_slot_size;
139
+
140
+ /* Initialization. */
141
+ void (*init) (TupleTableSlot *slot);
142
+
143
+ /* Destruction. */
144
+ void (*release) (TupleTableSlot *slot);
145
+
146
+ /*
147
+ * Clear the contents of the slot. Only the contents are expected to be
148
+ * cleared and not the tuple descriptor. Typically an implementation of
149
+ * this callback should free the memory allocated for the tuple contained
150
+ * in the slot.
151
+ */
152
+ void (*clear) (TupleTableSlot *slot);
153
+
154
+ /*
155
+ * Fill up first natts entries of tts_values and tts_isnull arrays with
156
+ * values from the tuple contained in the slot. The function may be called
157
+ * with natts more than the number of attributes available in the tuple,
158
+ * in which case it should set tts_nvalid to the number of returned
159
+ * columns.
160
+ */
161
+ void (*getsomeattrs) (TupleTableSlot *slot, int natts);
162
+
163
+ /*
164
+ * Returns value of the given system attribute as a datum and sets isnull
165
+ * to false, if it's not NULL. Throws an error if the slot type does not
166
+ * support system attributes.
167
+ */
168
+ Datum (*getsysattr) (TupleTableSlot *slot, int attnum, bool *isnull);
169
+
170
+ /*
171
+ * Make the contents of the slot solely depend on the slot, and not on
172
+ * underlying resources (like another memory context, buffers, etc).
173
+ */
174
+ void (*materialize) (TupleTableSlot *slot);
175
+
176
+ /*
177
+ * Copy the contents of the source slot into the destination slot's own
178
+ * context. Invoked using callback of the destination slot.
179
+ */
180
+ void (*copyslot) (TupleTableSlot *dstslot, TupleTableSlot *srcslot);
181
+
182
+ /*
183
+ * Return a heap tuple "owned" by the slot. It is slot's responsibility to
184
+ * free the memory consumed by the heap tuple. If the slot can not "own" a
185
+ * heap tuple, it should not implement this callback and should set it as
186
+ * NULL.
187
+ */
188
+ HeapTuple (*get_heap_tuple) (TupleTableSlot *slot);
189
+
190
+ /*
191
+ * Return a minimal tuple "owned" by the slot. It is slot's responsibility
192
+ * to free the memory consumed by the minimal tuple. If the slot can not
193
+ * "own" a minimal tuple, it should not implement this callback and should
194
+ * set it as NULL.
195
+ */
196
+ MinimalTuple (*get_minimal_tuple) (TupleTableSlot *slot);
197
+
198
+ /*
199
+ * Return a copy of heap tuple representing the contents of the slot. The
200
+ * copy needs to be palloc'd in the current memory context. The slot
201
+ * itself is expected to remain unaffected. It is *not* expected to have
202
+ * meaningful "system columns" in the copy. The copy is not be "owned" by
203
+ * the slot i.e. the caller has to take responsibility to free memory
204
+ * consumed by the slot.
205
+ */
206
+ HeapTuple (*copy_heap_tuple) (TupleTableSlot *slot);
207
+
208
+ /*
209
+ * Return a copy of minimal tuple representing the contents of the slot.
210
+ * The copy needs to be palloc'd in the current memory context. The slot
211
+ * itself is expected to remain unaffected. It is *not* expected to have
212
+ * meaningful "system columns" in the copy. The copy is not be "owned" by
213
+ * the slot i.e. the caller has to take responsibility to free memory
214
+ * consumed by the slot.
215
+ */
216
+ MinimalTuple (*copy_minimal_tuple) (TupleTableSlot *slot);
217
+ };
218
+
219
+ /*
220
+ * Predefined TupleTableSlotOps for various types of TupleTableSlotOps. The
221
+ * same are used to identify the type of a given slot.
222
+ */
223
+ extern PGDLLIMPORT const TupleTableSlotOps TTSOpsVirtual;
224
+ extern PGDLLIMPORT const TupleTableSlotOps TTSOpsHeapTuple;
225
+ extern PGDLLIMPORT const TupleTableSlotOps TTSOpsMinimalTuple;
226
+ extern PGDLLIMPORT const TupleTableSlotOps TTSOpsBufferHeapTuple;
227
+
228
+ #define TTS_IS_VIRTUAL(slot) ((slot)->tts_ops == &TTSOpsVirtual)
229
+ #define TTS_IS_HEAPTUPLE(slot) ((slot)->tts_ops == &TTSOpsHeapTuple)
230
+ #define TTS_IS_MINIMALTUPLE(slot) ((slot)->tts_ops == &TTSOpsMinimalTuple)
231
+ #define TTS_IS_BUFFERTUPLE(slot) ((slot)->tts_ops == &TTSOpsBufferHeapTuple)
232
+
233
+
234
+ /*
235
+ * Tuple table slot implementations.
236
+ */
237
+
238
+ typedef struct VirtualTupleTableSlot
239
+ {
240
+ TupleTableSlot base;
241
+
242
+ char *data; /* data for materialized slots */
243
+ } VirtualTupleTableSlot;
244
+
245
+ typedef struct HeapTupleTableSlot
246
+ {
247
+ TupleTableSlot base;
248
+
249
+ #define FIELDNO_HEAPTUPLETABLESLOT_TUPLE 1
250
+ HeapTuple tuple; /* physical tuple */
251
+ #define FIELDNO_HEAPTUPLETABLESLOT_OFF 2
252
+ uint32 off; /* saved state for slot_deform_heap_tuple */
253
+ HeapTupleData tupdata; /* optional workspace for storing tuple */
254
+ } HeapTupleTableSlot;
255
+
256
+ /* heap tuple residing in a buffer */
257
+ typedef struct BufferHeapTupleTableSlot
258
+ {
259
+ HeapTupleTableSlot base;
260
+
261
+ /*
262
+ * If buffer is not InvalidBuffer, then the slot is holding a pin on the
263
+ * indicated buffer page; drop the pin when we release the slot's
264
+ * reference to that buffer. (TTS_FLAG_SHOULDFREE should not be set in
265
+ * such a case, since presumably tts_tuple is pointing into the buffer.)
266
+ */
267
+ Buffer buffer; /* tuple's buffer, or InvalidBuffer */
268
+ } BufferHeapTupleTableSlot;
269
+
270
+ typedef struct MinimalTupleTableSlot
271
+ {
272
+ TupleTableSlot base;
273
+
274
+ /*
275
+ * In a minimal slot tuple points at minhdr and the fields of that struct
276
+ * are set correctly for access to the minimal tuple; in particular,
277
+ * minhdr.t_data points MINIMAL_TUPLE_OFFSET bytes before mintuple. This
278
+ * allows column extraction to treat the case identically to regular
279
+ * physical tuples.
280
+ */
281
+ #define FIELDNO_MINIMALTUPLETABLESLOT_TUPLE 1
282
+ HeapTuple tuple; /* tuple wrapper */
283
+ MinimalTuple mintuple; /* minimal tuple, or NULL if none */
284
+ HeapTupleData minhdr; /* workspace for minimal-tuple-only case */
285
+ #define FIELDNO_MINIMALTUPLETABLESLOT_OFF 4
286
+ uint32 off; /* saved state for slot_deform_heap_tuple */
287
+ } MinimalTupleTableSlot;
288
+
289
+ /*
290
+ * TupIsNull -- is a TupleTableSlot empty?
291
+ */
292
+ #define TupIsNull(slot) \
293
+ ((slot) == NULL || TTS_EMPTY(slot))
294
+
295
+ /* in executor/execTuples.c */
296
+ extern TupleTableSlot *MakeTupleTableSlot(TupleDesc tupleDesc,
297
+ const TupleTableSlotOps *tts_ops);
298
+ extern TupleTableSlot *ExecAllocTableSlot(List **tupleTable, TupleDesc desc,
299
+ const TupleTableSlotOps *tts_ops);
300
+ extern void ExecResetTupleTable(List *tupleTable, bool shouldFree);
301
+ extern TupleTableSlot *MakeSingleTupleTableSlot(TupleDesc tupdesc,
302
+ const TupleTableSlotOps *tts_ops);
303
+ extern void ExecDropSingleTupleTableSlot(TupleTableSlot *slot);
304
+ extern void ExecSetSlotDescriptor(TupleTableSlot *slot, TupleDesc tupdesc);
305
+ extern TupleTableSlot *ExecStoreHeapTuple(HeapTuple tuple,
306
+ TupleTableSlot *slot,
307
+ bool shouldFree);
308
+ extern void ExecForceStoreHeapTuple(HeapTuple tuple,
309
+ TupleTableSlot *slot,
310
+ bool shouldFree);
311
+ extern TupleTableSlot *ExecStoreBufferHeapTuple(HeapTuple tuple,
312
+ TupleTableSlot *slot,
313
+ Buffer buffer);
314
+ extern TupleTableSlot *ExecStorePinnedBufferHeapTuple(HeapTuple tuple,
315
+ TupleTableSlot *slot,
316
+ Buffer buffer);
317
+ extern TupleTableSlot *ExecStoreMinimalTuple(MinimalTuple mtup,
318
+ TupleTableSlot *slot,
319
+ bool shouldFree);
320
+ extern void ExecForceStoreMinimalTuple(MinimalTuple mtup, TupleTableSlot *slot,
321
+ bool shouldFree);
322
+ extern TupleTableSlot *ExecStoreVirtualTuple(TupleTableSlot *slot);
323
+ extern TupleTableSlot *ExecStoreAllNullTuple(TupleTableSlot *slot);
324
+ extern void ExecStoreHeapTupleDatum(Datum data, TupleTableSlot *slot);
325
+ extern HeapTuple ExecFetchSlotHeapTuple(TupleTableSlot *slot, bool materialize, bool *shouldFree);
326
+ extern MinimalTuple ExecFetchSlotMinimalTuple(TupleTableSlot *slot,
327
+ bool *shouldFree);
328
+ extern Datum ExecFetchSlotHeapTupleDatum(TupleTableSlot *slot);
329
+ extern void slot_getmissingattrs(TupleTableSlot *slot, int startAttNum,
330
+ int lastAttNum);
331
+ extern void slot_getsomeattrs_int(TupleTableSlot *slot, int attnum);
332
+
333
+
334
+ #ifndef FRONTEND
335
+
336
+ /*
337
+ * This function forces the entries of the slot's Datum/isnull arrays to be
338
+ * valid at least up through the attnum'th entry.
339
+ */
340
+ static inline void
341
+ slot_getsomeattrs(TupleTableSlot *slot, int attnum)
342
+ {
343
+ if (slot->tts_nvalid < attnum)
344
+ slot_getsomeattrs_int(slot, attnum);
345
+ }
346
+
347
+ /*
348
+ * slot_getallattrs
349
+ * This function forces all the entries of the slot's Datum/isnull
350
+ * arrays to be valid. The caller may then extract data directly
351
+ * from those arrays instead of using slot_getattr.
352
+ */
353
+ static inline void
354
+ slot_getallattrs(TupleTableSlot *slot)
355
+ {
356
+ slot_getsomeattrs(slot, slot->tts_tupleDescriptor->natts);
357
+ }
358
+
359
+
360
+ /*
361
+ * slot_attisnull
362
+ *
363
+ * Detect whether an attribute of the slot is null, without actually fetching
364
+ * it.
365
+ */
366
+ static inline bool
367
+ slot_attisnull(TupleTableSlot *slot, int attnum)
368
+ {
369
+ AssertArg(attnum > 0);
370
+
371
+ if (attnum > slot->tts_nvalid)
372
+ slot_getsomeattrs(slot, attnum);
373
+
374
+ return slot->tts_isnull[attnum - 1];
375
+ }
376
+
377
+ /*
378
+ * slot_getattr - fetch one attribute of the slot's contents.
379
+ */
380
+ static inline Datum
381
+ slot_getattr(TupleTableSlot *slot, int attnum,
382
+ bool *isnull)
383
+ {
384
+ AssertArg(attnum > 0);
385
+
386
+ if (attnum > slot->tts_nvalid)
387
+ slot_getsomeattrs(slot, attnum);
388
+
389
+ *isnull = slot->tts_isnull[attnum - 1];
390
+
391
+ return slot->tts_values[attnum - 1];
392
+ }
393
+
394
+ /*
395
+ * slot_getsysattr - fetch a system attribute of the slot's current tuple.
396
+ *
397
+ * If the slot type does not contain system attributes, this will throw an
398
+ * error. Hence before calling this function, callers should make sure that
399
+ * the slot type is the one that supports system attributes.
400
+ */
401
+ static inline Datum
402
+ slot_getsysattr(TupleTableSlot *slot, int attnum, bool *isnull)
403
+ {
404
+ AssertArg(attnum < 0); /* caller error */
405
+
406
+ if (attnum == TableOidAttributeNumber)
407
+ {
408
+ *isnull = false;
409
+ return ObjectIdGetDatum(slot->tts_tableOid);
410
+ }
411
+ else if (attnum == SelfItemPointerAttributeNumber)
412
+ {
413
+ *isnull = false;
414
+ return PointerGetDatum(&slot->tts_tid);
415
+ }
416
+
417
+ /* Fetch the system attribute from the underlying tuple. */
418
+ return slot->tts_ops->getsysattr(slot, attnum, isnull);
419
+ }
420
+
421
+ /*
422
+ * ExecClearTuple - clear the slot's contents
423
+ */
424
+ static inline TupleTableSlot *
425
+ ExecClearTuple(TupleTableSlot *slot)
426
+ {
427
+ slot->tts_ops->clear(slot);
428
+
429
+ return slot;
430
+ }
431
+
432
+ /* ExecMaterializeSlot - force a slot into the "materialized" state.
433
+ *
434
+ * This causes the slot's tuple to be a local copy not dependent on any
435
+ * external storage (i.e. pointing into a Buffer, or having allocations in
436
+ * another memory context).
437
+ *
438
+ * A typical use for this operation is to prepare a computed tuple for being
439
+ * stored on disk. The original data may or may not be virtual, but in any
440
+ * case we need a private copy for heap_insert to scribble on.
441
+ */
442
+ static inline void
443
+ ExecMaterializeSlot(TupleTableSlot *slot)
444
+ {
445
+ slot->tts_ops->materialize(slot);
446
+ }
447
+
448
+ /*
449
+ * ExecCopySlotHeapTuple - return HeapTuple allocated in caller's context
450
+ */
451
+ static inline HeapTuple
452
+ ExecCopySlotHeapTuple(TupleTableSlot *slot)
453
+ {
454
+ Assert(!TTS_EMPTY(slot));
455
+
456
+ return slot->tts_ops->copy_heap_tuple(slot);
457
+ }
458
+
459
+ /*
460
+ * ExecCopySlotMinimalTuple - return MinimalTuple allocated in caller's context
461
+ */
462
+ static inline MinimalTuple
463
+ ExecCopySlotMinimalTuple(TupleTableSlot *slot)
464
+ {
465
+ return slot->tts_ops->copy_minimal_tuple(slot);
466
+ }
467
+
468
+ /*
469
+ * ExecCopySlot - copy one slot's contents into another.
470
+ *
471
+ * If a source's system attributes are supposed to be accessed in the target
472
+ * slot, the target slot and source slot types need to match.
473
+ */
474
+ static inline TupleTableSlot *
475
+ ExecCopySlot(TupleTableSlot *dstslot, TupleTableSlot *srcslot)
476
+ {
477
+ Assert(!TTS_EMPTY(srcslot));
478
+ AssertArg(srcslot != dstslot);
479
+
480
+ dstslot->tts_ops->copyslot(dstslot, srcslot);
481
+
482
+ return dstslot;
483
+ }
484
+
485
+ #endif /* FRONTEND */
486
+
487
+ #endif /* TUPTABLE_H */