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,91 @@
1
+ /*--------------------------------------------------------------------
2
+ * Symbols referenced in this file:
3
+ * - ScanKeywordLookup
4
+ *--------------------------------------------------------------------
5
+ */
6
+
7
+ /*-------------------------------------------------------------------------
8
+ *
9
+ * kwlookup.c
10
+ * Key word lookup for PostgreSQL
11
+ *
12
+ *
13
+ * Portions Copyright (c) 1996-2020, PostgreSQL Global Development Group
14
+ * Portions Copyright (c) 1994, Regents of the University of California
15
+ *
16
+ *
17
+ * IDENTIFICATION
18
+ * src/common/kwlookup.c
19
+ *
20
+ *-------------------------------------------------------------------------
21
+ */
22
+ #include "c.h"
23
+
24
+ #include "common/kwlookup.h"
25
+
26
+
27
+ /*
28
+ * ScanKeywordLookup - see if a given word is a keyword
29
+ *
30
+ * The list of keywords to be matched against is passed as a ScanKeywordList.
31
+ *
32
+ * Returns the keyword number (0..N-1) of the keyword, or -1 if no match.
33
+ * Callers typically use the keyword number to index into information
34
+ * arrays, but that is no concern of this code.
35
+ *
36
+ * The match is done case-insensitively. Note that we deliberately use a
37
+ * dumbed-down case conversion that will only translate 'A'-'Z' into 'a'-'z',
38
+ * even if we are in a locale where tolower() would produce more or different
39
+ * translations. This is to conform to the SQL99 spec, which says that
40
+ * keywords are to be matched in this way even though non-keyword identifiers
41
+ * receive a different case-normalization mapping.
42
+ */
43
+ int
44
+ ScanKeywordLookup(const char *str,
45
+ const ScanKeywordList *keywords)
46
+ {
47
+ size_t len;
48
+ int h;
49
+ const char *kw;
50
+
51
+ /*
52
+ * Reject immediately if too long to be any keyword. This saves useless
53
+ * hashing and downcasing work on long strings.
54
+ */
55
+ len = strlen(str);
56
+ if (len > keywords->max_kw_len)
57
+ return -1;
58
+
59
+ /*
60
+ * Compute the hash function. We assume it was generated to produce
61
+ * case-insensitive results. Since it's a perfect hash, we need only
62
+ * match to the specific keyword it identifies.
63
+ */
64
+ h = keywords->hash(str, len);
65
+
66
+ /* An out-of-range result implies no match */
67
+ if (h < 0 || h >= keywords->num_keywords)
68
+ return -1;
69
+
70
+ /*
71
+ * Compare character-by-character to see if we have a match, applying an
72
+ * ASCII-only downcasing to the input characters. We must not use
73
+ * tolower() since it may produce the wrong translation in some locales
74
+ * (eg, Turkish).
75
+ */
76
+ kw = GetScanKeyword(h, keywords);
77
+ while (*str != '\0')
78
+ {
79
+ char ch = *str++;
80
+
81
+ if (ch >= 'A' && ch <= 'Z')
82
+ ch += 'a' - 'A';
83
+ if (ch != *kw++)
84
+ return -1;
85
+ }
86
+ if (*kw != '\0')
87
+ return -1;
88
+
89
+ /* Success! */
90
+ return h;
91
+ }
@@ -0,0 +1,158 @@
1
+ /*--------------------------------------------------------------------
2
+ * Symbols referenced in this file:
3
+ * - pvsnprintf
4
+ * - psprintf
5
+ *--------------------------------------------------------------------
6
+ */
7
+
8
+ /*-------------------------------------------------------------------------
9
+ *
10
+ * psprintf.c
11
+ * sprintf into an allocated-on-demand buffer
12
+ *
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/common/psprintf.c
20
+ *
21
+ *-------------------------------------------------------------------------
22
+ */
23
+
24
+ #ifndef FRONTEND
25
+
26
+ #include "postgres.h"
27
+
28
+ #include "utils/memutils.h"
29
+
30
+ #else
31
+
32
+ #include "postgres_fe.h"
33
+
34
+ /* It's possible we could use a different value for this in frontend code */
35
+ #define MaxAllocSize ((Size) 0x3fffffff) /* 1 gigabyte - 1 */
36
+
37
+ #endif
38
+
39
+
40
+ /*
41
+ * psprintf
42
+ *
43
+ * Format text data under the control of fmt (an sprintf-style format string)
44
+ * and return it in an allocated-on-demand buffer. The buffer is allocated
45
+ * with palloc in the backend, or malloc in frontend builds. Caller is
46
+ * responsible to free the buffer when no longer needed, if appropriate.
47
+ *
48
+ * Errors are not returned to the caller, but are reported via elog(ERROR)
49
+ * in the backend, or printf-to-stderr-and-exit() in frontend builds.
50
+ * One should therefore think twice about using this in libpq.
51
+ */
52
+ char *
53
+ psprintf(const char *fmt,...)
54
+ {
55
+ int save_errno = errno;
56
+ size_t len = 128; /* initial assumption about buffer size */
57
+
58
+ for (;;)
59
+ {
60
+ char *result;
61
+ va_list args;
62
+ size_t newlen;
63
+
64
+ /*
65
+ * Allocate result buffer. Note that in frontend this maps to malloc
66
+ * with exit-on-error.
67
+ */
68
+ result = (char *) palloc(len);
69
+
70
+ /* Try to format the data. */
71
+ errno = save_errno;
72
+ va_start(args, fmt);
73
+ newlen = pvsnprintf(result, len, fmt, args);
74
+ va_end(args);
75
+
76
+ if (newlen < len)
77
+ return result; /* success */
78
+
79
+ /* Release buffer and loop around to try again with larger len. */
80
+ pfree(result);
81
+ len = newlen;
82
+ }
83
+ }
84
+
85
+ /*
86
+ * pvsnprintf
87
+ *
88
+ * Attempt to format text data under the control of fmt (an sprintf-style
89
+ * format string) and insert it into buf (which has length len).
90
+ *
91
+ * If successful, return the number of bytes emitted, not counting the
92
+ * trailing zero byte. This will always be strictly less than len.
93
+ *
94
+ * If there's not enough space in buf, return an estimate of the buffer size
95
+ * needed to succeed (this *must* be more than the given len, else callers
96
+ * might loop infinitely).
97
+ *
98
+ * Other error cases do not return, but exit via elog(ERROR) or exit().
99
+ * Hence, this shouldn't be used inside libpq.
100
+ *
101
+ * Caution: callers must be sure to preserve their entry-time errno
102
+ * when looping, in case the fmt contains "%m".
103
+ *
104
+ * Note that the semantics of the return value are not exactly C99's.
105
+ * First, we don't promise that the estimated buffer size is exactly right;
106
+ * callers must be prepared to loop multiple times to get the right size.
107
+ * (Given a C99-compliant vsnprintf, that won't happen, but it is rumored
108
+ * that some implementations don't always return the same value ...)
109
+ * Second, we return the recommended buffer size, not one less than that;
110
+ * this lets overflow concerns be handled here rather than in the callers.
111
+ */
112
+ size_t
113
+ pvsnprintf(char *buf, size_t len, const char *fmt, va_list args)
114
+ {
115
+ int nprinted;
116
+
117
+ nprinted = vsnprintf(buf, len, fmt, args);
118
+
119
+ /* We assume failure means the fmt is bogus, hence hard failure is OK */
120
+ if (unlikely(nprinted < 0))
121
+ {
122
+ #ifndef FRONTEND
123
+ elog(ERROR, "vsnprintf failed: %m with format string \"%s\"", fmt);
124
+ #else
125
+ fprintf(stderr, "vsnprintf failed: %s with format string \"%s\"\n",
126
+ strerror(errno), fmt);
127
+ exit(EXIT_FAILURE);
128
+ #endif
129
+ }
130
+
131
+ if ((size_t) nprinted < len)
132
+ {
133
+ /* Success. Note nprinted does not include trailing null. */
134
+ return (size_t) nprinted;
135
+ }
136
+
137
+ /*
138
+ * We assume a C99-compliant vsnprintf, so believe its estimate of the
139
+ * required space, and add one for the trailing null. (If it's wrong, the
140
+ * logic will still work, but we may loop multiple times.)
141
+ *
142
+ * Choke if the required space would exceed MaxAllocSize. Note we use
143
+ * this palloc-oriented overflow limit even when in frontend.
144
+ */
145
+ if (unlikely((size_t) nprinted > MaxAllocSize - 1))
146
+ {
147
+ #ifndef FRONTEND
148
+ ereport(ERROR,
149
+ (errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED),
150
+ errmsg("out of memory")));
151
+ #else
152
+ fprintf(stderr, _("out of memory\n"));
153
+ exit(EXIT_FAILURE);
154
+ #endif
155
+ }
156
+
157
+ return nprinted + 1;
158
+ }
@@ -0,0 +1,86 @@
1
+ /*--------------------------------------------------------------------
2
+ * Symbols referenced in this file:
3
+ * - strtoint
4
+ *--------------------------------------------------------------------
5
+ */
6
+
7
+ /*-------------------------------------------------------------------------
8
+ *
9
+ * string.c
10
+ * string handling helpers
11
+ *
12
+ *
13
+ * Portions Copyright (c) 1996-2020, PostgreSQL Global Development Group
14
+ * Portions Copyright (c) 1994, Regents of the University of California
15
+ *
16
+ *
17
+ * IDENTIFICATION
18
+ * src/common/string.c
19
+ *
20
+ *-------------------------------------------------------------------------
21
+ */
22
+
23
+
24
+ #ifndef FRONTEND
25
+ #include "postgres.h"
26
+ #else
27
+ #include "postgres_fe.h"
28
+ #endif
29
+
30
+ #include "common/string.h"
31
+
32
+
33
+ /*
34
+ * Returns whether the string `str' has the postfix `end'.
35
+ */
36
+
37
+
38
+
39
+ /*
40
+ * strtoint --- just like strtol, but returns int not long
41
+ */
42
+ int
43
+ strtoint(const char *pg_restrict str, char **pg_restrict endptr, int base)
44
+ {
45
+ long val;
46
+
47
+ val = strtol(str, endptr, base);
48
+ if (val != (int) val)
49
+ errno = ERANGE;
50
+ return (int) val;
51
+ }
52
+
53
+
54
+ /*
55
+ * pg_clean_ascii -- Replace any non-ASCII chars with a '?' char
56
+ *
57
+ * Modifies the string passed in which must be '\0'-terminated.
58
+ *
59
+ * This function exists specifically to deal with filtering out
60
+ * non-ASCII characters in a few places where the client can provide an almost
61
+ * arbitrary string (and it isn't checked to ensure it's a valid username or
62
+ * database name or similar) and we don't want to have control characters or other
63
+ * things ending up in the log file where server admins might end up with a
64
+ * messed up terminal when looking at them.
65
+ *
66
+ * In general, this function should NOT be used- instead, consider how to handle
67
+ * the string without needing to filter out the non-ASCII characters.
68
+ *
69
+ * Ultimately, we'd like to improve the situation to not require stripping out
70
+ * all non-ASCII but perform more intelligent filtering which would allow UTF or
71
+ * similar, but it's unclear exactly what we should allow, so stick to ASCII only
72
+ * for now.
73
+ */
74
+
75
+
76
+
77
+ /*
78
+ * pg_strip_crlf -- Remove any trailing newline and carriage return
79
+ *
80
+ * Removes any trailing newline and carriage return characters (\r on
81
+ * Windows) in the input string, zero-terminating it.
82
+ *
83
+ * The passed in string must be zero-terminated. This function returns
84
+ * the new length of the string.
85
+ */
86
+
@@ -0,0 +1,336 @@
1
+ /*--------------------------------------------------------------------
2
+ * Symbols referenced in this file:
3
+ * - initStringInfo
4
+ * - resetStringInfo
5
+ * - appendStringInfoString
6
+ * - appendBinaryStringInfo
7
+ * - appendStringInfoChar
8
+ * - appendStringInfoVA
9
+ * - enlargeStringInfo
10
+ * - appendStringInfo
11
+ * - appendStringInfoSpaces
12
+ *--------------------------------------------------------------------
13
+ */
14
+
15
+ /*-------------------------------------------------------------------------
16
+ *
17
+ * stringinfo.c
18
+ *
19
+ * StringInfo provides an extensible string data type (currently limited to a
20
+ * length of 1GB). It can be used to buffer either ordinary C strings
21
+ * (null-terminated text) or arbitrary binary data. All storage is allocated
22
+ * with palloc() (falling back to malloc in frontend code).
23
+ *
24
+ * Portions Copyright (c) 1996-2020, PostgreSQL Global Development Group
25
+ * Portions Copyright (c) 1994, Regents of the University of California
26
+ *
27
+ * src/common/stringinfo.c
28
+ *
29
+ *-------------------------------------------------------------------------
30
+ */
31
+
32
+ #ifndef FRONTEND
33
+
34
+ #include "postgres.h"
35
+ #include "utils/memutils.h"
36
+
37
+ #else
38
+
39
+ #include "postgres_fe.h"
40
+
41
+ /* It's possible we could use a different value for this in frontend code */
42
+ #define MaxAllocSize ((Size) 0x3fffffff) /* 1 gigabyte - 1 */
43
+
44
+ #endif
45
+
46
+ #include "lib/stringinfo.h"
47
+
48
+
49
+ /*
50
+ * makeStringInfo
51
+ *
52
+ * Create an empty 'StringInfoData' & return a pointer to it.
53
+ */
54
+
55
+
56
+ /*
57
+ * initStringInfo
58
+ *
59
+ * Initialize a StringInfoData struct (with previously undefined contents)
60
+ * to describe an empty string.
61
+ */
62
+ void
63
+ initStringInfo(StringInfo str)
64
+ {
65
+ int size = 1024; /* initial default buffer size */
66
+
67
+ str->data = (char *) palloc(size);
68
+ str->maxlen = size;
69
+ resetStringInfo(str);
70
+ }
71
+
72
+ /*
73
+ * resetStringInfo
74
+ *
75
+ * Reset the StringInfo: the data buffer remains valid, but its
76
+ * previous content, if any, is cleared.
77
+ */
78
+ void
79
+ resetStringInfo(StringInfo str)
80
+ {
81
+ str->data[0] = '\0';
82
+ str->len = 0;
83
+ str->cursor = 0;
84
+ }
85
+
86
+ /*
87
+ * appendStringInfo
88
+ *
89
+ * Format text data under the control of fmt (an sprintf-style format string)
90
+ * and append it to whatever is already in str. More space is allocated
91
+ * to str if necessary. This is sort of like a combination of sprintf and
92
+ * strcat.
93
+ */
94
+ void
95
+ appendStringInfo(StringInfo str, const char *fmt,...)
96
+ {
97
+ int save_errno = errno;
98
+
99
+ for (;;)
100
+ {
101
+ va_list args;
102
+ int needed;
103
+
104
+ /* Try to format the data. */
105
+ errno = save_errno;
106
+ va_start(args, fmt);
107
+ needed = appendStringInfoVA(str, fmt, args);
108
+ va_end(args);
109
+
110
+ if (needed == 0)
111
+ break; /* success */
112
+
113
+ /* Increase the buffer size and try again. */
114
+ enlargeStringInfo(str, needed);
115
+ }
116
+ }
117
+
118
+ /*
119
+ * appendStringInfoVA
120
+ *
121
+ * Attempt to format text data under the control of fmt (an sprintf-style
122
+ * format string) and append it to whatever is already in str. If successful
123
+ * return zero; if not (because there's not enough space), return an estimate
124
+ * of the space needed, without modifying str. Typically the caller should
125
+ * pass the return value to enlargeStringInfo() before trying again; see
126
+ * appendStringInfo for standard usage pattern.
127
+ *
128
+ * Caution: callers must be sure to preserve their entry-time errno
129
+ * when looping, in case the fmt contains "%m".
130
+ *
131
+ * XXX This API is ugly, but there seems no alternative given the C spec's
132
+ * restrictions on what can portably be done with va_list arguments: you have
133
+ * to redo va_start before you can rescan the argument list, and we can't do
134
+ * that from here.
135
+ */
136
+ int
137
+ appendStringInfoVA(StringInfo str, const char *fmt, va_list args)
138
+ {
139
+ int avail;
140
+ size_t nprinted;
141
+
142
+ Assert(str != NULL);
143
+
144
+ /*
145
+ * If there's hardly any space, don't bother trying, just fail to make the
146
+ * caller enlarge the buffer first. We have to guess at how much to
147
+ * enlarge, since we're skipping the formatting work.
148
+ */
149
+ avail = str->maxlen - str->len;
150
+ if (avail < 16)
151
+ return 32;
152
+
153
+ nprinted = pvsnprintf(str->data + str->len, (size_t) avail, fmt, args);
154
+
155
+ if (nprinted < (size_t) avail)
156
+ {
157
+ /* Success. Note nprinted does not include trailing null. */
158
+ str->len += (int) nprinted;
159
+ return 0;
160
+ }
161
+
162
+ /* Restore the trailing null so that str is unmodified. */
163
+ str->data[str->len] = '\0';
164
+
165
+ /*
166
+ * Return pvsnprintf's estimate of the space needed. (Although this is
167
+ * given as a size_t, we know it will fit in int because it's not more
168
+ * than MaxAllocSize.)
169
+ */
170
+ return (int) nprinted;
171
+ }
172
+
173
+ /*
174
+ * appendStringInfoString
175
+ *
176
+ * Append a null-terminated string to str.
177
+ * Like appendStringInfo(str, "%s", s) but faster.
178
+ */
179
+ void
180
+ appendStringInfoString(StringInfo str, const char *s)
181
+ {
182
+ appendBinaryStringInfo(str, s, strlen(s));
183
+ }
184
+
185
+ /*
186
+ * appendStringInfoChar
187
+ *
188
+ * Append a single byte to str.
189
+ * Like appendStringInfo(str, "%c", ch) but much faster.
190
+ */
191
+ void
192
+ appendStringInfoChar(StringInfo str, char ch)
193
+ {
194
+ /* Make more room if needed */
195
+ if (str->len + 1 >= str->maxlen)
196
+ enlargeStringInfo(str, 1);
197
+
198
+ /* OK, append the character */
199
+ str->data[str->len] = ch;
200
+ str->len++;
201
+ str->data[str->len] = '\0';
202
+ }
203
+
204
+ /*
205
+ * appendStringInfoSpaces
206
+ *
207
+ * Append the specified number of spaces to a buffer.
208
+ */
209
+ void
210
+ appendStringInfoSpaces(StringInfo str, int count)
211
+ {
212
+ if (count > 0)
213
+ {
214
+ /* Make more room if needed */
215
+ enlargeStringInfo(str, count);
216
+
217
+ /* OK, append the spaces */
218
+ while (--count >= 0)
219
+ str->data[str->len++] = ' ';
220
+ str->data[str->len] = '\0';
221
+ }
222
+ }
223
+
224
+ /*
225
+ * appendBinaryStringInfo
226
+ *
227
+ * Append arbitrary binary data to a StringInfo, allocating more space
228
+ * if necessary. Ensures that a trailing null byte is present.
229
+ */
230
+ void
231
+ appendBinaryStringInfo(StringInfo str, const char *data, int datalen)
232
+ {
233
+ Assert(str != NULL);
234
+
235
+ /* Make more room if needed */
236
+ enlargeStringInfo(str, datalen);
237
+
238
+ /* OK, append the data */
239
+ memcpy(str->data + str->len, data, datalen);
240
+ str->len += datalen;
241
+
242
+ /*
243
+ * Keep a trailing null in place, even though it's probably useless for
244
+ * binary data. (Some callers are dealing with text but call this because
245
+ * their input isn't null-terminated.)
246
+ */
247
+ str->data[str->len] = '\0';
248
+ }
249
+
250
+ /*
251
+ * appendBinaryStringInfoNT
252
+ *
253
+ * Append arbitrary binary data to a StringInfo, allocating more space
254
+ * if necessary. Does not ensure a trailing null-byte exists.
255
+ */
256
+
257
+
258
+ /*
259
+ * enlargeStringInfo
260
+ *
261
+ * Make sure there is enough space for 'needed' more bytes
262
+ * ('needed' does not include the terminating null).
263
+ *
264
+ * External callers usually need not concern themselves with this, since
265
+ * all stringinfo.c routines do it automatically. However, if a caller
266
+ * knows that a StringInfo will eventually become X bytes large, it
267
+ * can save some palloc overhead by enlarging the buffer before starting
268
+ * to store data in it.
269
+ *
270
+ * NB: In the backend, because we use repalloc() to enlarge the buffer, the
271
+ * string buffer will remain allocated in the same memory context that was
272
+ * current when initStringInfo was called, even if another context is now
273
+ * current. This is the desired and indeed critical behavior!
274
+ */
275
+ void
276
+ enlargeStringInfo(StringInfo str, int needed)
277
+ {
278
+ int newlen;
279
+
280
+ /*
281
+ * Guard against out-of-range "needed" values. Without this, we can get
282
+ * an overflow or infinite loop in the following.
283
+ */
284
+ if (needed < 0) /* should not happen */
285
+ {
286
+ #ifndef FRONTEND
287
+ elog(ERROR, "invalid string enlargement request size: %d", needed);
288
+ #else
289
+ fprintf(stderr, "invalid string enlargement request size: %d\n", needed);
290
+ exit(EXIT_FAILURE);
291
+ #endif
292
+ }
293
+ if (((Size) needed) >= (MaxAllocSize - (Size) str->len))
294
+ {
295
+ #ifndef FRONTEND
296
+ ereport(ERROR,
297
+ (errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED),
298
+ errmsg("out of memory"),
299
+ errdetail("Cannot enlarge string buffer containing %d bytes by %d more bytes.",
300
+ str->len, needed)));
301
+ #else
302
+ fprintf(stderr,
303
+ _("out of memory\n\nCannot enlarge string buffer containing %d bytes by %d more bytes.\n"),
304
+ str->len, needed);
305
+ exit(EXIT_FAILURE);
306
+ #endif
307
+ }
308
+
309
+ needed += str->len + 1; /* total space required now */
310
+
311
+ /* Because of the above test, we now have needed <= MaxAllocSize */
312
+
313
+ if (needed <= str->maxlen)
314
+ return; /* got enough space already */
315
+
316
+ /*
317
+ * We don't want to allocate just a little more space with each append;
318
+ * for efficiency, double the buffer size each time it overflows.
319
+ * Actually, we might need to more than double it if 'needed' is big...
320
+ */
321
+ newlen = 2 * str->maxlen;
322
+ while (needed > newlen)
323
+ newlen = 2 * newlen;
324
+
325
+ /*
326
+ * Clamp to MaxAllocSize in case we went past it. Note we are assuming
327
+ * here that MaxAllocSize <= INT_MAX/2, else the above loop could
328
+ * overflow. We will still have newlen >= needed.
329
+ */
330
+ if (newlen > (int) MaxAllocSize)
331
+ newlen = (int) MaxAllocSize;
332
+
333
+ str->data = (char *) repalloc(str->data, newlen);
334
+
335
+ str->maxlen = newlen;
336
+ }