gitlab-pg_query 1.3.1 → 2.0.4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (480) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +217 -99
  3. data/README.md +92 -69
  4. data/Rakefile +85 -5
  5. data/ext/pg_query/extconf.rb +3 -40
  6. data/ext/pg_query/guc-file.c +0 -0
  7. data/ext/pg_query/include/access/amapi.h +246 -0
  8. data/ext/pg_query/include/access/attmap.h +52 -0
  9. data/ext/pg_query/include/access/attnum.h +64 -0
  10. data/ext/pg_query/include/access/clog.h +61 -0
  11. data/ext/pg_query/include/access/commit_ts.h +77 -0
  12. data/ext/pg_query/include/access/detoast.h +92 -0
  13. data/ext/pg_query/include/access/genam.h +228 -0
  14. data/ext/pg_query/include/access/gin.h +78 -0
  15. data/ext/pg_query/include/access/htup.h +89 -0
  16. data/ext/pg_query/include/access/htup_details.h +819 -0
  17. data/ext/pg_query/include/access/itup.h +161 -0
  18. data/ext/pg_query/include/access/parallel.h +82 -0
  19. data/ext/pg_query/include/access/printtup.h +35 -0
  20. data/ext/pg_query/include/access/relation.h +28 -0
  21. data/ext/pg_query/include/access/relscan.h +176 -0
  22. data/ext/pg_query/include/access/rmgr.h +35 -0
  23. data/ext/pg_query/include/access/rmgrlist.h +49 -0
  24. data/ext/pg_query/include/access/sdir.h +58 -0
  25. data/ext/pg_query/include/access/skey.h +151 -0
  26. data/ext/pg_query/include/access/stratnum.h +83 -0
  27. data/ext/pg_query/include/access/sysattr.h +29 -0
  28. data/ext/pg_query/include/access/table.h +27 -0
  29. data/ext/pg_query/include/access/tableam.h +1825 -0
  30. data/ext/pg_query/include/access/transam.h +265 -0
  31. data/ext/pg_query/include/access/tupconvert.h +51 -0
  32. data/ext/pg_query/include/access/tupdesc.h +154 -0
  33. data/ext/pg_query/include/access/tupmacs.h +247 -0
  34. data/ext/pg_query/include/access/twophase.h +61 -0
  35. data/ext/pg_query/include/access/xact.h +463 -0
  36. data/ext/pg_query/include/access/xlog.h +398 -0
  37. data/ext/pg_query/include/access/xlog_internal.h +330 -0
  38. data/ext/pg_query/include/access/xlogdefs.h +109 -0
  39. data/ext/pg_query/include/access/xloginsert.h +64 -0
  40. data/ext/pg_query/include/access/xlogreader.h +327 -0
  41. data/ext/pg_query/include/access/xlogrecord.h +227 -0
  42. data/ext/pg_query/include/bootstrap/bootstrap.h +62 -0
  43. data/ext/pg_query/include/c.h +1322 -0
  44. data/ext/pg_query/include/catalog/catalog.h +42 -0
  45. data/ext/pg_query/include/catalog/catversion.h +58 -0
  46. data/ext/pg_query/include/catalog/dependency.h +275 -0
  47. data/ext/pg_query/include/catalog/genbki.h +64 -0
  48. data/ext/pg_query/include/catalog/index.h +199 -0
  49. data/ext/pg_query/include/catalog/indexing.h +366 -0
  50. data/ext/pg_query/include/catalog/namespace.h +188 -0
  51. data/ext/pg_query/include/catalog/objectaccess.h +197 -0
  52. data/ext/pg_query/include/catalog/objectaddress.h +84 -0
  53. data/ext/pg_query/include/catalog/pg_aggregate.h +176 -0
  54. data/ext/pg_query/include/catalog/pg_aggregate_d.h +77 -0
  55. data/ext/pg_query/include/catalog/pg_am.h +60 -0
  56. data/ext/pg_query/include/catalog/pg_am_d.h +45 -0
  57. data/ext/pg_query/include/catalog/pg_attribute.h +204 -0
  58. data/ext/pg_query/include/catalog/pg_attribute_d.h +59 -0
  59. data/ext/pg_query/include/catalog/pg_authid.h +58 -0
  60. data/ext/pg_query/include/catalog/pg_authid_d.h +49 -0
  61. data/ext/pg_query/include/catalog/pg_class.h +200 -0
  62. data/ext/pg_query/include/catalog/pg_class_d.h +103 -0
  63. data/ext/pg_query/include/catalog/pg_collation.h +73 -0
  64. data/ext/pg_query/include/catalog/pg_collation_d.h +45 -0
  65. data/ext/pg_query/include/catalog/pg_constraint.h +247 -0
  66. data/ext/pg_query/include/catalog/pg_constraint_d.h +67 -0
  67. data/ext/pg_query/include/catalog/pg_control.h +250 -0
  68. data/ext/pg_query/include/catalog/pg_conversion.h +72 -0
  69. data/ext/pg_query/include/catalog/pg_conversion_d.h +35 -0
  70. data/ext/pg_query/include/catalog/pg_depend.h +73 -0
  71. data/ext/pg_query/include/catalog/pg_depend_d.h +34 -0
  72. data/ext/pg_query/include/catalog/pg_event_trigger.h +51 -0
  73. data/ext/pg_query/include/catalog/pg_event_trigger_d.h +34 -0
  74. data/ext/pg_query/include/catalog/pg_index.h +80 -0
  75. data/ext/pg_query/include/catalog/pg_index_d.h +56 -0
  76. data/ext/pg_query/include/catalog/pg_language.h +67 -0
  77. data/ext/pg_query/include/catalog/pg_language_d.h +39 -0
  78. data/ext/pg_query/include/catalog/pg_namespace.h +59 -0
  79. data/ext/pg_query/include/catalog/pg_namespace_d.h +34 -0
  80. data/ext/pg_query/include/catalog/pg_opclass.h +85 -0
  81. data/ext/pg_query/include/catalog/pg_opclass_d.h +49 -0
  82. data/ext/pg_query/include/catalog/pg_operator.h +102 -0
  83. data/ext/pg_query/include/catalog/pg_operator_d.h +106 -0
  84. data/ext/pg_query/include/catalog/pg_opfamily.h +60 -0
  85. data/ext/pg_query/include/catalog/pg_opfamily_d.h +47 -0
  86. data/ext/pg_query/include/catalog/pg_partitioned_table.h +63 -0
  87. data/ext/pg_query/include/catalog/pg_partitioned_table_d.h +35 -0
  88. data/ext/pg_query/include/catalog/pg_proc.h +211 -0
  89. data/ext/pg_query/include/catalog/pg_proc_d.h +99 -0
  90. data/ext/pg_query/include/catalog/pg_publication.h +115 -0
  91. data/ext/pg_query/include/catalog/pg_publication_d.h +36 -0
  92. data/ext/pg_query/include/catalog/pg_replication_origin.h +57 -0
  93. data/ext/pg_query/include/catalog/pg_replication_origin_d.h +29 -0
  94. data/ext/pg_query/include/catalog/pg_statistic.h +275 -0
  95. data/ext/pg_query/include/catalog/pg_statistic_d.h +194 -0
  96. data/ext/pg_query/include/catalog/pg_statistic_ext.h +74 -0
  97. data/ext/pg_query/include/catalog/pg_statistic_ext_d.h +40 -0
  98. data/ext/pg_query/include/catalog/pg_transform.h +45 -0
  99. data/ext/pg_query/include/catalog/pg_transform_d.h +32 -0
  100. data/ext/pg_query/include/catalog/pg_trigger.h +137 -0
  101. data/ext/pg_query/include/catalog/pg_trigger_d.h +106 -0
  102. data/ext/pg_query/include/catalog/pg_ts_config.h +50 -0
  103. data/ext/pg_query/include/catalog/pg_ts_config_d.h +32 -0
  104. data/ext/pg_query/include/catalog/pg_ts_dict.h +54 -0
  105. data/ext/pg_query/include/catalog/pg_ts_dict_d.h +33 -0
  106. data/ext/pg_query/include/catalog/pg_ts_parser.h +57 -0
  107. data/ext/pg_query/include/catalog/pg_ts_parser_d.h +35 -0
  108. data/ext/pg_query/include/catalog/pg_ts_template.h +48 -0
  109. data/ext/pg_query/include/catalog/pg_ts_template_d.h +32 -0
  110. data/ext/pg_query/include/catalog/pg_type.h +372 -0
  111. data/ext/pg_query/include/catalog/pg_type_d.h +285 -0
  112. data/ext/pg_query/include/catalog/storage.h +48 -0
  113. data/ext/pg_query/include/commands/async.h +54 -0
  114. data/ext/pg_query/include/commands/dbcommands.h +35 -0
  115. data/ext/pg_query/include/commands/defrem.h +173 -0
  116. data/ext/pg_query/include/commands/event_trigger.h +88 -0
  117. data/ext/pg_query/include/commands/explain.h +127 -0
  118. data/ext/pg_query/include/commands/prepare.h +61 -0
  119. data/ext/pg_query/include/commands/tablespace.h +67 -0
  120. data/ext/pg_query/include/commands/trigger.h +277 -0
  121. data/ext/pg_query/include/commands/user.h +37 -0
  122. data/ext/pg_query/include/commands/vacuum.h +293 -0
  123. data/ext/pg_query/include/commands/variable.h +38 -0
  124. data/ext/pg_query/include/common/file_perm.h +56 -0
  125. data/ext/pg_query/include/common/hashfn.h +104 -0
  126. data/ext/pg_query/include/common/ip.h +37 -0
  127. data/ext/pg_query/include/common/keywords.h +33 -0
  128. data/ext/pg_query/include/common/kwlookup.h +44 -0
  129. data/ext/pg_query/include/common/relpath.h +90 -0
  130. data/ext/pg_query/include/common/string.h +19 -0
  131. data/ext/pg_query/include/common/unicode_combining_table.h +196 -0
  132. data/ext/pg_query/include/datatype/timestamp.h +197 -0
  133. data/ext/pg_query/include/executor/execdesc.h +70 -0
  134. data/ext/pg_query/include/executor/executor.h +614 -0
  135. data/ext/pg_query/include/executor/functions.h +41 -0
  136. data/ext/pg_query/include/executor/instrument.h +101 -0
  137. data/ext/pg_query/include/executor/spi.h +175 -0
  138. data/ext/pg_query/include/executor/tablefunc.h +67 -0
  139. data/ext/pg_query/include/executor/tuptable.h +487 -0
  140. data/ext/pg_query/include/fmgr.h +775 -0
  141. data/ext/pg_query/include/funcapi.h +348 -0
  142. data/ext/pg_query/include/getaddrinfo.h +162 -0
  143. data/ext/pg_query/include/jit/jit.h +105 -0
  144. data/ext/pg_query/include/kwlist_d.h +1072 -0
  145. data/ext/pg_query/include/lib/ilist.h +727 -0
  146. data/ext/pg_query/include/lib/pairingheap.h +102 -0
  147. data/ext/pg_query/include/lib/simplehash.h +1059 -0
  148. data/ext/pg_query/include/lib/stringinfo.h +161 -0
  149. data/ext/pg_query/include/libpq/auth.h +29 -0
  150. data/ext/pg_query/include/libpq/crypt.h +46 -0
  151. data/ext/pg_query/include/libpq/hba.h +140 -0
  152. data/ext/pg_query/include/libpq/libpq-be.h +326 -0
  153. data/ext/pg_query/include/libpq/libpq.h +133 -0
  154. data/ext/pg_query/include/libpq/pqcomm.h +208 -0
  155. data/ext/pg_query/include/libpq/pqformat.h +210 -0
  156. data/ext/pg_query/include/libpq/pqsignal.h +42 -0
  157. data/ext/pg_query/include/mb/pg_wchar.h +672 -0
  158. data/ext/pg_query/include/mb/stringinfo_mb.h +24 -0
  159. data/ext/pg_query/include/miscadmin.h +476 -0
  160. data/ext/pg_query/include/nodes/bitmapset.h +122 -0
  161. data/ext/pg_query/include/nodes/execnodes.h +2520 -0
  162. data/ext/pg_query/include/nodes/extensible.h +160 -0
  163. data/ext/pg_query/include/nodes/lockoptions.h +61 -0
  164. data/ext/pg_query/include/nodes/makefuncs.h +108 -0
  165. data/ext/pg_query/include/nodes/memnodes.h +108 -0
  166. data/ext/pg_query/include/nodes/nodeFuncs.h +162 -0
  167. data/ext/pg_query/include/nodes/nodes.h +842 -0
  168. data/ext/pg_query/include/nodes/params.h +170 -0
  169. data/ext/pg_query/include/nodes/parsenodes.h +3579 -0
  170. data/ext/pg_query/include/nodes/pathnodes.h +2556 -0
  171. data/ext/pg_query/include/nodes/pg_list.h +605 -0
  172. data/ext/pg_query/include/nodes/plannodes.h +1251 -0
  173. data/ext/pg_query/include/nodes/primnodes.h +1541 -0
  174. data/ext/pg_query/include/nodes/print.h +34 -0
  175. data/ext/pg_query/include/nodes/tidbitmap.h +75 -0
  176. data/ext/pg_query/include/nodes/value.h +61 -0
  177. data/ext/pg_query/include/optimizer/cost.h +206 -0
  178. data/ext/pg_query/include/optimizer/geqo.h +88 -0
  179. data/ext/pg_query/include/optimizer/geqo_gene.h +45 -0
  180. data/ext/pg_query/include/optimizer/optimizer.h +199 -0
  181. data/ext/pg_query/include/optimizer/paths.h +249 -0
  182. data/ext/pg_query/include/optimizer/planmain.h +119 -0
  183. data/ext/pg_query/include/parser/analyze.h +49 -0
  184. data/ext/pg_query/include/parser/gram.h +1067 -0
  185. data/ext/pg_query/include/parser/gramparse.h +75 -0
  186. data/ext/pg_query/include/parser/kwlist.h +477 -0
  187. data/ext/pg_query/include/parser/parse_agg.h +68 -0
  188. data/ext/pg_query/include/parser/parse_clause.h +54 -0
  189. data/ext/pg_query/include/parser/parse_coerce.h +97 -0
  190. data/ext/pg_query/include/parser/parse_collate.h +27 -0
  191. data/ext/pg_query/include/parser/parse_expr.h +26 -0
  192. data/ext/pg_query/include/parser/parse_func.h +73 -0
  193. data/ext/pg_query/include/parser/parse_node.h +327 -0
  194. data/ext/pg_query/include/parser/parse_oper.h +67 -0
  195. data/ext/pg_query/include/parser/parse_relation.h +123 -0
  196. data/ext/pg_query/include/parser/parse_target.h +46 -0
  197. data/ext/pg_query/include/parser/parse_type.h +60 -0
  198. data/ext/pg_query/include/parser/parser.h +41 -0
  199. data/ext/pg_query/include/parser/parsetree.h +61 -0
  200. data/ext/pg_query/include/parser/scanner.h +152 -0
  201. data/ext/pg_query/include/parser/scansup.h +30 -0
  202. data/ext/pg_query/include/partitioning/partdefs.h +26 -0
  203. data/ext/pg_query/include/pg_config.h +989 -0
  204. data/ext/pg_query/include/pg_config_ext.h +8 -0
  205. data/ext/pg_query/include/pg_config_manual.h +350 -0
  206. data/ext/pg_query/include/pg_config_os.h +8 -0
  207. data/ext/pg_query/include/pg_getopt.h +56 -0
  208. data/ext/pg_query/include/pg_query.h +121 -0
  209. data/ext/pg_query/include/pg_query_enum_defs.c +2454 -0
  210. data/ext/pg_query/include/pg_query_fingerprint_conds.c +875 -0
  211. data/ext/pg_query/include/pg_query_fingerprint_defs.c +12413 -0
  212. data/ext/pg_query/include/pg_query_json_helper.c +61 -0
  213. data/ext/pg_query/include/pg_query_outfuncs_conds.c +686 -0
  214. data/ext/pg_query/include/pg_query_outfuncs_defs.c +2437 -0
  215. data/ext/pg_query/include/pg_query_readfuncs_conds.c +222 -0
  216. data/ext/pg_query/include/pg_query_readfuncs_defs.c +2878 -0
  217. data/ext/pg_query/include/pg_trace.h +17 -0
  218. data/ext/pg_query/include/pgstat.h +1487 -0
  219. data/ext/pg_query/include/pgtime.h +84 -0
  220. data/ext/pg_query/include/pl_gram.h +385 -0
  221. data/ext/pg_query/include/pl_reserved_kwlist.h +52 -0
  222. data/ext/pg_query/include/pl_reserved_kwlist_d.h +114 -0
  223. data/ext/pg_query/include/pl_unreserved_kwlist.h +112 -0
  224. data/ext/pg_query/include/pl_unreserved_kwlist_d.h +246 -0
  225. data/ext/pg_query/include/plerrcodes.h +990 -0
  226. data/ext/pg_query/include/plpgsql.h +1347 -0
  227. data/ext/pg_query/include/port.h +524 -0
  228. data/ext/pg_query/include/port/atomics.h +524 -0
  229. data/ext/pg_query/include/port/atomics/arch-arm.h +26 -0
  230. data/ext/pg_query/include/port/atomics/arch-ppc.h +254 -0
  231. data/ext/pg_query/include/port/atomics/arch-x86.h +252 -0
  232. data/ext/pg_query/include/port/atomics/fallback.h +170 -0
  233. data/ext/pg_query/include/port/atomics/generic-gcc.h +286 -0
  234. data/ext/pg_query/include/port/atomics/generic.h +401 -0
  235. data/ext/pg_query/include/port/pg_bitutils.h +226 -0
  236. data/ext/pg_query/include/port/pg_bswap.h +161 -0
  237. data/ext/pg_query/include/port/pg_crc32c.h +101 -0
  238. data/ext/pg_query/include/portability/instr_time.h +256 -0
  239. data/ext/pg_query/include/postgres.h +764 -0
  240. data/ext/pg_query/include/postgres_ext.h +74 -0
  241. data/ext/pg_query/include/postmaster/autovacuum.h +83 -0
  242. data/ext/pg_query/include/postmaster/bgworker.h +161 -0
  243. data/ext/pg_query/include/postmaster/bgworker_internals.h +64 -0
  244. data/ext/pg_query/include/postmaster/bgwriter.h +45 -0
  245. data/ext/pg_query/include/postmaster/fork_process.h +17 -0
  246. data/ext/pg_query/include/postmaster/interrupt.h +32 -0
  247. data/ext/pg_query/include/postmaster/pgarch.h +39 -0
  248. data/ext/pg_query/include/postmaster/postmaster.h +77 -0
  249. data/ext/pg_query/include/postmaster/syslogger.h +98 -0
  250. data/ext/pg_query/include/postmaster/walwriter.h +21 -0
  251. data/ext/pg_query/include/protobuf-c.h +1106 -0
  252. data/ext/pg_query/include/protobuf-c/protobuf-c.h +1106 -0
  253. data/ext/pg_query/include/protobuf/pg_query.pb-c.h +10846 -0
  254. data/ext/pg_query/include/protobuf/pg_query.pb.h +124718 -0
  255. data/ext/pg_query/include/regex/regex.h +184 -0
  256. data/ext/pg_query/include/replication/logicallauncher.h +31 -0
  257. data/ext/pg_query/include/replication/logicalproto.h +110 -0
  258. data/ext/pg_query/include/replication/logicalworker.h +19 -0
  259. data/ext/pg_query/include/replication/origin.h +73 -0
  260. data/ext/pg_query/include/replication/reorderbuffer.h +467 -0
  261. data/ext/pg_query/include/replication/slot.h +219 -0
  262. data/ext/pg_query/include/replication/syncrep.h +115 -0
  263. data/ext/pg_query/include/replication/walreceiver.h +340 -0
  264. data/ext/pg_query/include/replication/walsender.h +74 -0
  265. data/ext/pg_query/include/rewrite/prs2lock.h +46 -0
  266. data/ext/pg_query/include/rewrite/rewriteHandler.h +40 -0
  267. data/ext/pg_query/include/rewrite/rewriteManip.h +87 -0
  268. data/ext/pg_query/include/rewrite/rewriteSupport.h +26 -0
  269. data/ext/pg_query/include/storage/backendid.h +37 -0
  270. data/ext/pg_query/include/storage/block.h +121 -0
  271. data/ext/pg_query/include/storage/buf.h +46 -0
  272. data/ext/pg_query/include/storage/bufmgr.h +292 -0
  273. data/ext/pg_query/include/storage/bufpage.h +459 -0
  274. data/ext/pg_query/include/storage/condition_variable.h +62 -0
  275. data/ext/pg_query/include/storage/dsm.h +61 -0
  276. data/ext/pg_query/include/storage/dsm_impl.h +75 -0
  277. data/ext/pg_query/include/storage/fd.h +168 -0
  278. data/ext/pg_query/include/storage/ipc.h +81 -0
  279. data/ext/pg_query/include/storage/item.h +19 -0
  280. data/ext/pg_query/include/storage/itemid.h +184 -0
  281. data/ext/pg_query/include/storage/itemptr.h +206 -0
  282. data/ext/pg_query/include/storage/large_object.h +100 -0
  283. data/ext/pg_query/include/storage/latch.h +190 -0
  284. data/ext/pg_query/include/storage/lmgr.h +114 -0
  285. data/ext/pg_query/include/storage/lock.h +612 -0
  286. data/ext/pg_query/include/storage/lockdefs.h +59 -0
  287. data/ext/pg_query/include/storage/lwlock.h +232 -0
  288. data/ext/pg_query/include/storage/lwlocknames.h +51 -0
  289. data/ext/pg_query/include/storage/off.h +57 -0
  290. data/ext/pg_query/include/storage/pg_sema.h +61 -0
  291. data/ext/pg_query/include/storage/pg_shmem.h +90 -0
  292. data/ext/pg_query/include/storage/pmsignal.h +94 -0
  293. data/ext/pg_query/include/storage/predicate.h +87 -0
  294. data/ext/pg_query/include/storage/proc.h +333 -0
  295. data/ext/pg_query/include/storage/proclist_types.h +51 -0
  296. data/ext/pg_query/include/storage/procsignal.h +75 -0
  297. data/ext/pg_query/include/storage/relfilenode.h +99 -0
  298. data/ext/pg_query/include/storage/s_lock.h +1047 -0
  299. data/ext/pg_query/include/storage/sharedfileset.h +45 -0
  300. data/ext/pg_query/include/storage/shm_mq.h +85 -0
  301. data/ext/pg_query/include/storage/shm_toc.h +58 -0
  302. data/ext/pg_query/include/storage/shmem.h +81 -0
  303. data/ext/pg_query/include/storage/sinval.h +153 -0
  304. data/ext/pg_query/include/storage/sinvaladt.h +43 -0
  305. data/ext/pg_query/include/storage/smgr.h +109 -0
  306. data/ext/pg_query/include/storage/spin.h +77 -0
  307. data/ext/pg_query/include/storage/standby.h +91 -0
  308. data/ext/pg_query/include/storage/standbydefs.h +74 -0
  309. data/ext/pg_query/include/storage/sync.h +62 -0
  310. data/ext/pg_query/include/tcop/cmdtag.h +58 -0
  311. data/ext/pg_query/include/tcop/cmdtaglist.h +217 -0
  312. data/ext/pg_query/include/tcop/deparse_utility.h +108 -0
  313. data/ext/pg_query/include/tcop/dest.h +149 -0
  314. data/ext/pg_query/include/tcop/fastpath.h +21 -0
  315. data/ext/pg_query/include/tcop/pquery.h +45 -0
  316. data/ext/pg_query/include/tcop/tcopprot.h +89 -0
  317. data/ext/pg_query/include/tcop/utility.h +108 -0
  318. data/ext/pg_query/include/tsearch/ts_cache.h +98 -0
  319. data/ext/pg_query/include/utils/acl.h +312 -0
  320. data/ext/pg_query/include/utils/aclchk_internal.h +45 -0
  321. data/ext/pg_query/include/utils/array.h +458 -0
  322. data/ext/pg_query/include/utils/builtins.h +127 -0
  323. data/ext/pg_query/include/utils/bytea.h +27 -0
  324. data/ext/pg_query/include/utils/catcache.h +231 -0
  325. data/ext/pg_query/include/utils/date.h +90 -0
  326. data/ext/pg_query/include/utils/datetime.h +343 -0
  327. data/ext/pg_query/include/utils/datum.h +68 -0
  328. data/ext/pg_query/include/utils/dsa.h +123 -0
  329. data/ext/pg_query/include/utils/dynahash.h +19 -0
  330. data/ext/pg_query/include/utils/elog.h +439 -0
  331. data/ext/pg_query/include/utils/errcodes.h +352 -0
  332. data/ext/pg_query/include/utils/expandeddatum.h +159 -0
  333. data/ext/pg_query/include/utils/expandedrecord.h +231 -0
  334. data/ext/pg_query/include/utils/float.h +356 -0
  335. data/ext/pg_query/include/utils/fmgroids.h +2657 -0
  336. data/ext/pg_query/include/utils/fmgrprotos.h +2646 -0
  337. data/ext/pg_query/include/utils/fmgrtab.h +48 -0
  338. data/ext/pg_query/include/utils/guc.h +443 -0
  339. data/ext/pg_query/include/utils/guc_tables.h +272 -0
  340. data/ext/pg_query/include/utils/hsearch.h +149 -0
  341. data/ext/pg_query/include/utils/inval.h +64 -0
  342. data/ext/pg_query/include/utils/lsyscache.h +197 -0
  343. data/ext/pg_query/include/utils/memdebug.h +82 -0
  344. data/ext/pg_query/include/utils/memutils.h +225 -0
  345. data/ext/pg_query/include/utils/numeric.h +76 -0
  346. data/ext/pg_query/include/utils/palloc.h +136 -0
  347. data/ext/pg_query/include/utils/partcache.h +102 -0
  348. data/ext/pg_query/include/utils/pg_locale.h +119 -0
  349. data/ext/pg_query/include/utils/pg_lsn.h +29 -0
  350. data/ext/pg_query/include/utils/pidfile.h +56 -0
  351. data/ext/pg_query/include/utils/plancache.h +235 -0
  352. data/ext/pg_query/include/utils/portal.h +241 -0
  353. data/ext/pg_query/include/utils/probes.h +114 -0
  354. data/ext/pg_query/include/utils/ps_status.h +25 -0
  355. data/ext/pg_query/include/utils/queryenvironment.h +74 -0
  356. data/ext/pg_query/include/utils/regproc.h +28 -0
  357. data/ext/pg_query/include/utils/rel.h +644 -0
  358. data/ext/pg_query/include/utils/relcache.h +151 -0
  359. data/ext/pg_query/include/utils/reltrigger.h +81 -0
  360. data/ext/pg_query/include/utils/resowner.h +86 -0
  361. data/ext/pg_query/include/utils/rls.h +50 -0
  362. data/ext/pg_query/include/utils/ruleutils.h +44 -0
  363. data/ext/pg_query/include/utils/sharedtuplestore.h +61 -0
  364. data/ext/pg_query/include/utils/snapmgr.h +158 -0
  365. data/ext/pg_query/include/utils/snapshot.h +206 -0
  366. data/ext/pg_query/include/utils/sortsupport.h +276 -0
  367. data/ext/pg_query/include/utils/syscache.h +219 -0
  368. data/ext/pg_query/include/utils/timeout.h +88 -0
  369. data/ext/pg_query/include/utils/timestamp.h +116 -0
  370. data/ext/pg_query/include/utils/tuplesort.h +277 -0
  371. data/ext/pg_query/include/utils/tuplestore.h +91 -0
  372. data/ext/pg_query/include/utils/typcache.h +202 -0
  373. data/ext/pg_query/include/utils/tzparser.h +39 -0
  374. data/ext/pg_query/include/utils/varlena.h +39 -0
  375. data/ext/pg_query/include/utils/xml.h +84 -0
  376. data/ext/pg_query/include/xxhash.h +5445 -0
  377. data/ext/pg_query/include/xxhash/xxhash.h +5445 -0
  378. data/ext/pg_query/pg_query.c +104 -0
  379. data/ext/pg_query/pg_query.pb-c.c +37628 -0
  380. data/ext/pg_query/pg_query_deparse.c +9959 -0
  381. data/ext/pg_query/pg_query_fingerprint.c +295 -0
  382. data/ext/pg_query/pg_query_fingerprint.h +8 -0
  383. data/ext/pg_query/pg_query_internal.h +24 -0
  384. data/ext/pg_query/pg_query_json_plpgsql.c +738 -0
  385. data/ext/pg_query/pg_query_json_plpgsql.h +9 -0
  386. data/ext/pg_query/pg_query_normalize.c +439 -0
  387. data/ext/pg_query/pg_query_outfuncs.h +10 -0
  388. data/ext/pg_query/pg_query_outfuncs_json.c +297 -0
  389. data/ext/pg_query/pg_query_outfuncs_protobuf.c +237 -0
  390. data/ext/pg_query/pg_query_parse.c +148 -0
  391. data/ext/pg_query/pg_query_parse_plpgsql.c +460 -0
  392. data/ext/pg_query/pg_query_readfuncs.h +11 -0
  393. data/ext/pg_query/pg_query_readfuncs_protobuf.c +142 -0
  394. data/ext/pg_query/pg_query_ruby.c +108 -12
  395. data/ext/pg_query/pg_query_scan.c +173 -0
  396. data/ext/pg_query/pg_query_split.c +221 -0
  397. data/ext/pg_query/protobuf-c.c +3660 -0
  398. data/ext/pg_query/src_backend_catalog_namespace.c +1051 -0
  399. data/ext/pg_query/src_backend_catalog_pg_proc.c +142 -0
  400. data/ext/pg_query/src_backend_commands_define.c +117 -0
  401. data/ext/pg_query/src_backend_libpq_pqcomm.c +651 -0
  402. data/ext/pg_query/src_backend_nodes_bitmapset.c +513 -0
  403. data/ext/pg_query/src_backend_nodes_copyfuncs.c +6013 -0
  404. data/ext/pg_query/src_backend_nodes_equalfuncs.c +4003 -0
  405. data/ext/pg_query/src_backend_nodes_extensible.c +99 -0
  406. data/ext/pg_query/src_backend_nodes_list.c +922 -0
  407. data/ext/pg_query/src_backend_nodes_makefuncs.c +417 -0
  408. data/ext/pg_query/src_backend_nodes_nodeFuncs.c +1363 -0
  409. data/ext/pg_query/src_backend_nodes_value.c +84 -0
  410. data/ext/pg_query/src_backend_parser_gram.c +47456 -0
  411. data/ext/pg_query/src_backend_parser_parse_expr.c +313 -0
  412. data/ext/pg_query/src_backend_parser_parser.c +497 -0
  413. data/ext/pg_query/src_backend_parser_scan.c +7091 -0
  414. data/ext/pg_query/src_backend_parser_scansup.c +160 -0
  415. data/ext/pg_query/src_backend_postmaster_postmaster.c +2230 -0
  416. data/ext/pg_query/src_backend_storage_ipc_ipc.c +192 -0
  417. data/ext/pg_query/src_backend_storage_lmgr_s_lock.c +370 -0
  418. data/ext/pg_query/src_backend_tcop_postgres.c +776 -0
  419. data/ext/pg_query/src_backend_utils_adt_datum.c +326 -0
  420. data/ext/pg_query/src_backend_utils_adt_expandeddatum.c +98 -0
  421. data/ext/pg_query/src_backend_utils_adt_format_type.c +136 -0
  422. data/ext/pg_query/src_backend_utils_adt_ruleutils.c +1683 -0
  423. data/ext/pg_query/src_backend_utils_error_assert.c +74 -0
  424. data/ext/pg_query/src_backend_utils_error_elog.c +1748 -0
  425. data/ext/pg_query/src_backend_utils_fmgr_fmgr.c +570 -0
  426. data/ext/pg_query/src_backend_utils_hash_dynahash.c +1086 -0
  427. data/ext/pg_query/src_backend_utils_init_globals.c +168 -0
  428. data/ext/pg_query/src_backend_utils_mb_mbutils.c +839 -0
  429. data/ext/pg_query/src_backend_utils_misc_guc.c +1831 -0
  430. data/ext/pg_query/src_backend_utils_mmgr_aset.c +1560 -0
  431. data/ext/pg_query/src_backend_utils_mmgr_mcxt.c +1006 -0
  432. data/ext/pg_query/src_common_encnames.c +158 -0
  433. data/ext/pg_query/src_common_keywords.c +39 -0
  434. data/ext/pg_query/src_common_kwlist_d.h +1081 -0
  435. data/ext/pg_query/src_common_kwlookup.c +91 -0
  436. data/ext/pg_query/src_common_psprintf.c +158 -0
  437. data/ext/pg_query/src_common_string.c +86 -0
  438. data/ext/pg_query/src_common_stringinfo.c +336 -0
  439. data/ext/pg_query/src_common_wchar.c +1651 -0
  440. data/ext/pg_query/src_pl_plpgsql_src_pl_comp.c +1133 -0
  441. data/ext/pg_query/src_pl_plpgsql_src_pl_funcs.c +877 -0
  442. data/ext/pg_query/src_pl_plpgsql_src_pl_gram.c +6533 -0
  443. data/ext/pg_query/src_pl_plpgsql_src_pl_handler.c +107 -0
  444. data/ext/pg_query/src_pl_plpgsql_src_pl_reserved_kwlist_d.h +123 -0
  445. data/ext/pg_query/src_pl_plpgsql_src_pl_scanner.c +671 -0
  446. data/ext/pg_query/src_pl_plpgsql_src_pl_unreserved_kwlist_d.h +255 -0
  447. data/ext/pg_query/src_port_erand48.c +127 -0
  448. data/ext/pg_query/src_port_pg_bitutils.c +246 -0
  449. data/ext/pg_query/src_port_pgsleep.c +69 -0
  450. data/ext/pg_query/src_port_pgstrcasecmp.c +83 -0
  451. data/ext/pg_query/src_port_qsort.c +240 -0
  452. data/ext/pg_query/src_port_random.c +31 -0
  453. data/ext/pg_query/src_port_snprintf.c +1449 -0
  454. data/ext/pg_query/src_port_strerror.c +324 -0
  455. data/ext/pg_query/src_port_strnlen.c +39 -0
  456. data/ext/pg_query/xxhash.c +43 -0
  457. data/lib/pg_query.rb +7 -4
  458. data/lib/pg_query/constants.rb +21 -0
  459. data/lib/pg_query/deparse.rb +15 -1581
  460. data/lib/pg_query/filter_columns.rb +88 -85
  461. data/lib/pg_query/fingerprint.rb +122 -87
  462. data/lib/pg_query/json_field_names.rb +1402 -0
  463. data/lib/pg_query/node.rb +31 -0
  464. data/lib/pg_query/param_refs.rb +42 -37
  465. data/lib/pg_query/parse.rb +220 -203
  466. data/lib/pg_query/parse_error.rb +1 -1
  467. data/lib/pg_query/pg_query_pb.rb +3211 -0
  468. data/lib/pg_query/scan.rb +23 -0
  469. data/lib/pg_query/treewalker.rb +24 -40
  470. data/lib/pg_query/truncate.rb +71 -42
  471. data/lib/pg_query/version.rb +2 -2
  472. metadata +472 -11
  473. data/ext/pg_query/pg_query_ruby.h +0 -10
  474. data/lib/pg_query/deep_dup.rb +0 -16
  475. data/lib/pg_query/deparse/alter_table.rb +0 -42
  476. data/lib/pg_query/deparse/interval.rb +0 -105
  477. data/lib/pg_query/deparse/keywords.rb +0 -159
  478. data/lib/pg_query/deparse/rename.rb +0 -41
  479. data/lib/pg_query/legacy_parsetree.rb +0 -109
  480. data/lib/pg_query/node_types.rb +0 -296
