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,570 @@
1
+ /*--------------------------------------------------------------------
2
+ * Symbols referenced in this file:
3
+ * - FunctionCall5Coll
4
+ *--------------------------------------------------------------------
5
+ */
6
+
7
+ /*-------------------------------------------------------------------------
8
+ *
9
+ * fmgr.c
10
+ * The Postgres function manager.
11
+ *
12
+ * Portions Copyright (c) 1996-2020, PostgreSQL Global Development Group
13
+ * Portions Copyright (c) 1994, Regents of the University of California
14
+ *
15
+ *
16
+ * IDENTIFICATION
17
+ * src/backend/utils/fmgr/fmgr.c
18
+ *
19
+ *-------------------------------------------------------------------------
20
+ */
21
+
22
+ #include "postgres.h"
23
+
24
+ #include "access/detoast.h"
25
+ #include "catalog/pg_language.h"
26
+ #include "catalog/pg_proc.h"
27
+ #include "catalog/pg_type.h"
28
+ #include "executor/functions.h"
29
+ #include "lib/stringinfo.h"
30
+ #include "miscadmin.h"
31
+ #include "nodes/makefuncs.h"
32
+ #include "nodes/nodeFuncs.h"
33
+ #include "pgstat.h"
34
+ #include "utils/acl.h"
35
+ #include "utils/builtins.h"
36
+ #include "utils/fmgrtab.h"
37
+ #include "utils/guc.h"
38
+ #include "utils/lsyscache.h"
39
+ #include "utils/syscache.h"
40
+
41
+ /*
42
+ * Hooks for function calls
43
+ */
44
+ PGDLLIMPORT
45
+
46
+ PGDLLIMPORT
47
+
48
+
49
+ /*
50
+ * Hashtable for fast lookup of external C functions
51
+ */
52
+ typedef struct
53
+ {
54
+ /* fn_oid is the hash key and so must be first! */
55
+ Oid fn_oid; /* OID of an external C function */
56
+ TransactionId fn_xmin; /* for checking up-to-dateness */
57
+ ItemPointerData fn_tid;
58
+ PGFunction user_fn; /* the function's address */
59
+ const Pg_finfo_record *inforec; /* address of its info record */
60
+ } CFuncHashTabEntry;
61
+
62
+
63
+
64
+
65
+ static void fmgr_info_cxt_security(Oid functionId, FmgrInfo *finfo, MemoryContext mcxt,
66
+ bool ignore_security);
67
+ static void fmgr_info_C_lang(Oid functionId, FmgrInfo *finfo, HeapTuple procedureTuple);
68
+ static void fmgr_info_other_lang(Oid functionId, FmgrInfo *finfo, HeapTuple procedureTuple);
69
+ static CFuncHashTabEntry *lookup_C_func(HeapTuple procedureTuple);
70
+ static void record_C_func(HeapTuple procedureTuple,
71
+ PGFunction user_fn, const Pg_finfo_record *inforec);
72
+
73
+ /* extern so it's callable via JIT */
74
+ extern Datum fmgr_security_definer(PG_FUNCTION_ARGS);
75
+
76
+
77
+ /*
78
+ * Lookup routines for builtin-function table. We can search by either Oid
79
+ * or name, but search by Oid is much faster.
80
+ */
81
+
82
+
83
+
84
+ /*
85
+ * Lookup a builtin by name. Note there can be more than one entry in
86
+ * the array with the same name, but they should all point to the same
87
+ * routine.
88
+ */
89
+
90
+
91
+ /*
92
+ * This routine fills a FmgrInfo struct, given the OID
93
+ * of the function to be called.
94
+ *
95
+ * The caller's CurrentMemoryContext is used as the fn_mcxt of the info
96
+ * struct; this means that any subsidiary data attached to the info struct
97
+ * (either by fmgr_info itself, or later on by a function call handler)
98
+ * will be allocated in that context. The caller must ensure that this
99
+ * context is at least as long-lived as the info struct itself. This is
100
+ * not a problem in typical cases where the info struct is on the stack or
101
+ * in freshly-palloc'd space. However, if one intends to store an info
102
+ * struct in a long-lived table, it's better to use fmgr_info_cxt.
103
+ */
104
+
105
+
106
+ /*
107
+ * Fill a FmgrInfo struct, specifying a memory context in which its
108
+ * subsidiary data should go.
109
+ */
110
+
111
+
112
+ /*
113
+ * This one does the actual work. ignore_security is ordinarily false
114
+ * but is set to true when we need to avoid recursion.
115
+ */
116
+
117
+
118
+ /*
119
+ * Return module and C function name providing implementation of functionId.
120
+ *
121
+ * If *mod == NULL and *fn == NULL, no C symbol is known to implement
122
+ * function.
123
+ *
124
+ * If *mod == NULL and *fn != NULL, the function is implemented by a symbol in
125
+ * the main binary.
126
+ *
127
+ * If *mod != NULL and *fn !=NULL the function is implemented in an extension
128
+ * shared object.
129
+ *
130
+ * The returned module and function names are pstrdup'ed into the current
131
+ * memory context.
132
+ */
133
+
134
+
135
+
136
+ /*
137
+ * Special fmgr_info processing for C-language functions. Note that
138
+ * finfo->fn_oid is not valid yet.
139
+ */
140
+
141
+
142
+ /*
143
+ * Special fmgr_info processing for other-language functions. Note
144
+ * that finfo->fn_oid is not valid yet.
145
+ */
146
+
147
+
148
+ /*
149
+ * Fetch and validate the information record for the given external function.
150
+ * The function is specified by a handle for the containing library
151
+ * (obtained from load_external_function) as well as the function name.
152
+ *
153
+ * If no info function exists for the given name an error is raised.
154
+ *
155
+ * This function is broken out of fmgr_info_C_lang so that fmgr_c_validator
156
+ * can validate the information record for a function not yet entered into
157
+ * pg_proc.
158
+ */
159
+
160
+
161
+
162
+ /*-------------------------------------------------------------------------
163
+ * Routines for caching lookup information for external C functions.
164
+ *
165
+ * The routines in dfmgr.c are relatively slow, so we try to avoid running
166
+ * them more than once per external function per session. We use a hash table
167
+ * with the function OID as the lookup key.
168
+ *-------------------------------------------------------------------------
169
+ */
170
+
171
+ /*
172
+ * lookup_C_func: try to find a C function in the hash table
173
+ *
174
+ * If an entry exists and is up to date, return it; else return NULL
175
+ */
176
+
177
+
178
+ /*
179
+ * record_C_func: enter (or update) info about a C function in the hash table
180
+ */
181
+
182
+
183
+ /*
184
+ * clear_external_function_hash: remove entries for a library being closed
185
+ *
186
+ * Presently we just zap the entire hash table, but later it might be worth
187
+ * the effort to remove only the entries associated with the given handle.
188
+ */
189
+
190
+
191
+
192
+ /*
193
+ * Copy an FmgrInfo struct
194
+ *
195
+ * This is inherently somewhat bogus since we can't reliably duplicate
196
+ * language-dependent subsidiary info. We cheat by zeroing fn_extra,
197
+ * instead, meaning that subsidiary info will have to be recomputed.
198
+ */
199
+
200
+
201
+
202
+ /*
203
+ * Specialized lookup routine for fmgr_internal_validator: given the alleged
204
+ * name of an internal function, return the OID of the function.
205
+ * If the name is not recognized, return InvalidOid.
206
+ */
207
+
208
+
209
+
210
+ /*
211
+ * Support for security-definer and proconfig-using functions. We support
212
+ * both of these features using the same call handler, because they are
213
+ * often used together and it would be inefficient (as well as notationally
214
+ * messy) to have two levels of call handler involved.
215
+ */
216
+ struct fmgr_security_definer_cache
217
+ {
218
+ FmgrInfo flinfo; /* lookup info for target function */
219
+ Oid userid; /* userid to set, or InvalidOid */
220
+ ArrayType *proconfig; /* GUC values to set, or NULL */
221
+ Datum arg; /* passthrough argument for plugin modules */
222
+ };
223
+
224
+ /*
225
+ * Function handler for security-definer/proconfig/plugin-hooked functions.
226
+ * We extract the OID of the actual function and do a fmgr lookup again.
227
+ * Then we fetch the pg_proc row and copy the owner ID and proconfig fields.
228
+ * (All this info is cached for the duration of the current query.)
229
+ * To execute a call, we temporarily replace the flinfo with the cached
230
+ * and looked-up one, while keeping the outer fcinfo (which contains all
231
+ * the actual arguments, etc.) intact. This is not re-entrant, but then
232
+ * the fcinfo itself can't be used reentrantly anyway.
233
+ */
234
+
235
+
236
+
237
+ /*-------------------------------------------------------------------------
238
+ * Support routines for callers of fmgr-compatible functions
239
+ *-------------------------------------------------------------------------
240
+ */
241
+
242
+ /*
243
+ * These are for invocation of a specifically named function with a
244
+ * directly-computed parameter list. Note that neither arguments nor result
245
+ * are allowed to be NULL. Also, the function cannot be one that needs to
246
+ * look at FmgrInfo, since there won't be any.
247
+ */
248
+
249
+
250
+
251
+
252
+
253
+
254
+
255
+
256
+
257
+
258
+
259
+
260
+
261
+
262
+
263
+
264
+
265
+
266
+ /*
267
+ * These functions work like the DirectFunctionCall functions except that
268
+ * they use the flinfo parameter to initialise the fcinfo for the call.
269
+ * It's recommended that the callee only use the fn_extra and fn_mcxt
270
+ * fields, as other fields will typically describe the calling function
271
+ * not the callee. Conversely, the calling function should not have
272
+ * used fn_extra, unless its use is known to be compatible with the callee's.
273
+ */
274
+
275
+
276
+
277
+
278
+
279
+ /*
280
+ * These are for invocation of a previously-looked-up function with a
281
+ * directly-computed parameter list. Note that neither arguments nor result
282
+ * are allowed to be NULL.
283
+ */
284
+
285
+
286
+
287
+
288
+
289
+
290
+
291
+
292
+
293
+
294
+ Datum
295
+ FunctionCall5Coll(FmgrInfo *flinfo, Oid collation, Datum arg1, Datum arg2,
296
+ Datum arg3, Datum arg4, Datum arg5)
297
+ {
298
+ LOCAL_FCINFO(fcinfo, 5);
299
+ Datum result;
300
+
301
+ InitFunctionCallInfoData(*fcinfo, flinfo, 5, collation, NULL, NULL);
302
+
303
+ fcinfo->args[0].value = arg1;
304
+ fcinfo->args[0].isnull = false;
305
+ fcinfo->args[1].value = arg2;
306
+ fcinfo->args[1].isnull = false;
307
+ fcinfo->args[2].value = arg3;
308
+ fcinfo->args[2].isnull = false;
309
+ fcinfo->args[3].value = arg4;
310
+ fcinfo->args[3].isnull = false;
311
+ fcinfo->args[4].value = arg5;
312
+ fcinfo->args[4].isnull = false;
313
+
314
+ result = FunctionCallInvoke(fcinfo);
315
+
316
+ /* Check for null result, since caller is clearly not expecting one */
317
+ if (fcinfo->isnull)
318
+ elog(ERROR, "function %u returned NULL", flinfo->fn_oid);
319
+
320
+ return result;
321
+ }
322
+
323
+
324
+
325
+
326
+
327
+
328
+
329
+
330
+
331
+
332
+ /*
333
+ * These are for invocation of a function identified by OID with a
334
+ * directly-computed parameter list. Note that neither arguments nor result
335
+ * are allowed to be NULL. These are essentially fmgr_info() followed
336
+ * by FunctionCallN(). If the same function is to be invoked repeatedly,
337
+ * do the fmgr_info() once and then use FunctionCallN().
338
+ */
339
+
340
+
341
+
342
+
343
+
344
+
345
+
346
+
347
+
348
+
349
+
350
+
351
+
352
+
353
+
354
+
355
+
356
+
357
+
358
+
359
+
360
+ /*
361
+ * Special cases for convenient invocation of datatype I/O functions.
362
+ */
363
+
364
+ /*
365
+ * Call a previously-looked-up datatype input function.
366
+ *
367
+ * "str" may be NULL to indicate we are reading a NULL. In this case
368
+ * the caller should assume the result is NULL, but we'll call the input
369
+ * function anyway if it's not strict. So this is almost but not quite
370
+ * the same as FunctionCall3.
371
+ */
372
+
373
+
374
+ /*
375
+ * Call a previously-looked-up datatype output function.
376
+ *
377
+ * Do not call this on NULL datums.
378
+ *
379
+ * This is currently little more than window dressing for FunctionCall1.
380
+ */
381
+
382
+
383
+ /*
384
+ * Call a previously-looked-up datatype binary-input function.
385
+ *
386
+ * "buf" may be NULL to indicate we are reading a NULL. In this case
387
+ * the caller should assume the result is NULL, but we'll call the receive
388
+ * function anyway if it's not strict. So this is almost but not quite
389
+ * the same as FunctionCall3.
390
+ */
391
+
392
+
393
+ /*
394
+ * Call a previously-looked-up datatype binary-output function.
395
+ *
396
+ * Do not call this on NULL datums.
397
+ *
398
+ * This is little more than window dressing for FunctionCall1, but it does
399
+ * guarantee a non-toasted result, which strictly speaking the underlying
400
+ * function doesn't.
401
+ */
402
+
403
+
404
+ /*
405
+ * As above, for I/O functions identified by OID. These are only to be used
406
+ * in seldom-executed code paths. They are not only slow but leak memory.
407
+ */
408
+
409
+
410
+
411
+
412
+
413
+
414
+
415
+
416
+
417
+ /*-------------------------------------------------------------------------
418
+ * Support routines for standard maybe-pass-by-reference datatypes
419
+ *
420
+ * int8 and float8 can be passed by value if Datum is wide enough.
421
+ * (For backwards-compatibility reasons, we allow pass-by-ref to be chosen
422
+ * at compile time even if pass-by-val is possible.)
423
+ *
424
+ * Note: there is only one switch controlling the pass-by-value option for
425
+ * both int8 and float8; this is to avoid making things unduly complicated
426
+ * for the timestamp types, which might have either representation.
427
+ *-------------------------------------------------------------------------
428
+ */
429
+
430
+ #ifndef USE_FLOAT8_BYVAL /* controls int8 too */
431
+
432
+ Datum
433
+ Int64GetDatum(int64 X)
434
+ {
435
+ int64 *retval = (int64 *) palloc(sizeof(int64));
436
+
437
+ *retval = X;
438
+ return PointerGetDatum(retval);
439
+ }
440
+
441
+ Datum
442
+ Float8GetDatum(float8 X)
443
+ {
444
+ float8 *retval = (float8 *) palloc(sizeof(float8));
445
+
446
+ *retval = X;
447
+ return PointerGetDatum(retval);
448
+ }
449
+ #endif /* USE_FLOAT8_BYVAL */
450
+
451
+
452
+ /*-------------------------------------------------------------------------
453
+ * Support routines for toastable datatypes
454
+ *-------------------------------------------------------------------------
455
+ */
456
+
457
+
458
+
459
+
460
+
461
+
462
+
463
+
464
+
465
+ /*-------------------------------------------------------------------------
466
+ * Support routines for extracting info from fn_expr parse tree
467
+ *
468
+ * These are needed by polymorphic functions, which accept multiple possible
469
+ * input types and need help from the parser to know what they've got.
470
+ * Also, some functions might be interested in whether a parameter is constant.
471
+ * Functions taking VARIADIC ANY also need to know about the VARIADIC keyword.
472
+ *-------------------------------------------------------------------------
473
+ */
474
+
475
+ /*
476
+ * Get the actual type OID of the function return type
477
+ *
478
+ * Returns InvalidOid if information is not available
479
+ */
480
+
481
+
482
+ /*
483
+ * Get the actual type OID of a specific function argument (counting from 0)
484
+ *
485
+ * Returns InvalidOid if information is not available
486
+ */
487
+
488
+
489
+ /*
490
+ * Get the actual type OID of a specific function argument (counting from 0),
491
+ * but working from the calling expression tree instead of FmgrInfo
492
+ *
493
+ * Returns InvalidOid if information is not available
494
+ */
495
+
496
+
497
+ /*
498
+ * Find out whether a specific function argument is constant for the
499
+ * duration of a query
500
+ *
501
+ * Returns false if information is not available
502
+ */
503
+
504
+
505
+ /*
506
+ * Find out whether a specific function argument is constant for the
507
+ * duration of a query, but working from the calling expression tree
508
+ *
509
+ * Returns false if information is not available
510
+ */
511
+
512
+
513
+ /*
514
+ * Get the VARIADIC flag from the function invocation
515
+ *
516
+ * Returns false (the default assumption) if information is not available
517
+ *
518
+ * Note this is generally only of interest to VARIADIC ANY functions
519
+ */
520
+
521
+
522
+ /*
523
+ * Set options to FmgrInfo of opclass support function.
524
+ *
525
+ * Opclass support functions are called outside of expressions. Thanks to that
526
+ * we can use fn_expr to store opclass options as bytea constant.
527
+ */
528
+
529
+
530
+ /*
531
+ * Check if options are defined for opclass support function.
532
+ */
533
+
534
+
535
+ /*
536
+ * Get options for opclass support function.
537
+ */
538
+
539
+
540
+ /*-------------------------------------------------------------------------
541
+ * Support routines for procedural language implementations
542
+ *-------------------------------------------------------------------------
543
+ */
544
+
545
+ /*
546
+ * Verify that a validator is actually associated with the language of a
547
+ * particular function and that the user has access to both the language and
548
+ * the function. All validators should call this before doing anything
549
+ * substantial. Doing so ensures a user cannot achieve anything with explicit
550
+ * calls to validators that he could not achieve with CREATE FUNCTION or by
551
+ * simply calling an existing function.
552
+ *
553
+ * When this function returns false, callers should skip all validation work
554
+ * and call PG_RETURN_VOID(). This never happens at present; it is reserved
555
+ * for future expansion.
556
+ *
557
+ * In particular, checking that the validator corresponds to the function's
558
+ * language allows untrusted language validators to assume they process only
559
+ * superuser-chosen source code. (Untrusted language call handlers, by
560
+ * definition, do assume that.) A user lacking the USAGE language privilege
561
+ * would be unable to reach the validator through CREATE FUNCTION, so we check
562
+ * that to block explicit calls as well. Checking the EXECUTE privilege on
563
+ * the function is often superfluous, because most users can clone the
564
+ * function to get an executable copy. It is meaningful against users with no
565
+ * database TEMP right and no permanent schema CREATE right, thereby unable to
566
+ * create any function. Also, if the function tracks persistent state by
567
+ * function OID or name, validating the original function might permit more
568
+ * mischief than creating and validating a clone thereof.
569
+ */
570
+