@@ -0,0 +1,1683 @@
1
+ /*--------------------------------------------------------------------
2
+ * Symbols referenced in this file:
3
+ * - quote_identifier
4
+ * - quote_all_identifiers
5
+ *--------------------------------------------------------------------
6
+ */
7
+
8
+ /*-------------------------------------------------------------------------
9
+ *
10
+ * ruleutils.c
11
+ * Functions to convert stored expressions/querytrees back to
12
+ * source text
13
+ *
14
+ * Portions Copyright (c) 1996-2020, PostgreSQL Global Development Group
15
+ * Portions Copyright (c) 1994, Regents of the University of California
16
+ *
17
+ *
18
+ * IDENTIFICATION
19
+ * src/backend/utils/adt/ruleutils.c
20
+ *
21
+ *-------------------------------------------------------------------------
22
+ */
23
+ #include "postgres.h"
24
+
25
+ #include <ctype.h>
26
+ #include <unistd.h>
27
+ #include <fcntl.h>
28
+
29
+ #include "access/amapi.h"
30
+ #include "access/htup_details.h"
31
+ #include "access/relation.h"
32
+ #include "access/sysattr.h"
33
+ #include "access/table.h"
34
+ #include "catalog/dependency.h"
35
+ #include "catalog/indexing.h"
36
+ #include "catalog/pg_aggregate.h"
37
+ #include "catalog/pg_am.h"
38
+ #include "catalog/pg_authid.h"
39
+ #include "catalog/pg_collation.h"
40
+ #include "catalog/pg_constraint.h"
41
+ #include "catalog/pg_depend.h"
42
+ #include "catalog/pg_language.h"
43
+ #include "catalog/pg_opclass.h"
44
+ #include "catalog/pg_operator.h"
45
+ #include "catalog/pg_partitioned_table.h"
46
+ #include "catalog/pg_proc.h"
47
+ #include "catalog/pg_statistic_ext.h"
48
+ #include "catalog/pg_trigger.h"
49
+ #include "catalog/pg_type.h"
50
+ #include "commands/defrem.h"
51
+ #include "commands/tablespace.h"
52
+ #include "common/keywords.h"
53
+ #include "executor/spi.h"
54
+ #include "funcapi.h"
55
+ #include "mb/pg_wchar.h"
56
+ #include "miscadmin.h"
57
+ #include "nodes/makefuncs.h"
58
+ #include "nodes/nodeFuncs.h"
59
+ #include "nodes/pathnodes.h"
60
+ #include "optimizer/optimizer.h"
61
+ #include "parser/parse_agg.h"
62
+ #include "parser/parse_func.h"
63
+ #include "parser/parse_node.h"
64
+ #include "parser/parse_oper.h"
65
+ #include "parser/parser.h"
66
+ #include "parser/parsetree.h"
67
+ #include "rewrite/rewriteHandler.h"
68
+ #include "rewrite/rewriteManip.h"
69
+ #include "rewrite/rewriteSupport.h"
70
+ #include "utils/array.h"
71
+ #include "utils/builtins.h"
72
+ #include "utils/fmgroids.h"
73
+ #include "utils/guc.h"
74
+ #include "utils/hsearch.h"
75
+ #include "utils/lsyscache.h"
76
+ #include "utils/partcache.h"
77
+ #include "utils/rel.h"
78
+ #include "utils/ruleutils.h"
79
+ #include "utils/snapmgr.h"
80
+ #include "utils/syscache.h"
81
+ #include "utils/typcache.h"
82
+ #include "utils/varlena.h"
83
+ #include "utils/xml.h"
84
+
85
+ /* ----------
86
+ * Pretty formatting constants
87
+ * ----------
88
+ */
89
+
90
+ /* Indent counts */
91
+ #define PRETTYINDENT_STD 8
92
+ #define PRETTYINDENT_JOIN 4
93
+ #define PRETTYINDENT_VAR 4
94
+
95
+ #define PRETTYINDENT_LIMIT 40 /* wrap limit */
96
+
97
+ /* Pretty flags */
98
+ #define PRETTYFLAG_PAREN 0x0001
99
+ #define PRETTYFLAG_INDENT 0x0002
100
+ #define PRETTYFLAG_SCHEMA 0x0004
101
+
102
+ /* Default line length for pretty-print wrapping: 0 means wrap always */
103
+ #define WRAP_COLUMN_DEFAULT 0
104
+
105
+ /* macros to test if pretty action needed */
106
+ #define PRETTY_PAREN(context) ((context)->prettyFlags & PRETTYFLAG_PAREN)
107
+ #define PRETTY_INDENT(context) ((context)->prettyFlags & PRETTYFLAG_INDENT)
108
+ #define PRETTY_SCHEMA(context) ((context)->prettyFlags & PRETTYFLAG_SCHEMA)
109
+
110
+
111
+ /* ----------
112
+ * Local data types
113
+ * ----------
114
+ */
115
+
116
+ /* Context info needed for invoking a recursive querytree display routine */
117
+ typedef struct
118
+ {
119
+ StringInfo buf; /* output buffer to append to */
120
+ List *namespaces; /* List of deparse_namespace nodes */
121
+ List *windowClause; /* Current query level's WINDOW clause */
122
+ List *windowTList; /* targetlist for resolving WINDOW clause */
123
+ int prettyFlags; /* enabling of pretty-print functions */
124
+ int wrapColumn; /* max line length, or -1 for no limit */
125
+ int indentLevel; /* current indent level for pretty-print */
126
+ bool varprefix; /* true to print prefixes on Vars */
127
+ ParseExprKind special_exprkind; /* set only for exprkinds needing special
128
+ * handling */
129
+ Bitmapset *appendparents; /* if not null, map child Vars of these relids
130
+ * back to the parent rel */
131
+ } deparse_context;
132
+
133
+ /*
134
+ * Each level of query context around a subtree needs a level of Var namespace.
135
+ * A Var having varlevelsup=N refers to the N'th item (counting from 0) in
136
+ * the current context's namespaces list.
137
+ *
138
+ * rtable is the list of actual RTEs from the Query or PlannedStmt.
139
+ * rtable_names holds the alias name to be used for each RTE (either a C
140
+ * string, or NULL for nameless RTEs such as unnamed joins).
141
+ * rtable_columns holds the column alias names to be used for each RTE.
142
+ *
143
+ * subplans is a list of Plan trees for SubPlans and CTEs (it's only used
144
+ * in the PlannedStmt case).
145
+ * ctes is a list of CommonTableExpr nodes (only used in the Query case).
146
+ * appendrels, if not null (it's only used in the PlannedStmt case), is an
147
+ * array of AppendRelInfo nodes, indexed by child relid. We use that to map
148
+ * child-table Vars to their inheritance parents.
149
+ *
150
+ * In some cases we need to make names of merged JOIN USING columns unique
151
+ * across the whole query, not only per-RTE. If so, unique_using is true
152
+ * and using_names is a list of C strings representing names already assigned
153
+ * to USING columns.
154
+ *
155
+ * When deparsing plan trees, there is always just a single item in the
156
+ * deparse_namespace list (since a plan tree never contains Vars with
157
+ * varlevelsup > 0). We store the Plan node that is the immediate
158
+ * parent of the expression to be deparsed, as well as a list of that
159
+ * Plan's ancestors. In addition, we store its outer and inner subplan nodes,
160
+ * as well as their targetlists, and the index tlist if the current plan node
161
+ * might contain INDEX_VAR Vars. (These fields could be derived on-the-fly
162
+ * from the current Plan node, but it seems notationally clearer to set them
163
+ * up as separate fields.)
164
+ */
165
+ typedef struct
166
+ {
167
+ List *rtable; /* List of RangeTblEntry nodes */
168
+ List *rtable_names; /* Parallel list of names for RTEs */
169
+ List *rtable_columns; /* Parallel list of deparse_columns structs */
170
+ List *subplans; /* List of Plan trees for SubPlans */
171
+ List *ctes; /* List of CommonTableExpr nodes */
172
+ AppendRelInfo **appendrels; /* Array of AppendRelInfo nodes, or NULL */
173
+ /* Workspace for column alias assignment: */
174
+ bool unique_using; /* Are we making USING names globally unique */
175
+ List *using_names; /* List of assigned names for USING columns */
176
+ /* Remaining fields are used only when deparsing a Plan tree: */
177
+ Plan *plan; /* immediate parent of current expression */
178
+ List *ancestors; /* ancestors of plan */
179
+ Plan *outer_plan; /* outer subnode, or NULL if none */
180
+ Plan *inner_plan; /* inner subnode, or NULL if none */
181
+ List *outer_tlist; /* referent for OUTER_VAR Vars */
182
+ List *inner_tlist; /* referent for INNER_VAR Vars */
183
+ List *index_tlist; /* referent for INDEX_VAR Vars */
184
+ } deparse_namespace;
185
+
186
+ /*
187
+ * Per-relation data about column alias names.
188
+ *
189
+ * Selecting aliases is unreasonably complicated because of the need to dump
190
+ * rules/views whose underlying tables may have had columns added, deleted, or
191
+ * renamed since the query was parsed. We must nonetheless print the rule/view
192
+ * in a form that can be reloaded and will produce the same results as before.
193
+ *
194
+ * For each RTE used in the query, we must assign column aliases that are
195
+ * unique within that RTE. SQL does not require this of the original query,
196
+ * but due to factors such as *-expansion we need to be able to uniquely
197
+ * reference every column in a decompiled query. As long as we qualify all
198
+ * column references, per-RTE uniqueness is sufficient for that.
199
+ *
200
+ * However, we can't ensure per-column name uniqueness for unnamed join RTEs,
201
+ * since they just inherit column names from their input RTEs, and we can't
202
+ * rename the columns at the join level. Most of the time this isn't an issue
203
+ * because we don't need to reference the join's output columns as such; we
204
+ * can reference the input columns instead. That approach can fail for merged
205
+ * JOIN USING columns, however, so when we have one of those in an unnamed
206
+ * join, we have to make that column's alias globally unique across the whole
207
+ * query to ensure it can be referenced unambiguously.
208
+ *
209
+ * Another problem is that a JOIN USING clause requires the columns to be
210
+ * merged to have the same aliases in both input RTEs, and that no other
211
+ * columns in those RTEs or their children conflict with the USING names.
212
+ * To handle that, we do USING-column alias assignment in a recursive
213
+ * traversal of the query's jointree. When descending through a JOIN with
214
+ * USING, we preassign the USING column names to the child columns, overriding
215
+ * other rules for column alias assignment. We also mark each RTE with a list
216
+ * of all USING column names selected for joins containing that RTE, so that
217
+ * when we assign other columns' aliases later, we can avoid conflicts.
218
+ *
219
+ * Another problem is that if a JOIN's input tables have had columns added or
220
+ * deleted since the query was parsed, we must generate a column alias list
221
+ * for the join that matches the current set of input columns --- otherwise, a
222
+ * change in the number of columns in the left input would throw off matching
223
+ * of aliases to columns of the right input. Thus, positions in the printable
224
+ * column alias list are not necessarily one-for-one with varattnos of the
225
+ * JOIN, so we need a separate new_colnames[] array for printing purposes.
226
+ */
227
+ typedef struct
228
+ {
229
+ /*
230
+ * colnames is an array containing column aliases to use for columns that
231
+ * existed when the query was parsed. Dropped columns have NULL entries.
232
+ * This array can be directly indexed by varattno to get a Var's name.
233
+ *
234
+ * Non-NULL entries are guaranteed unique within the RTE, *except* when
235
+ * this is for an unnamed JOIN RTE. In that case we merely copy up names
236
+ * from the two input RTEs.
237
+ *
238
+ * During the recursive descent in set_using_names(), forcible assignment
239
+ * of a child RTE's column name is represented by pre-setting that element
240
+ * of the child's colnames array. So at that stage, NULL entries in this
241
+ * array just mean that no name has been preassigned, not necessarily that
242
+ * the column is dropped.
243
+ */
244
+ int num_cols; /* length of colnames[] array */
245
+ char **colnames; /* array of C strings and NULLs */
246
+
247
+ /*
248
+ * new_colnames is an array containing column aliases to use for columns
249
+ * that would exist if the query was re-parsed against the current
250
+ * definitions of its base tables. This is what to print as the column
251
+ * alias list for the RTE. This array does not include dropped columns,
252
+ * but it will include columns added since original parsing. Indexes in
253
+ * it therefore have little to do with current varattno values. As above,
254
+ * entries are unique unless this is for an unnamed JOIN RTE. (In such an
255
+ * RTE, we never actually print this array, but we must compute it anyway
256
+ * for possible use in computing column names of upper joins.) The
257
+ * parallel array is_new_col marks which of these columns are new since
258
+ * original parsing. Entries with is_new_col false must match the
259
+ * non-NULL colnames entries one-for-one.
260
+ */
261
+ int num_new_cols; /* length of new_colnames[] array */
262
+ char **new_colnames; /* array of C strings */
263
+ bool *is_new_col; /* array of bool flags */
264
+
265
+ /* This flag tells whether we should actually print a column alias list */
266
+ bool printaliases;
267
+
268
+ /* This list has all names used as USING names in joins above this RTE */
269
+ List *parentUsing; /* names assigned to parent merged columns */
270
+
271
+ /*
272
+ * If this struct is for a JOIN RTE, we fill these fields during the
273
+ * set_using_names() pass to describe its relationship to its child RTEs.
274
+ *
275
+ * leftattnos and rightattnos are arrays with one entry per existing
276
+ * output column of the join (hence, indexable by join varattno). For a
277
+ * simple reference to a column of the left child, leftattnos[i] is the
278
+ * child RTE's attno and rightattnos[i] is zero; and conversely for a
279
+ * column of the right child. But for merged columns produced by JOIN
280
+ * USING/NATURAL JOIN, both leftattnos[i] and rightattnos[i] are nonzero.
281
+ * Note that a simple reference might be to a child RTE column that's been
282
+ * dropped; but that's OK since the column could not be used in the query.
283
+ *
284
+ * If it's a JOIN USING, usingNames holds the alias names selected for the
285
+ * merged columns (these might be different from the original USING list,
286
+ * if we had to modify names to achieve uniqueness).
287
+ */
288
+ int leftrti; /* rangetable index of left child */
289
+ int rightrti; /* rangetable index of right child */
290
+ int *leftattnos; /* left-child varattnos of join cols, or 0 */
291
+ int *rightattnos; /* right-child varattnos of join cols, or 0 */
292
+ List *usingNames; /* names assigned to merged columns */
293
+ } deparse_columns;
294
+
295
+ /* This macro is analogous to rt_fetch(), but for deparse_columns structs */
296
+ #define deparse_columns_fetch(rangetable_index, dpns) \
297
+ ((deparse_columns *) list_nth((dpns)->rtable_columns, (rangetable_index)-1))
298
+
299
+ /*
300
+ * Entry in set_rtable_names' hash table
301
+ */
302
+ typedef struct
303
+ {
304
+ char name[NAMEDATALEN]; /* Hash key --- must be first */
305
+ int counter; /* Largest addition used so far for name */
306
+ } NameHashEntry;
307
+
308
+ /* Callback signature for resolve_special_varno() */
309
+ typedef void (*rsv_callback) (Node *node, deparse_context *context,
310
+ void *callback_arg);
311
+
312
+
313
+ /* ----------
314
+ * Global data
315
+ * ----------
316
+ */
317
+
318
+
319
+
320
+
321
+
322
+ /* GUC parameters */
323
+ __thread bool quote_all_identifiers = false;
324
+
325
+
326
+
327
+ /* ----------
328
+ * Local functions
329
+ *
330
+ * Most of these functions used to use fixed-size buffers to build their
331
+ * results. Now, they take an (already initialized) StringInfo object
332
+ * as a parameter, and append their text output to its contents.
333
+ * ----------
334
+ */
335
+ static char *deparse_expression_pretty(Node *expr, List *dpcontext,
336
+ bool forceprefix, bool showimplicit,
337
+ int prettyFlags, int startIndent);
338
+ static char *pg_get_viewdef_worker(Oid viewoid,
339
+ int prettyFlags, int wrapColumn);
340
+ static char *pg_get_triggerdef_worker(Oid trigid, bool pretty);
341
+ static int decompile_column_index_array(Datum column_index_array, Oid relId,
342
+ StringInfo buf);
343
+ static char *pg_get_ruledef_worker(Oid ruleoid, int prettyFlags);
344
+ static char *pg_get_indexdef_worker(Oid indexrelid, int colno,
345
+ const Oid *excludeOps,
346
+ bool attrsOnly, bool keysOnly,
347
+ bool showTblSpc, bool inherits,
348
+ int prettyFlags, bool missing_ok);
349
+ static char *pg_get_statisticsobj_worker(Oid statextid, bool missing_ok);
350
+ static char *pg_get_partkeydef_worker(Oid relid, int prettyFlags,
351
+ bool attrsOnly, bool missing_ok);
352
+ static char *pg_get_constraintdef_worker(Oid constraintId, bool fullCommand,
353
+ int prettyFlags, bool missing_ok);
354
+ static text *pg_get_expr_worker(text *expr, Oid relid, const char *relname,
355
+ int prettyFlags);
356
+ static int print_function_arguments(StringInfo buf, HeapTuple proctup,
357
+ bool print_table_args, bool print_defaults);
358
+ static void print_function_rettype(StringInfo buf, HeapTuple proctup);
359
+ static void print_function_trftypes(StringInfo buf, HeapTuple proctup);
360
+ static void set_rtable_names(deparse_namespace *dpns, List *parent_namespaces,
361
+ Bitmapset *rels_used);
362
+ static void set_deparse_for_query(deparse_namespace *dpns, Query *query,
363
+ List *parent_namespaces);
364
+ static void set_simple_column_names(deparse_namespace *dpns);
365
+ static bool has_dangerous_join_using(deparse_namespace *dpns, Node *jtnode);
366
+ static void set_using_names(deparse_namespace *dpns, Node *jtnode,
367
+ List *parentUsing);
368
+ static void set_relation_column_names(deparse_namespace *dpns,
369
+ RangeTblEntry *rte,
370
+ deparse_columns *colinfo);
371
+ static void set_join_column_names(deparse_namespace *dpns, RangeTblEntry *rte,
372
+ deparse_columns *colinfo);
373
+ static bool colname_is_unique(const char *colname, deparse_namespace *dpns,
374
+ deparse_columns *colinfo);
375
+ static char *make_colname_unique(char *colname, deparse_namespace *dpns,
376
+ deparse_columns *colinfo);
377
+ static void expand_colnames_array_to(deparse_columns *colinfo, int n);
378
+ static void identify_join_columns(JoinExpr *j, RangeTblEntry *jrte,
379
+ deparse_columns *colinfo);
380
+ static char *get_rtable_name(int rtindex, deparse_context *context);
381
+ static void set_deparse_plan(deparse_namespace *dpns, Plan *plan);
382
+ static void push_child_plan(deparse_namespace *dpns, Plan *plan,
383
+ deparse_namespace *save_dpns);
384
+ static void pop_child_plan(deparse_namespace *dpns,
385
+ deparse_namespace *save_dpns);
386
+ static void push_ancestor_plan(deparse_namespace *dpns, ListCell *ancestor_cell,
387
+ deparse_namespace *save_dpns);
388
+ static void pop_ancestor_plan(deparse_namespace *dpns,
389
+ deparse_namespace *save_dpns);
390
+ static void make_ruledef(StringInfo buf, HeapTuple ruletup, TupleDesc rulettc,
391
+ int prettyFlags);
392
+ static void make_viewdef(StringInfo buf, HeapTuple ruletup, TupleDesc rulettc,
393
+ int prettyFlags, int wrapColumn);
394
+ static void get_query_def(Query *query, StringInfo buf, List *parentnamespace,
395
+ TupleDesc resultDesc,
396
+ int prettyFlags, int wrapColumn, int startIndent);
397
+ static void get_values_def(List *values_lists, deparse_context *context);
398
+ static void get_with_clause(Query *query, deparse_context *context);
399
+ static void get_select_query_def(Query *query, deparse_context *context,
400
+ TupleDesc resultDesc);
401
+ static void get_insert_query_def(Query *query, deparse_context *context);
402
+ static void get_update_query_def(Query *query, deparse_context *context);
403
+ static void get_update_query_targetlist_def(Query *query, List *targetList,
404
+ deparse_context *context,
405
+ RangeTblEntry *rte);
406
+ static void get_delete_query_def(Query *query, deparse_context *context);
407
+ static void get_utility_query_def(Query *query, deparse_context *context);
408
+ static void get_basic_select_query(Query *query, deparse_context *context,
409
+ TupleDesc resultDesc);
410
+ static void get_target_list(List *targetList, deparse_context *context,
411
+ TupleDesc resultDesc);
412
+ static void get_setop_query(Node *setOp, Query *query,
413
+ deparse_context *context,
414
+ TupleDesc resultDesc);
415
+ static Node *get_rule_sortgroupclause(Index ref, List *tlist,
416
+ bool force_colno,
417
+ deparse_context *context);
418
+ static void get_rule_groupingset(GroupingSet *gset, List *targetlist,
419
+ bool omit_parens, deparse_context *context);
420
+ static void get_rule_orderby(List *orderList, List *targetList,
421
+ bool force_colno, deparse_context *context);
422
+ static void get_rule_windowclause(Query *query, deparse_context *context);
423
+ static void get_rule_windowspec(WindowClause *wc, List *targetList,
424
+ deparse_context *context);
425
+ static char *get_variable(Var *var, int levelsup, bool istoplevel,
426
+ deparse_context *context);
427
+ static void get_special_variable(Node *node, deparse_context *context,
428
+ void *callback_arg);
429
+ static void resolve_special_varno(Node *node, deparse_context *context,
430
+ rsv_callback callback, void *callback_arg);
431
+ static Node *find_param_referent(Param *param, deparse_context *context,
432
+ deparse_namespace **dpns_p, ListCell **ancestor_cell_p);
433
+ static void get_parameter(Param *param, deparse_context *context);
434
+ static const char *get_simple_binary_op_name(OpExpr *expr);
435
+ static bool isSimpleNode(Node *node, Node *parentNode, int prettyFlags);
436
+ static void appendContextKeyword(deparse_context *context, const char *str,
437
+ int indentBefore, int indentAfter, int indentPlus);
438
+ static void removeStringInfoSpaces(StringInfo str);
439
+ static void get_rule_expr(Node *node, deparse_context *context,
440
+ bool showimplicit);
441
+ static void get_rule_expr_toplevel(Node *node, deparse_context *context,
442
+ bool showimplicit);
443
+ static void get_rule_expr_funccall(Node *node, deparse_context *context,
444
+ bool showimplicit);
445
+ static bool looks_like_function(Node *node);
446
+ static void get_oper_expr(OpExpr *expr, deparse_context *context);
447
+ static void get_func_expr(FuncExpr *expr, deparse_context *context,
448
+ bool showimplicit);
449
+ static void get_agg_expr(Aggref *aggref, deparse_context *context,
450
+ Aggref *original_aggref);
451
+ static void get_agg_combine_expr(Node *node, deparse_context *context,
452
+ void *callback_arg);
453
+ static void get_windowfunc_expr(WindowFunc *wfunc, deparse_context *context);
454
+ static void get_coercion_expr(Node *arg, deparse_context *context,
455
+ Oid resulttype, int32 resulttypmod,
456
+ Node *parentNode);
457
+ static void get_const_expr(Const *constval, deparse_context *context,
458
+ int showtype);
459
+ static void get_const_collation(Const *constval, deparse_context *context);
460
+ static void simple_quote_literal(StringInfo buf, const char *val);
461
+ static void get_sublink_expr(SubLink *sublink, deparse_context *context);
462
+ static void get_tablefunc(TableFunc *tf, deparse_context *context,
463
+ bool showimplicit);
464
+ static void get_from_clause(Query *query, const char *prefix,
465
+ deparse_context *context);
466
+ static void get_from_clause_item(Node *jtnode, Query *query,
467
+ deparse_context *context);
468
+ static void get_column_alias_list(deparse_columns *colinfo,
469
+ deparse_context *context);
470
+ static void get_from_clause_coldeflist(RangeTblFunction *rtfunc,
471
+ deparse_columns *colinfo,
472
+ deparse_context *context);
473
+ static void get_tablesample_def(TableSampleClause *tablesample,
474
+ deparse_context *context);
475
+ static void get_opclass_name(Oid opclass, Oid actual_datatype,
476
+ StringInfo buf);
477
+ static Node *processIndirection(Node *node, deparse_context *context);
478
+ static void printSubscripts(SubscriptingRef *sbsref, deparse_context *context);
479
+ static char *get_relation_name(Oid relid);
480
+ static char *generate_relation_name(Oid relid, List *namespaces);
481
+ static char *generate_qualified_relation_name(Oid relid);
482
+ static char *generate_function_name(Oid funcid, int nargs,
483
+ List *argnames, Oid *argtypes,
484
+ bool has_variadic, bool *use_variadic_p,
485
+ ParseExprKind special_exprkind);
486
+ static char *generate_operator_name(Oid operid, Oid arg1, Oid arg2);
487
+ static void add_cast_to(StringInfo buf, Oid typid);
488
+ static char *generate_qualified_type_name(Oid typid);
489
+ static text *string_to_text(char *str);
490
+ static char *flatten_reloptions(Oid relid);
491
+ static void get_reloptions(StringInfo buf, Datum reloptions);
492
+
493
+ #define only_marker(rte) ((rte)->inh ? "" : "ONLY ")
494
+
495
+
496
+ /* ----------
497
+ * pg_get_ruledef - Do it all and return a text
498
+ * that could be used as a statement
499
+ * to recreate the rule
500
+ * ----------
501
+ */
502
+
503
+
504
+
505
+
506
+
507
+
508
+
509
+
510
+
511
+ /* ----------
512
+ * pg_get_viewdef - Mainly the same thing, but we
513
+ * only return the SELECT part of a view
514
+ * ----------
515
+ */
516
+
517
+
518
+
519
+
520
+
521
+
522
+
523
+
524
+
525
+
526
+
527
+
528
+ /*
529
+ * Common code for by-OID and by-name variants of pg_get_viewdef
530
+ */
531
+
532
+
533
+ /* ----------
534
+ * pg_get_triggerdef - Get the definition of a trigger
535
+ * ----------
536
+ */
537
+
538
+
539
+
540
+
541
+
542
+
543
+ /* ----------
544
+ * pg_get_indexdef - Get the definition of an index
545
+ *
546
+ * In the extended version, there is a colno argument as well as pretty bool.
547
+ * if colno == 0, we want a complete index definition.
548
+ * if colno > 0, we only want the Nth index key's variable or expression.
549
+ *
550
+ * Note that the SQL-function versions of this omit any info about the
551
+ * index tablespace; this is intentional because pg_dump wants it that way.
552
+ * However pg_get_indexdef_string() includes the index tablespace.
553
+ * ----------
554
+ */
555
+
556
+
557
+
558
+
559
+ /*
560
+ * Internal version for use by ALTER TABLE.
561
+ * Includes a tablespace clause in the result.
562
+ * Returns a palloc'd C string; no pretty-printing.
563
+ */
564
+
565
+
566
+ /* Internal version that just reports the key-column definitions */
567
+
568
+
569
+ /*
570
+ * Internal workhorse to decompile an index definition.
571
+ *
572
+ * This is now used for exclusion constraints as well: if excludeOps is not
573
+ * NULL then it points to an array of exclusion operator OIDs.
574
+ */
575
+
576
+
577
+ /*
578
+ * pg_get_statisticsobjdef
579
+ * Get the definition of an extended statistics object
580
+ */
581
+
582
+
583
+ /*
584
+ * Internal workhorse to decompile an extended statistics object.
585
+ */
586
+
587
+
588
+ /*
589
+ * pg_get_partkeydef
590
+ *
591
+ * Returns the partition key specification, ie, the following:
592
+ *
593
+ * PARTITION BY { RANGE | LIST | HASH } (column opt_collation opt_opclass [, ...])
594
+ */
595
+
596
+
597
+ /* Internal version that just reports the column definitions */
598
+
599
+
600
+ /*
601
+ * Internal workhorse to decompile a partition key definition.
602
+ */
603
+
604
+
605
+ /*
606
+ * pg_get_partition_constraintdef
607
+ *
608
+ * Returns partition constraint expression as a string for the input relation
609
+ */
610
+
611
+
612
+ /*
613
+ * pg_get_partconstrdef_string
614
+ *
615
+ * Returns the partition constraint as a C-string for the input relation, with
616
+ * the given alias. No pretty-printing.
617
+ */
618
+
619
+
620
+ /*
621
+ * pg_get_constraintdef
622
+ *
623
+ * Returns the definition for the constraint, ie, everything that needs to
624
+ * appear after "ALTER TABLE ... ADD CONSTRAINT <constraintname>".
625
+ */
626
+
627
+
628
+
629
+
630
+ /*
631
+ * Internal version that returns a full ALTER TABLE ... ADD CONSTRAINT command
632
+ */
633
+
634
+
635
+ /*
636
+ * As of 9.4, we now use an MVCC snapshot for this.
637
+ */
638
+
639
+
640
+
641
+ /*
642
+ * Convert an int16[] Datum into a comma-separated list of column names
643
+ * for the indicated relation; append the list to buf. Returns the number
644
+ * of keys.
645
+ */
646
+
647
+
648
+
649
+ /* ----------
650
+ * pg_get_expr - Decompile an expression tree
651
+ *
652
+ * Input: an expression tree in nodeToString form, and a relation OID
653
+ *
654
+ * Output: reverse-listed expression
655
+ *
656
+ * Currently, the expression can only refer to a single relation, namely
657
+ * the one specified by the second parameter. This is sufficient for
658
+ * partial indexes, column default expressions, etc. We also support
659
+ * Var-free expressions, for which the OID can be InvalidOid.
660
+ * ----------
661
+ */
662
+
663
+
664
+
665
+
666
+
667
+
668
+
669
+ /* ----------
670
+ * pg_get_userbyid - Get a user name by roleid and
671
+ * fallback to 'unknown (OID=n)'
672
+ * ----------
673
+ */
674
+
675
+
676
+
677
+ /*
678
+ * pg_get_serial_sequence
679
+ * Get the name of the sequence used by an identity or serial column,
680
+ * formatted suitably for passing to setval, nextval or currval.
681
+ * First parameter is not treated as double-quoted, second parameter
682
+ * is --- see documentation for reason.
683
+ */
684
+
685
+
686
+
687
+ /*
688
+ * pg_get_functiondef
689
+ * Returns the complete "CREATE OR REPLACE FUNCTION ..." statement for
690
+ * the specified function.
691
+ *
692
+ * Note: if you change the output format of this function, be careful not
693
+ * to break psql's rules (in \ef and \sf) for identifying the start of the
694
+ * function body. To wit: the function body starts on a line that begins
695
+ * with "AS ", and no preceding line will look like that.
696
+ */
697
+
698
+
699
+ /*
700
+ * pg_get_function_arguments
701
+ * Get a nicely-formatted list of arguments for a function.
702
+ * This is everything that would go between the parentheses in
703
+ * CREATE FUNCTION.
704
+ */
705
+
706
+
707
+ /*
708
+ * pg_get_function_identity_arguments
709
+ * Get a formatted list of arguments for a function.
710
+ * This is everything that would go between the parentheses in
711
+ * ALTER FUNCTION, etc. In particular, don't print defaults.
712
+ */
713
+
714
+
715
+ /*
716
+ * pg_get_function_result
717
+ * Get a nicely-formatted version of the result type of a function.
718
+ * This is what would appear after RETURNS in CREATE FUNCTION.
719
+ */
720
+
721
+
722
+ /*
723
+ * Guts of pg_get_function_result: append the function's return type
724
+ * to the specified buffer.
725
+ */
726
+
727
+
728
+ /*
729
+ * Common code for pg_get_function_arguments and pg_get_function_result:
730
+ * append the desired subset of arguments to buf. We print only TABLE
731
+ * arguments when print_table_args is true, and all the others when it's false.
732
+ * We print argument defaults only if print_defaults is true.
733
+ * Function return value is the number of arguments printed.
734
+ */
735
+
736
+
737
+
738
+
739
+ /*
740
+ * Append used transformed types to specified buffer
741
+ */
742
+
743
+
744
+ /*
745
+ * Get textual representation of a function argument's default value. The
746
+ * second argument of this function is the argument number among all arguments
747
+ * (i.e. proallargtypes, *not* proargtypes), starting with 1, because that's
748
+ * how information_schema.sql uses it.
749
+ */
750
+
751
+
752
+
753
+ /*
754
+ * deparse_expression - General utility for deparsing expressions
755
+ *
756
+ * calls deparse_expression_pretty with all prettyPrinting disabled
757
+ */
758
+
759
+
760
+ /* ----------
761
+ * deparse_expression_pretty - General utility for deparsing expressions
762
+ *
763
+ * expr is the node tree to be deparsed. It must be a transformed expression
764
+ * tree (ie, not the raw output of gram.y).
765
+ *
766
+ * dpcontext is a list of deparse_namespace nodes representing the context
767
+ * for interpreting Vars in the node tree. It can be NIL if no Vars are
768
+ * expected.
769
+ *
770
+ * forceprefix is true to force all Vars to be prefixed with their table names.
771
+ *
772
+ * showimplicit is true to force all implicit casts to be shown explicitly.
773
+ *
774
+ * Tries to pretty up the output according to prettyFlags and startIndent.
775
+ *
776
+ * The result is a palloc'd string.
777
+ * ----------
778
+ */
779
+
780
+
781
+ /* ----------
782
+ * deparse_context_for - Build deparse context for a single relation
783
+ *
784
+ * Given the reference name (alias) and OID of a relation, build deparsing
785
+ * context for an expression referencing only that relation (as varno 1,
786
+ * varlevelsup 0). This is sufficient for many uses of deparse_expression.
787
+ * ----------
788
+ */
789
+
790
+
791
+ /*
792
+ * deparse_context_for_plan_tree - Build deparse context for a Plan tree
793
+ *
794
+ * When deparsing an expression in a Plan tree, we use the plan's rangetable
795
+ * to resolve names of simple Vars. The initialization of column names for
796
+ * this is rather expensive if the rangetable is large, and it'll be the same
797
+ * for every expression in the Plan tree; so we do it just once and re-use
798
+ * the result of this function for each expression. (Note that the result
799
+ * is not usable until set_deparse_context_plan() is applied to it.)
800
+ *
801
+ * In addition to the PlannedStmt, pass the per-RTE alias names
802
+ * assigned by a previous call to select_rtable_names_for_explain.
803
+ */
804
+
805
+
806
+ /*
807
+ * set_deparse_context_plan - Specify Plan node containing expression
808
+ *
809
+ * When deparsing an expression in a Plan tree, we might have to resolve
810
+ * OUTER_VAR, INNER_VAR, or INDEX_VAR references. To do this, the caller must
811
+ * provide the parent Plan node. Then OUTER_VAR and INNER_VAR references
812
+ * can be resolved by drilling down into the left and right child plans.
813
+ * Similarly, INDEX_VAR references can be resolved by reference to the
814
+ * indextlist given in a parent IndexOnlyScan node, or to the scan tlist in
815
+ * ForeignScan and CustomScan nodes. (Note that we don't currently support
816
+ * deparsing of indexquals in regular IndexScan or BitmapIndexScan nodes;
817
+ * for those, we can only deparse the indexqualorig fields, which won't
818
+ * contain INDEX_VAR Vars.)
819
+ *
820
+ * The ancestors list is a list of the Plan's parent Plan and SubPlan nodes,
821
+ * the most-closely-nested first. This is needed to resolve PARAM_EXEC
822
+ * Params. Note we assume that all the Plan nodes share the same rtable.
823
+ *
824
+ * Once this function has been called, deparse_expression() can be called on
825
+ * subsidiary expression(s) of the specified Plan node. To deparse
826
+ * expressions of a different Plan node in the same Plan tree, re-call this
827
+ * function to identify the new parent Plan node.
828
+ *
829
+ * The result is the same List passed in; this is a notational convenience.
830
+ */
831
+
832
+
833
+ /*
834
+ * select_rtable_names_for_explain - Select RTE aliases for EXPLAIN
835
+ *
836
+ * Determine the relation aliases we'll use during an EXPLAIN operation.
837
+ * This is just a frontend to set_rtable_names. We have to expose the aliases
838
+ * to EXPLAIN because EXPLAIN needs to know the right alias names to print.
839
+ */
840
+
841
+
842
+ /*
843
+ * set_rtable_names: select RTE aliases to be used in printing a query
844
+ *
845
+ * We fill in dpns->rtable_names with a list of names that is one-for-one with
846
+ * the already-filled dpns->rtable list. Each RTE name is unique among those
847
+ * in the new namespace plus any ancestor namespaces listed in
848
+ * parent_namespaces.
849
+ *
850
+ * If rels_used isn't NULL, only RTE indexes listed in it are given aliases.
851
+ *
852
+ * Note that this function is only concerned with relation names, not column
853
+ * names.
854
+ */
855
+
856
+
857
+ /*
858
+ * set_deparse_for_query: set up deparse_namespace for deparsing a Query tree
859
+ *
860
+ * For convenience, this is defined to initialize the deparse_namespace struct
861
+ * from scratch.
862
+ */
863
+
864
+
865
+ /*
866
+ * set_simple_column_names: fill in column aliases for non-query situations
867
+ *
868
+ * This handles EXPLAIN and cases where we only have relation RTEs. Without
869
+ * a join tree, we can't do anything smart about join RTEs, but we don't
870
+ * need to (note that EXPLAIN should never see join alias Vars anyway).
871
+ * If we do hit a join RTE we'll just process it like a non-table base RTE.
872
+ */
873
+
874
+
875
+ /*
876
+ * has_dangerous_join_using: search jointree for unnamed JOIN USING
877
+ *
878
+ * Merged columns of a JOIN USING may act differently from either of the input
879
+ * columns, either because they are merged with COALESCE (in a FULL JOIN) or
880
+ * because an implicit coercion of the underlying input column is required.
881
+ * In such a case the column must be referenced as a column of the JOIN not as
882
+ * a column of either input. And this is problematic if the join is unnamed
883
+ * (alias-less): we cannot qualify the column's name with an RTE name, since
884
+ * there is none. (Forcibly assigning an alias to the join is not a solution,
885
+ * since that will prevent legal references to tables below the join.)
886
+ * To ensure that every column in the query is unambiguously referenceable,
887
+ * we must assign such merged columns names that are globally unique across
888
+ * the whole query, aliasing other columns out of the way as necessary.
889
+ *
890
+ * Because the ensuing re-aliasing is fairly damaging to the readability of
891
+ * the query, we don't do this unless we have to. So, we must pre-scan
892
+ * the join tree to see if we have to, before starting set_using_names().
893
+ */
894
+
895
+
896
+ /*
897
+ * set_using_names: select column aliases to be used for merged USING columns
898
+ *
899
+ * We do this during a recursive descent of the query jointree.
900
+ * dpns->unique_using must already be set to determine the global strategy.
901
+ *
902
+ * Column alias info is saved in the dpns->rtable_columns list, which is
903
+ * assumed to be filled with pre-zeroed deparse_columns structs.
904
+ *
905
+ * parentUsing is a list of all USING aliases assigned in parent joins of
906
+ * the current jointree node. (The passed-in list must not be modified.)
907
+ */
908
+
909
+
910
+ /*
911
+ * set_relation_column_names: select column aliases for a non-join RTE
912
+ *
913
+ * Column alias info is saved in *colinfo, which is assumed to be pre-zeroed.
914
+ * If any colnames entries are already filled in, those override local
915
+ * choices.
916
+ */
917
+
918
+
919
+ /*
920
+ * set_join_column_names: select column aliases for a join RTE
921
+ *
922
+ * Column alias info is saved in *colinfo, which is assumed to be pre-zeroed.
923
+ * If any colnames entries are already filled in, those override local
924
+ * choices. Also, names for USING columns were already chosen by
925
+ * set_using_names(). We further expect that column alias selection has been
926
+ * completed for both input RTEs.
927
+ */
928
+ #ifdef USE_ASSERT_CHECKING
929
+ #endif
930
+
931
+ /*
932
+ * colname_is_unique: is colname distinct from already-chosen column names?
933
+ *
934
+ * dpns is query-wide info, colinfo is for the column's RTE
935
+ */
936
+
937
+
938
+ /*
939
+ * make_colname_unique: modify colname if necessary to make it unique
940
+ *
941
+ * dpns is query-wide info, colinfo is for the column's RTE
942
+ */
943
+
944
+
945
+ /*
946
+ * expand_colnames_array_to: make colinfo->colnames at least n items long
947
+ *
948
+ * Any added array entries are initialized to zero.
949
+ */
950
+
951
+
952
+ /*
953
+ * identify_join_columns: figure out where columns of a join come from
954
+ *
955
+ * Fills the join-specific fields of the colinfo struct, except for
956
+ * usingNames which is filled later.
957
+ */
958
+
959
+
960
+ /*
961
+ * get_rtable_name: convenience function to get a previously assigned RTE alias
962
+ *
963
+ * The RTE must belong to the topmost namespace level in "context".
964
+ */
965
+
966
+
967
+ /*
968
+ * set_deparse_plan: set up deparse_namespace to parse subexpressions
969
+ * of a given Plan node
970
+ *
971
+ * This sets the plan, outer_plan, inner_plan, outer_tlist, inner_tlist,
972
+ * and index_tlist fields. Caller is responsible for adjusting the ancestors
973
+ * list if necessary. Note that the rtable, subplans, and ctes fields do
974
+ * not need to change when shifting attention to different plan nodes in a
975
+ * single plan tree.
976
+ */
977
+
978
+
979
+ /*
980
+ * push_child_plan: temporarily transfer deparsing attention to a child plan
981
+ *
982
+ * When expanding an OUTER_VAR or INNER_VAR reference, we must adjust the
983
+ * deparse context in case the referenced expression itself uses
984
+ * OUTER_VAR/INNER_VAR. We modify the top stack entry in-place to avoid
985
+ * affecting levelsup issues (although in a Plan tree there really shouldn't
986
+ * be any).
987
+ *
988
+ * Caller must provide a local deparse_namespace variable to save the
989
+ * previous state for pop_child_plan.
990
+ */
991
+
992
+
993
+ /*
994
+ * pop_child_plan: undo the effects of push_child_plan
995
+ */
996
+
997
+
998
+ /*
999
+ * push_ancestor_plan: temporarily transfer deparsing attention to an
1000
+ * ancestor plan
1001
+ *
1002
+ * When expanding a Param reference, we must adjust the deparse context
1003
+ * to match the plan node that contains the expression being printed;
1004
+ * otherwise we'd fail if that expression itself contains a Param or
1005
+ * OUTER_VAR/INNER_VAR/INDEX_VAR variable.
1006
+ *
1007
+ * The target ancestor is conveniently identified by the ListCell holding it
1008
+ * in dpns->ancestors.
1009
+ *
1010
+ * Caller must provide a local deparse_namespace variable to save the
1011
+ * previous state for pop_ancestor_plan.
1012
+ */
1013
+
1014
+
1015
+ /*
1016
+ * pop_ancestor_plan: undo the effects of push_ancestor_plan
1017
+ */
1018
+
1019
+
1020
+
1021
+ /* ----------
1022
+ * make_ruledef - reconstruct the CREATE RULE command
1023
+ * for a given pg_rewrite tuple
1024
+ * ----------
1025
+ */
1026
+
1027
+
1028
+
1029
+ /* ----------
1030
+ * make_viewdef - reconstruct the SELECT part of a
1031
+ * view rewrite rule
1032
+ * ----------
1033
+ */
1034
+
1035
+
1036
+
1037
+ /* ----------
1038
+ * get_query_def - Parse back one query parsetree
1039
+ *
1040
+ * If resultDesc is not NULL, then it is the output tuple descriptor for
1041
+ * the view represented by a SELECT query.
1042
+ * ----------
1043
+ */
1044
+
1045
+
1046
+ /* ----------
1047
+ * get_values_def - Parse back a VALUES list
1048
+ * ----------
1049
+ */
1050
+
1051
+
1052
+ /* ----------
1053
+ * get_with_clause - Parse back a WITH clause
1054
+ * ----------
1055
+ */
1056
+
1057
+
1058
+ /* ----------
1059
+ * get_select_query_def - Parse back a SELECT parsetree
1060
+ * ----------
1061
+ */
1062
+
1063
+
1064
+ /*
1065
+ * Detect whether query looks like SELECT ... FROM VALUES(),
1066
+ * with no need to rename the output columns of the VALUES RTE.
1067
+ * If so, return the VALUES RTE. Otherwise return NULL.
1068
+ */
1069
+
1070
+
1071
+
1072
+
1073
+ /* ----------
1074
+ * get_target_list - Parse back a SELECT target list
1075
+ *
1076
+ * This is also used for RETURNING lists in INSERT/UPDATE/DELETE.
1077
+ * ----------
1078
+ */
1079
+
1080
+
1081
+
1082
+
1083
+ /*
1084
+ * Display a sort/group clause.
1085
+ *
1086
+ * Also returns the expression tree, so caller need not find it again.
1087
+ */
1088
+
1089
+
1090
+ /*
1091
+ * Display a GroupingSet
1092
+ */
1093
+
1094
+
1095
+ /*
1096
+ * Display an ORDER BY list.
1097
+ */
1098
+
1099
+
1100
+ /*
1101
+ * Display a WINDOW clause.
1102
+ *
1103
+ * Note that the windowClause list might contain only anonymous window
1104
+ * specifications, in which case we should print nothing here.
1105
+ */
1106
+
1107
+
1108
+ /*
1109
+ * Display a window definition
1110
+ */
1111
+
1112
+
1113
+ /* ----------
1114
+ * get_insert_query_def - Parse back an INSERT parsetree
1115
+ * ----------
1116
+ */
1117
+
1118
+
1119
+
1120
+ /* ----------
1121
+ * get_update_query_def - Parse back an UPDATE parsetree
1122
+ * ----------
1123
+ */
1124
+
1125
+
1126
+
1127
+ /* ----------
1128
+ * get_update_query_targetlist_def - Parse back an UPDATE targetlist
1129
+ * ----------
1130
+ */
1131
+
1132
+
1133
+
1134
+ /* ----------
1135
+ * get_delete_query_def - Parse back a DELETE parsetree
1136
+ * ----------
1137
+ */
1138
+
1139
+
1140
+
1141
+ /* ----------
1142
+ * get_utility_query_def - Parse back a UTILITY parsetree
1143
+ * ----------
1144
+ */
1145
+
1146
+
1147
+ /*
1148
+ * Display a Var appropriately.
1149
+ *
1150
+ * In some cases (currently only when recursing into an unnamed join)
1151
+ * the Var's varlevelsup has to be interpreted with respect to a context
1152
+ * above the current one; levelsup indicates the offset.
1153
+ *
1154
+ * If istoplevel is true, the Var is at the top level of a SELECT's
1155
+ * targetlist, which means we need special treatment of whole-row Vars.
1156
+ * Instead of the normal "tab.*", we'll print "tab.*::typename", which is a
1157
+ * dirty hack to prevent "tab.*" from being expanded into multiple columns.
1158
+ * (The parser will strip the useless coercion, so no inefficiency is added in
1159
+ * dump and reload.) We used to print just "tab" in such cases, but that is
1160
+ * ambiguous and will yield the wrong result if "tab" is also a plain column
1161
+ * name in the query.
1162
+ *
1163
+ * Returns the attname of the Var, or NULL if the Var has no attname (because
1164
+ * it is a whole-row Var or a subplan output reference).
1165
+ */
1166
+
1167
+
1168
+ /*
1169
+ * Deparse a Var which references OUTER_VAR, INNER_VAR, or INDEX_VAR. This
1170
+ * routine is actually a callback for resolve_special_varno, which handles
1171
+ * finding the correct TargetEntry. We get the expression contained in that
1172
+ * TargetEntry and just need to deparse it, a job we can throw back on
1173
+ * get_rule_expr.
1174
+ */
1175
+
1176
+
1177
+ /*
1178
+ * Chase through plan references to special varnos (OUTER_VAR, INNER_VAR,
1179
+ * INDEX_VAR) until we find a real Var or some kind of non-Var node; then,
1180
+ * invoke the callback provided.
1181
+ */
1182
+
1183
+
1184
+ /*
1185
+ * Get the name of a field of an expression of composite type. The
1186
+ * expression is usually a Var, but we handle other cases too.
1187
+ *
1188
+ * levelsup is an extra offset to interpret the Var's varlevelsup correctly.
1189
+ *
1190
+ * This is fairly straightforward when the expression has a named composite
1191
+ * type; we need only look up the type in the catalogs. However, the type
1192
+ * could also be RECORD. Since no actual table or view column is allowed to
1193
+ * have type RECORD, a Var of type RECORD must refer to a JOIN or FUNCTION RTE
1194
+ * or to a subquery output. We drill down to find the ultimate defining
1195
+ * expression and attempt to infer the field name from it. We ereport if we
1196
+ * can't determine the name.
1197
+ *
1198
+ * Similarly, a PARAM of type RECORD has to refer to some expression of
1199
+ * a determinable composite type.
1200
+ */
1201
+
1202
+
1203
+ /*
1204
+ * Try to find the referenced expression for a PARAM_EXEC Param that might
1205
+ * reference a parameter supplied by an upper NestLoop or SubPlan plan node.
1206
+ *
1207
+ * If successful, return the expression and set *dpns_p and *ancestor_cell_p
1208
+ * appropriately for calling push_ancestor_plan(). If no referent can be
1209
+ * found, return NULL.
1210
+ */
1211
+
1212
+
1213
+ /*
1214
+ * Display a Param appropriately.
1215
+ */
1216
+
1217
+
1218
+ /*
1219
+ * get_simple_binary_op_name
1220
+ *
1221
+ * helper function for isSimpleNode
1222
+ * will return single char binary operator name, or NULL if it's not
1223
+ */
1224
+
1225
+
1226
+
1227
+ /*
1228
+ * isSimpleNode - check if given node is simple (doesn't need parenthesizing)
1229
+ *
1230
+ * true : simple in the context of parent node's type
1231
+ * false : not simple
1232
+ */
1233
+
1234
+
1235
+
1236
+ /*
1237
+ * appendContextKeyword - append a keyword to buffer
1238
+ *
1239
+ * If prettyPrint is enabled, perform a line break, and adjust indentation.
1240
+ * Otherwise, just append the keyword.
1241
+ */
1242
+
1243
+
1244
+ /*
1245
+ * removeStringInfoSpaces - delete trailing spaces from a buffer.
1246
+ *
1247
+ * Possibly this should move to stringinfo.c at some point.
1248
+ */
1249
+
1250
+
1251
+
1252
+ /*
1253
+ * get_rule_expr_paren - deparse expr using get_rule_expr,
1254
+ * embracing the string with parentheses if necessary for prettyPrint.
1255
+ *
1256
+ * Never embrace if prettyFlags=0, because it's done in the calling node.
1257
+ *
1258
+ * Any node that does *not* embrace its argument node by sql syntax (with
1259
+ * parentheses, non-operator keywords like CASE/WHEN/ON, or comma etc) should
1260
+ * use get_rule_expr_paren instead of get_rule_expr so parentheses can be
1261
+ * added.
1262
+ */
1263
+
1264
+
1265
+
1266
+ /* ----------
1267
+ * get_rule_expr - Parse back an expression
1268
+ *
1269
+ * Note: showimplicit determines whether we display any implicit cast that
1270
+ * is present at the top of the expression tree. It is a passed argument,
1271
+ * not a field of the context struct, because we change the value as we
1272
+ * recurse down into the expression. In general we suppress implicit casts
1273
+ * when the result type is known with certainty (eg, the arguments of an
1274
+ * OR must be boolean). We display implicit casts for arguments of functions
1275
+ * and operators, since this is needed to be certain that the same function
1276
+ * or operator will be chosen when the expression is re-parsed.
1277
+ * ----------
1278
+ */
1279
+
1280
+
1281
+ /*
1282
+ * get_rule_expr_toplevel - Parse back a toplevel expression
1283
+ *
1284
+ * Same as get_rule_expr(), except that if the expr is just a Var, we pass
1285
+ * istoplevel = true not false to get_variable(). This causes whole-row Vars
1286
+ * to get printed with decoration that will prevent expansion of "*".
1287
+ * We need to use this in contexts such as ROW() and VALUES(), where the
1288
+ * parser would expand "foo.*" appearing at top level. (In principle we'd
1289
+ * use this in get_target_list() too, but that has additional worries about
1290
+ * whether to print AS, so it needs to invoke get_variable() directly anyway.)
1291
+ */
1292
+
1293
+
1294
+ /*
1295
+ * get_rule_expr_funccall - Parse back a function-call expression
1296
+ *
1297
+ * Same as get_rule_expr(), except that we guarantee that the output will
1298
+ * look like a function call, or like one of the things the grammar treats as
1299
+ * equivalent to a function call (see the func_expr_windowless production).
1300
+ * This is needed in places where the grammar uses func_expr_windowless and
1301
+ * you can't substitute a parenthesized a_expr. If what we have isn't going
1302
+ * to look like a function call, wrap it in a dummy CAST() expression, which
1303
+ * will satisfy the grammar --- and, indeed, is likely what the user wrote to
1304
+ * produce such a thing.
1305
+ */
1306
+
1307
+
1308
+ /*
1309
+ * Helper function to identify node types that satisfy func_expr_windowless.
1310
+ * If in doubt, "false" is always a safe answer.
1311
+ */
1312
+
1313
+
1314
+
1315
+ /*
1316
+ * get_oper_expr - Parse back an OpExpr node
1317
+ */
1318
+
1319
+
1320
+ /*
1321
+ * get_func_expr - Parse back a FuncExpr node
1322
+ */
1323
+
1324
+
1325
+ /*
1326
+ * get_agg_expr - Parse back an Aggref node
1327
+ */
1328
+
1329
+
1330
+ /*
1331
+ * This is a helper function for get_agg_expr(). It's used when we deparse
1332
+ * a combining Aggref; resolve_special_varno locates the corresponding partial
1333
+ * Aggref and then calls this.
1334
+ */
1335
+
1336
+
1337
+ /*
1338
+ * get_windowfunc_expr - Parse back a WindowFunc node
1339
+ */
1340
+
1341
+
1342
+ /* ----------
1343
+ * get_coercion_expr
1344
+ *
1345
+ * Make a string representation of a value coerced to a specific type
1346
+ * ----------
1347
+ */
1348
+
1349
+
1350
+ /* ----------
1351
+ * get_const_expr
1352
+ *
1353
+ * Make a string representation of a Const
1354
+ *
1355
+ * showtype can be -1 to never show "::typename" decoration, or +1 to always
1356
+ * show it, or 0 to show it only if the constant wouldn't be assumed to be
1357
+ * the right type by default.
1358
+ *
1359
+ * If the Const's collation isn't default for its type, show that too.
1360
+ * We mustn't do this when showtype is -1 (since that means the caller will
1361
+ * print "::typename", and we can't put a COLLATE clause in between). It's
1362
+ * caller's responsibility that collation isn't missed in such cases.
1363
+ * ----------
1364
+ */
1365
+
1366
+
1367
+ /*
1368
+ * helper for get_const_expr: append COLLATE if needed
1369
+ */
1370
+
1371
+
1372
+ /*
1373
+ * simple_quote_literal - Format a string as a SQL literal, append to buf
1374
+ */
1375
+
1376
+
1377
+
1378
+ /* ----------
1379
+ * get_sublink_expr - Parse back a sublink
1380
+ * ----------
1381
+ */
1382
+
1383
+
1384
+
1385
+ /* ----------
1386
+ * get_tablefunc - Parse back a table function
1387
+ * ----------
1388
+ */
1389
+
1390
+
1391
+ /* ----------
1392
+ * get_from_clause - Parse back a FROM clause
1393
+ *
1394
+ * "prefix" is the keyword that denotes the start of the list of FROM
1395
+ * elements. It is FROM when used to parse back SELECT and UPDATE, but
1396
+ * is USING when parsing back DELETE.
1397
+ * ----------
1398
+ */
1399
+
1400
+
1401
+
1402
+
1403
+ /*
1404
+ * get_column_alias_list - print column alias list for an RTE
1405
+ *
1406
+ * Caller must already have printed the relation's alias name.
1407
+ */
1408
+
1409
+
1410
+ /*
1411
+ * get_from_clause_coldeflist - reproduce FROM clause coldeflist
1412
+ *
1413
+ * When printing a top-level coldeflist (which is syntactically also the
1414
+ * relation's column alias list), use column names from colinfo. But when
1415
+ * printing a coldeflist embedded inside ROWS FROM(), we prefer to use the
1416
+ * original coldeflist's names, which are available in rtfunc->funccolnames.
1417
+ * Pass NULL for colinfo to select the latter behavior.
1418
+ *
1419
+ * The coldeflist is appended immediately (no space) to buf. Caller is
1420
+ * responsible for ensuring that an alias or AS is present before it.
1421
+ */
1422
+
1423
+
1424
+ /*
1425
+ * get_tablesample_def - print a TableSampleClause
1426
+ */
1427
+
1428
+
1429
+ /*
1430
+ * get_opclass_name - fetch name of an index operator class
1431
+ *
1432
+ * The opclass name is appended (after a space) to buf.
1433
+ *
1434
+ * Output is suppressed if the opclass is the default for the given
1435
+ * actual_datatype. (If you don't want this behavior, just pass
1436
+ * InvalidOid for actual_datatype.)
1437
+ */
1438
+
1439
+
1440
+ /*
1441
+ * generate_opclass_name
1442
+ * Compute the name to display for a opclass specified by OID
1443
+ *
1444
+ * The result includes all necessary quoting and schema-prefixing.
1445
+ */
1446
+
1447
+
1448
+ /*
1449
+ * processIndirection - take care of array and subfield assignment
1450
+ *
1451
+ * We strip any top-level FieldStore or assignment SubscriptingRef nodes that
1452
+ * appear in the input, printing them as decoration for the base column
1453
+ * name (which we assume the caller just printed). We might also need to
1454
+ * strip CoerceToDomain nodes, but only ones that appear above assignment
1455
+ * nodes.
1456
+ *
1457
+ * Returns the subexpression that's to be assigned.
1458
+ */
1459
+
1460
+
1461
+
1462
+
1463
+ /*
1464
+ * quote_identifier - Quote an identifier only if needed
1465
+ *
1466
+ * When quotes are needed, we palloc the required space; slightly
1467
+ * space-wasteful but well worth it for notational simplicity.
1468
+ */
1469
+ const char *
1470
+ quote_identifier(const char *ident)
1471
+ {
1472
+ /*
1473
+ * Can avoid quoting if ident starts with a lowercase letter or underscore
1474
+ * and contains only lowercase letters, digits, and underscores, *and* is
1475
+ * not any SQL keyword. Otherwise, supply quotes.
1476
+ */
1477
+ int nquotes = 0;
1478
+ bool safe;
1479
+ const char *ptr;
1480
+ char *result;
1481
+ char *optr;
1482
+
1483
+ /*
1484
+ * would like to use <ctype.h> macros here, but they might yield unwanted
1485
+ * locale-specific results...
1486
+ */
1487
+ safe = ((ident[0] >= 'a' && ident[0] <= 'z') || ident[0] == '_');
1488
+
1489
+ for (ptr = ident; *ptr; ptr++)
1490
+ {
1491
+ char ch = *ptr;
1492
+
1493
+ if ((ch >= 'a' && ch <= 'z') ||
1494
+ (ch >= '0' && ch <= '9') ||
1495
+ (ch == '_'))
1496
+ {
1497
+ /* okay */
1498
+ }
1499
+ else
1500
+ {
1501
+ safe = false;
1502
+ if (ch == '"')
1503
+ nquotes++;
1504
+ }
1505
+ }
1506
+
1507
+ if (quote_all_identifiers)
1508
+ safe = false;
1509
+
1510
+ if (safe)
1511
+ {
1512
+ /*
1513
+ * Check for keyword. We quote keywords except for unreserved ones.
1514
+ * (In some cases we could avoid quoting a col_name or type_func_name
1515
+ * keyword, but it seems much harder than it's worth to tell that.)
1516
+ *
1517
+ * Note: ScanKeywordLookup() does case-insensitive comparison, but
1518
+ * that's fine, since we already know we have all-lower-case.
1519
+ */
1520
+ int kwnum = ScanKeywordLookup(ident, &ScanKeywords);
1521
+
1522
+ if (kwnum >= 0 && ScanKeywordCategories[kwnum] != UNRESERVED_KEYWORD)
1523
+ safe = false;
1524
+ }
1525
+
1526
+ if (safe)
1527
+ return ident; /* no change needed */
1528
+
1529
+ result = (char *) palloc(strlen(ident) + nquotes + 2 + 1);
1530
+
1531
+ optr = result;
1532
+ *optr++ = '"';
1533
+ for (ptr = ident; *ptr; ptr++)
1534
+ {
1535
+ char ch = *ptr;
1536
+
1537
+ if (ch == '"')
1538
+ *optr++ = '"';
1539
+ *optr++ = ch;
1540
+ }
1541
+ *optr++ = '"';
1542
+ *optr = '\0';
1543
+
1544
+ return result;
1545
+ }
1546
+
1547
+ /*
1548
+ * quote_qualified_identifier - Quote a possibly-qualified identifier
1549
+ *
1550
+ * Return a name of the form qualifier.ident, or just ident if qualifier
1551
+ * is NULL, quoting each component if necessary. The result is palloc'd.
1552
+ */
1553
+
1554
+
1555
+ /*
1556
+ * get_relation_name
1557
+ * Get the unqualified name of a relation specified by OID
1558
+ *
1559
+ * This differs from the underlying get_rel_name() function in that it will
1560
+ * throw error instead of silently returning NULL if the OID is bad.
1561
+ */
1562
+
1563
+
1564
+ /*
1565
+ * generate_relation_name
1566
+ * Compute the name to display for a relation specified by OID
1567
+ *
1568
+ * The result includes all necessary quoting and schema-prefixing.
1569
+ *
1570
+ * If namespaces isn't NIL, it must be a list of deparse_namespace nodes.
1571
+ * We will forcibly qualify the relation name if it equals any CTE name
1572
+ * visible in the namespace list.
1573
+ */
1574
+
1575
+
1576
+ /*
1577
+ * generate_qualified_relation_name
1578
+ * Compute the name to display for a relation specified by OID
1579
+ *
1580
+ * As above, but unconditionally schema-qualify the name.
1581
+ */
1582
+
1583
+
1584
+ /*
1585
+ * generate_function_name
1586
+ * Compute the name to display for a function specified by OID,
1587
+ * given that it is being called with the specified actual arg names and
1588
+ * types. (Those matter because of ambiguous-function resolution rules.)
1589
+ *
1590
+ * If we're dealing with a potentially variadic function (in practice, this
1591
+ * means a FuncExpr or Aggref, not some other way of calling a function), then
1592
+ * has_variadic must specify whether variadic arguments have been merged,
1593
+ * and *use_variadic_p will be set to indicate whether to print VARIADIC in
1594
+ * the output. For non-FuncExpr cases, has_variadic should be false and
1595
+ * use_variadic_p can be NULL.
1596
+ *
1597
+ * The result includes all necessary quoting and schema-prefixing.
1598
+ */
1599
+
1600
+
1601
+ /*
1602
+ * generate_operator_name
1603
+ * Compute the name to display for an operator specified by OID,
1604
+ * given that it is being called with the specified actual arg types.
1605
+ * (Arg types matter because of ambiguous-operator resolution rules.
1606
+ * Pass InvalidOid for unused arg of a unary operator.)
1607
+ *
1608
+ * The result includes all necessary quoting and schema-prefixing,
1609
+ * plus the OPERATOR() decoration needed to use a qualified operator name
1610
+ * in an expression.
1611
+ */
1612
+
1613
+
1614
+ /*
1615
+ * generate_operator_clause --- generate a binary-operator WHERE clause
1616
+ *
1617
+ * This is used for internally-generated-and-executed SQL queries, where
1618
+ * precision is essential and readability is secondary. The basic
1619
+ * requirement is to append "leftop op rightop" to buf, where leftop and
1620
+ * rightop are given as strings and are assumed to yield types leftoptype
1621
+ * and rightoptype; the operator is identified by OID. The complexity
1622
+ * comes from needing to be sure that the parser will select the desired
1623
+ * operator when the query is parsed. We always name the operator using
1624
+ * OPERATOR(schema.op) syntax, so as to avoid search-path uncertainties.
1625
+ * We have to emit casts too, if either input isn't already the input type
1626
+ * of the operator; else we are at the mercy of the parser's heuristics for
1627
+ * ambiguous-operator resolution. The caller must ensure that leftop and
1628
+ * rightop are suitable arguments for a cast operation; it's best to insert
1629
+ * parentheses if they aren't just variables or parameters.
1630
+ */
1631
+
1632
+
1633
+ /*
1634
+ * Add a cast specification to buf. We spell out the type name the hard way,
1635
+ * intentionally not using format_type_be(). This is to avoid corner cases
1636
+ * for CHARACTER, BIT, and perhaps other types, where specifying the type
1637
+ * using SQL-standard syntax results in undesirable data truncation. By
1638
+ * doing it this way we can be certain that the cast will have default (-1)
1639
+ * target typmod.
1640
+ */
1641
+
1642
+
1643
+ /*
1644
+ * generate_qualified_type_name
1645
+ * Compute the name to display for a type specified by OID
1646
+ *
1647
+ * This is different from format_type_be() in that we unconditionally
1648
+ * schema-qualify the name. That also means no special syntax for
1649
+ * SQL-standard type names ... although in current usage, this should
1650
+ * only get used for domains, so such cases wouldn't occur anyway.
1651
+ */
1652
+
1653
+
1654
+ /*
1655
+ * generate_collation_name
1656
+ * Compute the name to display for a collation specified by OID
1657
+ *
1658
+ * The result includes all necessary quoting and schema-prefixing.
1659
+ */
1660
+
1661
+
1662
+ /*
1663
+ * Given a C string, produce a TEXT datum.
1664
+ *
1665
+ * We assume that the input was palloc'd and may be freed.
1666
+ */
1667
+
1668
+
1669
+ /*
1670
+ * Generate a C string representing a relation options from text[] datum.
1671
+ */
1672
+
1673
+
1674
+ /*
1675
+ * Generate a C string representing a relation's reloptions, or NULL if none.
1676
+ */
1677
+
1678
+
1679
+ /*
1680
+ * get_range_partbound_string
1681
+ * A C string representation of one range partition bound
1682
+ */
1683
+