pg_query 1.3.0 → 2.1.0

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 +237 -117
  3. data/README.md +84 -65
  4. data/Rakefile +71 -5
  5. data/ext/pg_query/extconf.rb +4 -38
  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 +1334 -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 +620 -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 +2523 -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 +257 -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 +357 -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 +2438 -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 +2879 -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 +1110 -0
  252. data/ext/pg_query/include/protobuf-c/protobuf-c.h +1110 -0
  253. data/ext/pg_query/include/protobuf/pg_query.pb-c.h +10851 -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 +459 -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 +198 -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 +37643 -0
  380. data/ext/pg_query/pg_query_deparse.c +9965 -0
  381. data/ext/pg_query/pg_query_fingerprint.c +367 -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 +491 -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 +3667 -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 +1042 -0
  432. data/ext/pg_query/src_common_encnames.c +158 -0
  433. data/ext/pg_query/src_common_hashfn.c +420 -0
  434. data/ext/pg_query/src_common_keywords.c +39 -0
  435. data/ext/pg_query/src_common_kwlist_d.h +1081 -0
  436. data/ext/pg_query/src_common_kwlookup.c +91 -0
  437. data/ext/pg_query/src_common_psprintf.c +158 -0
  438. data/ext/pg_query/src_common_string.c +86 -0
  439. data/ext/pg_query/src_common_stringinfo.c +336 -0
  440. data/ext/pg_query/src_common_wchar.c +1651 -0
  441. data/ext/pg_query/src_pl_plpgsql_src_pl_comp.c +1133 -0
  442. data/ext/pg_query/src_pl_plpgsql_src_pl_funcs.c +877 -0
  443. data/ext/pg_query/src_pl_plpgsql_src_pl_gram.c +6533 -0
  444. data/ext/pg_query/src_pl_plpgsql_src_pl_handler.c +107 -0
  445. data/ext/pg_query/src_pl_plpgsql_src_pl_reserved_kwlist_d.h +123 -0
  446. data/ext/pg_query/src_pl_plpgsql_src_pl_scanner.c +671 -0
  447. data/ext/pg_query/src_pl_plpgsql_src_pl_unreserved_kwlist_d.h +255 -0
  448. data/ext/pg_query/src_port_erand48.c +127 -0
  449. data/ext/pg_query/src_port_pg_bitutils.c +246 -0
  450. data/ext/pg_query/src_port_pgsleep.c +69 -0
  451. data/ext/pg_query/src_port_pgstrcasecmp.c +83 -0
  452. data/ext/pg_query/src_port_qsort.c +240 -0
  453. data/ext/pg_query/src_port_random.c +31 -0
  454. data/ext/pg_query/src_port_snprintf.c +1449 -0
  455. data/ext/pg_query/src_port_strerror.c +324 -0
  456. data/ext/pg_query/src_port_strnlen.c +39 -0
  457. data/ext/pg_query/xxhash.c +43 -0
  458. data/lib/pg_query.rb +6 -4
  459. data/lib/pg_query/constants.rb +21 -0
  460. data/lib/pg_query/deparse.rb +15 -1673
  461. data/lib/pg_query/filter_columns.rb +88 -85
  462. data/lib/pg_query/fingerprint.rb +120 -87
  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 +274 -202
  466. data/lib/pg_query/parse_error.rb +1 -1
  467. data/lib/pg_query/pg_query_pb.rb +3213 -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 -297
@@ -0,0 +1,1042 @@
1
+ /*--------------------------------------------------------------------
2
+ * Symbols referenced in this file:
3
+ * - ErrorContext
4
+ * - MemoryContextReset
5
+ * - MemoryContextDeleteChildren
6
+ * - MemoryContextDelete
7
+ * - TopMemoryContext
8
+ * - CurrentMemoryContext
9
+ * - MemoryContextSetParent
10
+ * - MemoryContextCallResetCallbacks
11
+ * - MemoryContextResetOnly
12
+ * - repalloc
13
+ * - MemoryContextStats
14
+ * - MemoryContextStatsDetail
15
+ * - MemoryContextStatsInternal
16
+ * - MemoryContextStatsPrint
17
+ * - pfree
18
+ * - pstrdup
19
+ * - MemoryContextStrdup
20
+ * - MemoryContextAlloc
21
+ * - palloc
22
+ * - MemoryContextAllocZeroAligned
23
+ * - MemoryContextAllocZero
24
+ * - palloc0
25
+ * - MemoryContextCreate
26
+ * - MemoryContextInit
27
+ * - MemoryContextAllowInCriticalSection
28
+ * - CurrentMemoryContext
29
+ * - MemoryContextDelete
30
+ * - palloc0
31
+ * - MemoryContextAllocExtended
32
+ *--------------------------------------------------------------------
33
+ */
34
+
35
+ /*-------------------------------------------------------------------------
36
+ *
37
+ * mcxt.c
38
+ * POSTGRES memory context management code.
39
+ *
40
+ * This module handles context management operations that are independent
41
+ * of the particular kind of context being operated on. It calls
42
+ * context-type-specific operations via the function pointers in a
43
+ * context's MemoryContextMethods struct.
44
+ *
45
+ *
46
+ * Portions Copyright (c) 1996-2020, PostgreSQL Global Development Group
47
+ * Portions Copyright (c) 1994, Regents of the University of California
48
+ *
49
+ *
50
+ * IDENTIFICATION
51
+ * src/backend/utils/mmgr/mcxt.c
52
+ *
53
+ *-------------------------------------------------------------------------
54
+ */
55
+
56
+ #include "postgres.h"
57
+
58
+ #include "mb/pg_wchar.h"
59
+ #include "miscadmin.h"
60
+ #include "utils/memdebug.h"
61
+ #include "utils/memutils.h"
62
+
63
+
64
+ /*****************************************************************************
65
+ * GLOBAL MEMORY *
66
+ *****************************************************************************/
67
+
68
+ /*
69
+ * CurrentMemoryContext
70
+ * Default memory context for allocations.
71
+ */
72
+ __thread MemoryContext CurrentMemoryContext = NULL;
73
+
74
+
75
+ /*
76
+ * Standard top-level contexts. For a description of the purpose of each
77
+ * of these contexts, refer to src/backend/utils/mmgr/README
78
+ */
79
+ __thread MemoryContext TopMemoryContext = NULL;
80
+
81
+ __thread MemoryContext ErrorContext = NULL;
82
+
83
+
84
+
85
+
86
+
87
+
88
+
89
+ /* This is a transient link to the active portal's memory context: */
90
+
91
+
92
+ static void MemoryContextCallResetCallbacks(MemoryContext context);
93
+ static void MemoryContextStatsInternal(MemoryContext context, int level,
94
+ bool print, int max_children,
95
+ MemoryContextCounters *totals);
96
+ static void MemoryContextStatsPrint(MemoryContext context, void *passthru,
97
+ const char *stats_string);
98
+
99
+ /*
100
+ * You should not do memory allocations within a critical section, because
101
+ * an out-of-memory error will be escalated to a PANIC. To enforce that
102
+ * rule, the allocation functions Assert that.
103
+ */
104
+ #define AssertNotInCriticalSection(context) \
105
+ Assert(CritSectionCount == 0 || (context)->allowInCritSection)
106
+
107
+ /*****************************************************************************
108
+ * EXPORTED ROUTINES *
109
+ *****************************************************************************/
110
+
111
+
112
+ /*
113
+ * MemoryContextInit
114
+ * Start up the memory-context subsystem.
115
+ *
116
+ * This must be called before creating contexts or allocating memory in
117
+ * contexts. TopMemoryContext and ErrorContext are initialized here;
118
+ * other contexts must be created afterwards.
119
+ *
120
+ * In normal multi-backend operation, this is called once during
121
+ * postmaster startup, and not at all by individual backend startup
122
+ * (since the backends inherit an already-initialized context subsystem
123
+ * by virtue of being forked off the postmaster). But in an EXEC_BACKEND
124
+ * build, each process must do this for itself.
125
+ *
126
+ * In a standalone backend this must be called during backend startup.
127
+ */
128
+ void
129
+ MemoryContextInit(void)
130
+ {
131
+ AssertState(TopMemoryContext == NULL);
132
+
133
+ /*
134
+ * First, initialize TopMemoryContext, which is the parent of all others.
135
+ */
136
+ TopMemoryContext = AllocSetContextCreate((MemoryContext) NULL,
137
+ "TopMemoryContext",
138
+ ALLOCSET_DEFAULT_SIZES);
139
+
140
+ /*
141
+ * Not having any other place to point CurrentMemoryContext, make it point
142
+ * to TopMemoryContext. Caller should change this soon!
143
+ */
144
+ CurrentMemoryContext = TopMemoryContext;
145
+
146
+ /*
147
+ * Initialize ErrorContext as an AllocSetContext with slow growth rate ---
148
+ * we don't really expect much to be allocated in it. More to the point,
149
+ * require it to contain at least 8K at all times. This is the only case
150
+ * where retained memory in a context is *essential* --- we want to be
151
+ * sure ErrorContext still has some memory even if we've run out
152
+ * elsewhere! Also, allow allocations in ErrorContext within a critical
153
+ * section. Otherwise a PANIC will cause an assertion failure in the error
154
+ * reporting code, before printing out the real cause of the failure.
155
+ *
156
+ * This should be the last step in this function, as elog.c assumes memory
157
+ * management works once ErrorContext is non-null.
158
+ */
159
+ ErrorContext = AllocSetContextCreate(TopMemoryContext,
160
+ "ErrorContext",
161
+ 8 * 1024,
162
+ 8 * 1024,
163
+ 8 * 1024);
164
+ MemoryContextAllowInCriticalSection(ErrorContext, true);
165
+ }
166
+
167
+ /*
168
+ * MemoryContextReset
169
+ * Release all space allocated within a context and delete all its
170
+ * descendant contexts (but not the named context itself).
171
+ */
172
+ void
173
+ MemoryContextReset(MemoryContext context)
174
+ {
175
+ AssertArg(MemoryContextIsValid(context));
176
+
177
+ /* save a function call in common case where there are no children */
178
+ if (context->firstchild != NULL)
179
+ MemoryContextDeleteChildren(context);
180
+
181
+ /* save a function call if no pallocs since startup or last reset */
182
+ if (!context->isReset)
183
+ MemoryContextResetOnly(context);
184
+ }
185
+
186
+ /*
187
+ * MemoryContextResetOnly
188
+ * Release all space allocated within a context.
189
+ * Nothing is done to the context's descendant contexts.
190
+ */
191
+ void
192
+ MemoryContextResetOnly(MemoryContext context)
193
+ {
194
+ AssertArg(MemoryContextIsValid(context));
195
+
196
+ /* Nothing to do if no pallocs since startup or last reset */
197
+ if (!context->isReset)
198
+ {
199
+ MemoryContextCallResetCallbacks(context);
200
+
201
+ /*
202
+ * If context->ident points into the context's memory, it will become
203
+ * a dangling pointer. We could prevent that by setting it to NULL
204
+ * here, but that would break valid coding patterns that keep the
205
+ * ident elsewhere, e.g. in a parent context. Another idea is to use
206
+ * MemoryContextContains(), but we don't require ident strings to be
207
+ * in separately-palloc'd chunks, so that risks false positives. So
208
+ * for now we assume the programmer got it right.
209
+ */
210
+
211
+ context->methods->reset(context);
212
+ context->isReset = true;
213
+ VALGRIND_DESTROY_MEMPOOL(context);
214
+ VALGRIND_CREATE_MEMPOOL(context, 0, false);
215
+ }
216
+ }
217
+
218
+ /*
219
+ * MemoryContextResetChildren
220
+ * Release all space allocated within a context's descendants,
221
+ * but don't delete the contexts themselves. The named context
222
+ * itself is not touched.
223
+ */
224
+
225
+
226
+ /*
227
+ * MemoryContextDelete
228
+ * Delete a context and its descendants, and release all space
229
+ * allocated therein.
230
+ *
231
+ * The type-specific delete routine removes all storage for the context,
232
+ * but we have to recurse to handle the children.
233
+ * We must also delink the context from its parent, if it has one.
234
+ */
235
+ void
236
+ MemoryContextDelete(MemoryContext context)
237
+ {
238
+ AssertArg(MemoryContextIsValid(context));
239
+ /* We had better not be deleting TopMemoryContext ... */
240
+ Assert(context != TopMemoryContext);
241
+ /* And not CurrentMemoryContext, either */
242
+ Assert(context != CurrentMemoryContext);
243
+
244
+ /* save a function call in common case where there are no children */
245
+ if (context->firstchild != NULL)
246
+ MemoryContextDeleteChildren(context);
247
+
248
+ /*
249
+ * It's not entirely clear whether 'tis better to do this before or after
250
+ * delinking the context; but an error in a callback will likely result in
251
+ * leaking the whole context (if it's not a root context) if we do it
252
+ * after, so let's do it before.
253
+ */
254
+ MemoryContextCallResetCallbacks(context);
255
+
256
+ /*
257
+ * We delink the context from its parent before deleting it, so that if
258
+ * there's an error we won't have deleted/busted contexts still attached
259
+ * to the context tree. Better a leak than a crash.
260
+ */
261
+ MemoryContextSetParent(context, NULL);
262
+
263
+ /*
264
+ * Also reset the context's ident pointer, in case it points into the
265
+ * context. This would only matter if someone tries to get stats on the
266
+ * (already unlinked) context, which is unlikely, but let's be safe.
267
+ */
268
+ context->ident = NULL;
269
+
270
+ context->methods->delete_context(context);
271
+
272
+ VALGRIND_DESTROY_MEMPOOL(context);
273
+ }
274
+
275
+ /*
276
+ * MemoryContextDeleteChildren
277
+ * Delete all the descendants of the named context and release all
278
+ * space allocated therein. The named context itself is not touched.
279
+ */
280
+ void
281
+ MemoryContextDeleteChildren(MemoryContext context)
282
+ {
283
+ AssertArg(MemoryContextIsValid(context));
284
+
285
+ /*
286
+ * MemoryContextDelete will delink the child from me, so just iterate as
287
+ * long as there is a child.
288
+ */
289
+ while (context->firstchild != NULL)
290
+ MemoryContextDelete(context->firstchild);
291
+ }
292
+
293
+ /*
294
+ * MemoryContextRegisterResetCallback
295
+ * Register a function to be called before next context reset/delete.
296
+ * Such callbacks will be called in reverse order of registration.
297
+ *
298
+ * The caller is responsible for allocating a MemoryContextCallback struct
299
+ * to hold the info about this callback request, and for filling in the
300
+ * "func" and "arg" fields in the struct to show what function to call with
301
+ * what argument. Typically the callback struct should be allocated within
302
+ * the specified context, since that means it will automatically be freed
303
+ * when no longer needed.
304
+ *
305
+ * There is no API for deregistering a callback once registered. If you
306
+ * want it to not do anything anymore, adjust the state pointed to by its
307
+ * "arg" to indicate that.
308
+ */
309
+
310
+
311
+ /*
312
+ * MemoryContextCallResetCallbacks
313
+ * Internal function to call all registered callbacks for context.
314
+ */
315
+ static void
316
+ MemoryContextCallResetCallbacks(MemoryContext context)
317
+ {
318
+ MemoryContextCallback *cb;
319
+
320
+ /*
321
+ * We pop each callback from the list before calling. That way, if an
322
+ * error occurs inside the callback, we won't try to call it a second time
323
+ * in the likely event that we reset or delete the context later.
324
+ */
325
+ while ((cb = context->reset_cbs) != NULL)
326
+ {
327
+ context->reset_cbs = cb->next;
328
+ cb->func(cb->arg);
329
+ }
330
+ }
331
+
332
+ /*
333
+ * MemoryContextSetIdentifier
334
+ * Set the identifier string for a memory context.
335
+ *
336
+ * An identifier can be provided to help distinguish among different contexts
337
+ * of the same kind in memory context stats dumps. The identifier string
338
+ * must live at least as long as the context it is for; typically it is
339
+ * allocated inside that context, so that it automatically goes away on
340
+ * context deletion. Pass id = NULL to forget any old identifier.
341
+ */
342
+
343
+
344
+ /*
345
+ * MemoryContextSetParent
346
+ * Change a context to belong to a new parent (or no parent).
347
+ *
348
+ * We provide this as an API function because it is sometimes useful to
349
+ * change a context's lifespan after creation. For example, a context
350
+ * might be created underneath a transient context, filled with data,
351
+ * and then reparented underneath CacheMemoryContext to make it long-lived.
352
+ * In this way no special effort is needed to get rid of the context in case
353
+ * a failure occurs before its contents are completely set up.
354
+ *
355
+ * Callers often assume that this function cannot fail, so don't put any
356
+ * elog(ERROR) calls in it.
357
+ *
358
+ * A possible caller error is to reparent a context under itself, creating
359
+ * a loop in the context graph. We assert here that context != new_parent,
360
+ * but checking for multi-level loops seems more trouble than it's worth.
361
+ */
362
+ void
363
+ MemoryContextSetParent(MemoryContext context, MemoryContext new_parent)
364
+ {
365
+ AssertArg(MemoryContextIsValid(context));
366
+ AssertArg(context != new_parent);
367
+
368
+ /* Fast path if it's got correct parent already */
369
+ if (new_parent == context->parent)
370
+ return;
371
+
372
+ /* Delink from existing parent, if any */
373
+ if (context->parent)
374
+ {
375
+ MemoryContext parent = context->parent;
376
+
377
+ if (context->prevchild != NULL)
378
+ context->prevchild->nextchild = context->nextchild;
379
+ else
380
+ {
381
+ Assert(parent->firstchild == context);
382
+ parent->firstchild = context->nextchild;
383
+ }
384
+
385
+ if (context->nextchild != NULL)
386
+ context->nextchild->prevchild = context->prevchild;
387
+ }
388
+
389
+ /* And relink */
390
+ if (new_parent)
391
+ {
392
+ AssertArg(MemoryContextIsValid(new_parent));
393
+ context->parent = new_parent;
394
+ context->prevchild = NULL;
395
+ context->nextchild = new_parent->firstchild;
396
+ if (new_parent->firstchild != NULL)
397
+ new_parent->firstchild->prevchild = context;
398
+ new_parent->firstchild = context;
399
+ }
400
+ else
401
+ {
402
+ context->parent = NULL;
403
+ context->prevchild = NULL;
404
+ context->nextchild = NULL;
405
+ }
406
+ }
407
+
408
+ /*
409
+ * MemoryContextAllowInCriticalSection
410
+ * Allow/disallow allocations in this memory context within a critical
411
+ * section.
412
+ *
413
+ * Normally, memory allocations are not allowed within a critical section,
414
+ * because a failure would lead to PANIC. There are a few exceptions to
415
+ * that, like allocations related to debugging code that is not supposed to
416
+ * be enabled in production. This function can be used to exempt specific
417
+ * memory contexts from the assertion in palloc().
418
+ */
419
+ void
420
+ MemoryContextAllowInCriticalSection(MemoryContext context, bool allow)
421
+ {
422
+ AssertArg(MemoryContextIsValid(context));
423
+
424
+ context->allowInCritSection = allow;
425
+ }
426
+
427
+ /*
428
+ * GetMemoryChunkSpace
429
+ * Given a currently-allocated chunk, determine the total space
430
+ * it occupies (including all memory-allocation overhead).
431
+ *
432
+ * This is useful for measuring the total space occupied by a set of
433
+ * allocated chunks.
434
+ */
435
+
436
+
437
+ /*
438
+ * MemoryContextGetParent
439
+ * Get the parent context (if any) of the specified context
440
+ */
441
+
442
+
443
+ /*
444
+ * MemoryContextIsEmpty
445
+ * Is a memory context empty of any allocated space?
446
+ */
447
+
448
+
449
+ /*
450
+ * Find the memory allocated to blocks for this memory context. If recurse is
451
+ * true, also include children.
452
+ */
453
+
454
+
455
+ /*
456
+ * MemoryContextStats
457
+ * Print statistics about the named context and all its descendants.
458
+ *
459
+ * This is just a debugging utility, so it's not very fancy. However, we do
460
+ * make some effort to summarize when the output would otherwise be very long.
461
+ * The statistics are sent to stderr.
462
+ */
463
+ void
464
+ MemoryContextStats(MemoryContext context)
465
+ {
466
+ /* A hard-wired limit on the number of children is usually good enough */
467
+ MemoryContextStatsDetail(context, 100);
468
+ }
469
+
470
+ /*
471
+ * MemoryContextStatsDetail
472
+ *
473
+ * Entry point for use if you want to vary the number of child contexts shown.
474
+ */
475
+ void
476
+ MemoryContextStatsDetail(MemoryContext context, int max_children)
477
+ {
478
+ MemoryContextCounters grand_totals;
479
+
480
+ memset(&grand_totals, 0, sizeof(grand_totals));
481
+
482
+ MemoryContextStatsInternal(context, 0, true, max_children, &grand_totals);
483
+
484
+ fprintf(stderr,
485
+ "Grand total: %zu bytes in %zd blocks; %zu free (%zd chunks); %zu used\n",
486
+ grand_totals.totalspace, grand_totals.nblocks,
487
+ grand_totals.freespace, grand_totals.freechunks,
488
+ grand_totals.totalspace - grand_totals.freespace);
489
+ }
490
+
491
+ /*
492
+ * MemoryContextStatsInternal
493
+ * One recursion level for MemoryContextStats
494
+ *
495
+ * Print this context if print is true, but in any case accumulate counts into
496
+ * *totals (if given).
497
+ */
498
+ static void
499
+ MemoryContextStatsInternal(MemoryContext context, int level,
500
+ bool print, int max_children,
501
+ MemoryContextCounters *totals)
502
+ {
503
+ MemoryContextCounters local_totals;
504
+ MemoryContext child;
505
+ int ichild;
506
+
507
+ AssertArg(MemoryContextIsValid(context));
508
+
509
+ /* Examine the context itself */
510
+ context->methods->stats(context,
511
+ print ? MemoryContextStatsPrint : NULL,
512
+ (void *) &level,
513
+ totals);
514
+
515
+ /*
516
+ * Examine children. If there are more than max_children of them, we do
517
+ * not print the rest explicitly, but just summarize them.
518
+ */
519
+ memset(&local_totals, 0, sizeof(local_totals));
520
+
521
+ for (child = context->firstchild, ichild = 0;
522
+ child != NULL;
523
+ child = child->nextchild, ichild++)
524
+ {
525
+ if (ichild < max_children)
526
+ MemoryContextStatsInternal(child, level + 1,
527
+ print, max_children,
528
+ totals);
529
+ else
530
+ MemoryContextStatsInternal(child, level + 1,
531
+ false, max_children,
532
+ &local_totals);
533
+ }
534
+
535
+ /* Deal with excess children */
536
+ if (ichild > max_children)
537
+ {
538
+ if (print)
539
+ {
540
+ int i;
541
+
542
+ for (i = 0; i <= level; i++)
543
+ fprintf(stderr, " ");
544
+ fprintf(stderr,
545
+ "%d more child contexts containing %zu total in %zd blocks; %zu free (%zd chunks); %zu used\n",
546
+ ichild - max_children,
547
+ local_totals.totalspace,
548
+ local_totals.nblocks,
549
+ local_totals.freespace,
550
+ local_totals.freechunks,
551
+ local_totals.totalspace - local_totals.freespace);
552
+ }
553
+
554
+ if (totals)
555
+ {
556
+ totals->nblocks += local_totals.nblocks;
557
+ totals->freechunks += local_totals.freechunks;
558
+ totals->totalspace += local_totals.totalspace;
559
+ totals->freespace += local_totals.freespace;
560
+ }
561
+ }
562
+ }
563
+
564
+ /*
565
+ * MemoryContextStatsPrint
566
+ * Print callback used by MemoryContextStatsInternal
567
+ *
568
+ * For now, the passthru pointer just points to "int level"; later we might
569
+ * make that more complicated.
570
+ */
571
+ static void
572
+ MemoryContextStatsPrint(MemoryContext context, void *passthru,
573
+ const char *stats_string)
574
+ {
575
+ int level = *(int *) passthru;
576
+ const char *name = context->name;
577
+ const char *ident = context->ident;
578
+ int i;
579
+
580
+ /*
581
+ * It seems preferable to label dynahash contexts with just the hash table
582
+ * name. Those are already unique enough, so the "dynahash" part isn't
583
+ * very helpful, and this way is more consistent with pre-v11 practice.
584
+ */
585
+ if (ident && strcmp(name, "dynahash") == 0)
586
+ {
587
+ name = ident;
588
+ ident = NULL;
589
+ }
590
+
591
+ for (i = 0; i < level; i++)
592
+ fprintf(stderr, " ");
593
+ fprintf(stderr, "%s: %s", name, stats_string);
594
+ if (ident)
595
+ {
596
+ /*
597
+ * Some contexts may have very long identifiers (e.g., SQL queries).
598
+ * Arbitrarily truncate at 100 bytes, but be careful not to break
599
+ * multibyte characters. Also, replace ASCII control characters, such
600
+ * as newlines, with spaces.
601
+ */
602
+ int idlen = strlen(ident);
603
+ bool truncated = false;
604
+
605
+ if (idlen > 100)
606
+ {
607
+ idlen = pg_mbcliplen(ident, idlen, 100);
608
+ truncated = true;
609
+ }
610
+ fprintf(stderr, ": ");
611
+ while (idlen-- > 0)
612
+ {
613
+ unsigned char c = *ident++;
614
+
615
+ if (c < ' ')
616
+ c = ' ';
617
+ fputc(c, stderr);
618
+ }
619
+ if (truncated)
620
+ fprintf(stderr, "...");
621
+ }
622
+ fputc('\n', stderr);
623
+ }
624
+
625
+ /*
626
+ * MemoryContextCheck
627
+ * Check all chunks in the named context.
628
+ *
629
+ * This is just a debugging utility, so it's not fancy.
630
+ */
631
+ #ifdef MEMORY_CONTEXT_CHECKING
632
+
633
+ #endif
634
+
635
+ /*
636
+ * MemoryContextContains
637
+ * Detect whether an allocated chunk of memory belongs to a given
638
+ * context or not.
639
+ *
640
+ * Caution: this test is reliable as long as 'pointer' does point to
641
+ * a chunk of memory allocated from *some* context. If 'pointer' points
642
+ * at memory obtained in some other way, there is a small chance of a
643
+ * false-positive result, since the bits right before it might look like
644
+ * a valid chunk header by chance.
645
+ */
646
+
647
+
648
+ /*
649
+ * MemoryContextCreate
650
+ * Context-type-independent part of context creation.
651
+ *
652
+ * This is only intended to be called by context-type-specific
653
+ * context creation routines, not by the unwashed masses.
654
+ *
655
+ * The memory context creation procedure goes like this:
656
+ * 1. Context-type-specific routine makes some initial space allocation,
657
+ * including enough space for the context header. If it fails,
658
+ * it can ereport() with no damage done.
659
+ * 2. Context-type-specific routine sets up all type-specific fields of
660
+ * the header (those beyond MemoryContextData proper), as well as any
661
+ * other management fields it needs to have a fully valid context.
662
+ * Usually, failure in this step is impossible, but if it's possible
663
+ * the initial space allocation should be freed before ereport'ing.
664
+ * 3. Context-type-specific routine calls MemoryContextCreate() to fill in
665
+ * the generic header fields and link the context into the context tree.
666
+ * 4. We return to the context-type-specific routine, which finishes
667
+ * up type-specific initialization. This routine can now do things
668
+ * that might fail (like allocate more memory), so long as it's
669
+ * sure the node is left in a state that delete will handle.
670
+ *
671
+ * node: the as-yet-uninitialized common part of the context header node.
672
+ * tag: NodeTag code identifying the memory context type.
673
+ * methods: context-type-specific methods (usually statically allocated).
674
+ * parent: parent context, or NULL if this will be a top-level context.
675
+ * name: name of context (must be statically allocated).
676
+ *
677
+ * Context routines generally assume that MemoryContextCreate can't fail,
678
+ * so this can contain Assert but not elog/ereport.
679
+ */
680
+ void
681
+ MemoryContextCreate(MemoryContext node,
682
+ NodeTag tag,
683
+ const MemoryContextMethods *methods,
684
+ MemoryContext parent,
685
+ const char *name)
686
+ {
687
+ /* Creating new memory contexts is not allowed in a critical section */
688
+ Assert(CritSectionCount == 0);
689
+
690
+ /* Initialize all standard fields of memory context header */
691
+ node->type = tag;
692
+ node->isReset = true;
693
+ node->methods = methods;
694
+ node->parent = parent;
695
+ node->firstchild = NULL;
696
+ node->mem_allocated = 0;
697
+ node->prevchild = NULL;
698
+ node->name = name;
699
+ node->ident = NULL;
700
+ node->reset_cbs = NULL;
701
+
702
+ /* OK to link node into context tree */
703
+ if (parent)
704
+ {
705
+ node->nextchild = parent->firstchild;
706
+ if (parent->firstchild != NULL)
707
+ parent->firstchild->prevchild = node;
708
+ parent->firstchild = node;
709
+ /* inherit allowInCritSection flag from parent */
710
+ node->allowInCritSection = parent->allowInCritSection;
711
+ }
712
+ else
713
+ {
714
+ node->nextchild = NULL;
715
+ node->allowInCritSection = false;
716
+ }
717
+
718
+ VALGRIND_CREATE_MEMPOOL(node, 0, false);
719
+ }
720
+
721
+ /*
722
+ * MemoryContextAlloc
723
+ * Allocate space within the specified context.
724
+ *
725
+ * This could be turned into a macro, but we'd have to import
726
+ * nodes/memnodes.h into postgres.h which seems a bad idea.
727
+ */
728
+ void *
729
+ MemoryContextAlloc(MemoryContext context, Size size)
730
+ {
731
+ void *ret;
732
+
733
+ AssertArg(MemoryContextIsValid(context));
734
+ AssertNotInCriticalSection(context);
735
+
736
+ if (!AllocSizeIsValid(size))
737
+ elog(ERROR, "invalid memory alloc request size %zu", size);
738
+
739
+ context->isReset = false;
740
+
741
+ ret = context->methods->alloc(context, size);
742
+ if (unlikely(ret == NULL))
743
+ {
744
+ MemoryContextStats(TopMemoryContext);
745
+
746
+ /*
747
+ * Here, and elsewhere in this module, we show the target context's
748
+ * "name" but not its "ident" (if any) in user-visible error messages.
749
+ * The "ident" string might contain security-sensitive data, such as
750
+ * values in SQL commands.
751
+ */
752
+ ereport(ERROR,
753
+ (errcode(ERRCODE_OUT_OF_MEMORY),
754
+ errmsg("out of memory"),
755
+ errdetail("Failed on request of size %zu in memory context \"%s\".",
756
+ size, context->name)));
757
+ }
758
+
759
+ VALGRIND_MEMPOOL_ALLOC(context, ret, size);
760
+
761
+ return ret;
762
+ }
763
+
764
+ /*
765
+ * MemoryContextAllocZero
766
+ * Like MemoryContextAlloc, but clears allocated memory
767
+ *
768
+ * We could just call MemoryContextAlloc then clear the memory, but this
769
+ * is a very common combination, so we provide the combined operation.
770
+ */
771
+ void *
772
+ MemoryContextAllocZero(MemoryContext context, Size size)
773
+ {
774
+ void *ret;
775
+
776
+ AssertArg(MemoryContextIsValid(context));
777
+ AssertNotInCriticalSection(context);
778
+
779
+ if (!AllocSizeIsValid(size))
780
+ elog(ERROR, "invalid memory alloc request size %zu", size);
781
+
782
+ context->isReset = false;
783
+
784
+ ret = context->methods->alloc(context, size);
785
+ if (unlikely(ret == NULL))
786
+ {
787
+ MemoryContextStats(TopMemoryContext);
788
+ ereport(ERROR,
789
+ (errcode(ERRCODE_OUT_OF_MEMORY),
790
+ errmsg("out of memory"),
791
+ errdetail("Failed on request of size %zu in memory context \"%s\".",
792
+ size, context->name)));
793
+ }
794
+
795
+ VALGRIND_MEMPOOL_ALLOC(context, ret, size);
796
+
797
+ MemSetAligned(ret, 0, size);
798
+
799
+ return ret;
800
+ }
801
+
802
+ /*
803
+ * MemoryContextAllocZeroAligned
804
+ * MemoryContextAllocZero where length is suitable for MemSetLoop
805
+ *
806
+ * This might seem overly specialized, but it's not because newNode()
807
+ * is so often called with compile-time-constant sizes.
808
+ */
809
+ void *
810
+ MemoryContextAllocZeroAligned(MemoryContext context, Size size)
811
+ {
812
+ void *ret;
813
+
814
+ AssertArg(MemoryContextIsValid(context));
815
+ AssertNotInCriticalSection(context);
816
+
817
+ if (!AllocSizeIsValid(size))
818
+ elog(ERROR, "invalid memory alloc request size %zu", size);
819
+
820
+ context->isReset = false;
821
+
822
+ ret = context->methods->alloc(context, size);
823
+ if (unlikely(ret == NULL))
824
+ {
825
+ MemoryContextStats(TopMemoryContext);
826
+ ereport(ERROR,
827
+ (errcode(ERRCODE_OUT_OF_MEMORY),
828
+ errmsg("out of memory"),
829
+ errdetail("Failed on request of size %zu in memory context \"%s\".",
830
+ size, context->name)));
831
+ }
832
+
833
+ VALGRIND_MEMPOOL_ALLOC(context, ret, size);
834
+
835
+ MemSetLoop(ret, 0, size);
836
+
837
+ return ret;
838
+ }
839
+
840
+ /*
841
+ * MemoryContextAllocExtended
842
+ * Allocate space within the specified context using the given flags.
843
+ */
844
+ void *
845
+ MemoryContextAllocExtended(MemoryContext context, Size size, int flags)
846
+ {
847
+ void *ret;
848
+
849
+ AssertArg(MemoryContextIsValid(context));
850
+ AssertNotInCriticalSection(context);
851
+
852
+ if (((flags & MCXT_ALLOC_HUGE) != 0 && !AllocHugeSizeIsValid(size)) ||
853
+ ((flags & MCXT_ALLOC_HUGE) == 0 && !AllocSizeIsValid(size)))
854
+ elog(ERROR, "invalid memory alloc request size %zu", size);
855
+
856
+ context->isReset = false;
857
+
858
+ ret = context->methods->alloc(context, size);
859
+ if (unlikely(ret == NULL))
860
+ {
861
+ if ((flags & MCXT_ALLOC_NO_OOM) == 0)
862
+ {
863
+ MemoryContextStats(TopMemoryContext);
864
+ ereport(ERROR,
865
+ (errcode(ERRCODE_OUT_OF_MEMORY),
866
+ errmsg("out of memory"),
867
+ errdetail("Failed on request of size %zu in memory context \"%s\".",
868
+ size, context->name)));
869
+ }
870
+ return NULL;
871
+ }
872
+
873
+ VALGRIND_MEMPOOL_ALLOC(context, ret, size);
874
+
875
+ if ((flags & MCXT_ALLOC_ZERO) != 0)
876
+ MemSetAligned(ret, 0, size);
877
+
878
+ return ret;
879
+ }
880
+
881
+ void *
882
+ palloc(Size size)
883
+ {
884
+ /* duplicates MemoryContextAlloc to avoid increased overhead */
885
+ void *ret;
886
+ MemoryContext context = CurrentMemoryContext;
887
+
888
+ AssertArg(MemoryContextIsValid(context));
889
+ AssertNotInCriticalSection(context);
890
+
891
+ if (!AllocSizeIsValid(size))
892
+ elog(ERROR, "invalid memory alloc request size %zu", size);
893
+
894
+ context->isReset = false;
895
+
896
+ ret = context->methods->alloc(context, size);
897
+ if (unlikely(ret == NULL))
898
+ {
899
+ MemoryContextStats(TopMemoryContext);
900
+ ereport(ERROR,
901
+ (errcode(ERRCODE_OUT_OF_MEMORY),
902
+ errmsg("out of memory"),
903
+ errdetail("Failed on request of size %zu in memory context \"%s\".",
904
+ size, context->name)));
905
+ }
906
+
907
+ VALGRIND_MEMPOOL_ALLOC(context, ret, size);
908
+
909
+ return ret;
910
+ }
911
+
912
+ void *
913
+ palloc0(Size size)
914
+ {
915
+ /* duplicates MemoryContextAllocZero to avoid increased overhead */
916
+ void *ret;
917
+ MemoryContext context = CurrentMemoryContext;
918
+
919
+ AssertArg(MemoryContextIsValid(context));
920
+ AssertNotInCriticalSection(context);
921
+
922
+ if (!AllocSizeIsValid(size))
923
+ elog(ERROR, "invalid memory alloc request size %zu", size);
924
+
925
+ context->isReset = false;
926
+
927
+ ret = context->methods->alloc(context, size);
928
+ if (unlikely(ret == NULL))
929
+ {
930
+ MemoryContextStats(TopMemoryContext);
931
+ ereport(ERROR,
932
+ (errcode(ERRCODE_OUT_OF_MEMORY),
933
+ errmsg("out of memory"),
934
+ errdetail("Failed on request of size %zu in memory context \"%s\".",
935
+ size, context->name)));
936
+ }
937
+
938
+ VALGRIND_MEMPOOL_ALLOC(context, ret, size);
939
+
940
+ MemSetAligned(ret, 0, size);
941
+
942
+ return ret;
943
+ }
944
+
945
+
946
+
947
+ /*
948
+ * pfree
949
+ * Release an allocated chunk.
950
+ */
951
+ void
952
+ pfree(void *pointer)
953
+ {
954
+ MemoryContext context = GetMemoryChunkContext(pointer);
955
+
956
+ context->methods->free_p(context, pointer);
957
+ VALGRIND_MEMPOOL_FREE(context, pointer);
958
+ }
959
+
960
+ /*
961
+ * repalloc
962
+ * Adjust the size of a previously allocated chunk.
963
+ */
964
+ void *
965
+ repalloc(void *pointer, Size size)
966
+ {
967
+ MemoryContext context = GetMemoryChunkContext(pointer);
968
+ void *ret;
969
+
970
+ if (!AllocSizeIsValid(size))
971
+ elog(ERROR, "invalid memory alloc request size %zu", size);
972
+
973
+ AssertNotInCriticalSection(context);
974
+
975
+ /* isReset must be false already */
976
+ Assert(!context->isReset);
977
+
978
+ ret = context->methods->realloc(context, pointer, size);
979
+ if (unlikely(ret == NULL))
980
+ {
981
+ MemoryContextStats(TopMemoryContext);
982
+ ereport(ERROR,
983
+ (errcode(ERRCODE_OUT_OF_MEMORY),
984
+ errmsg("out of memory"),
985
+ errdetail("Failed on request of size %zu in memory context \"%s\".",
986
+ size, context->name)));
987
+ }
988
+
989
+ VALGRIND_MEMPOOL_CHANGE(context, pointer, ret, size);
990
+
991
+ return ret;
992
+ }
993
+
994
+ /*
995
+ * MemoryContextAllocHuge
996
+ * Allocate (possibly-expansive) space within the specified context.
997
+ *
998
+ * See considerations in comment at MaxAllocHugeSize.
999
+ */
1000
+
1001
+
1002
+ /*
1003
+ * repalloc_huge
1004
+ * Adjust the size of a previously allocated chunk, permitting a large
1005
+ * value. The previous allocation need not have been "huge".
1006
+ */
1007
+
1008
+
1009
+ /*
1010
+ * MemoryContextStrdup
1011
+ * Like strdup(), but allocate from the specified context
1012
+ */
1013
+ char *
1014
+ MemoryContextStrdup(MemoryContext context, const char *string)
1015
+ {
1016
+ char *nstr;
1017
+ Size len = strlen(string) + 1;
1018
+
1019
+ nstr = (char *) MemoryContextAlloc(context, len);
1020
+
1021
+ memcpy(nstr, string, len);
1022
+
1023
+ return nstr;
1024
+ }
1025
+
1026
+ char *
1027
+ pstrdup(const char *in)
1028
+ {
1029
+ return MemoryContextStrdup(CurrentMemoryContext, in);
1030
+ }
1031
+
1032
+ /*
1033
+ * pnstrdup
1034
+ * Like pstrdup(), but append null byte to a
1035
+ * not-necessarily-null-terminated input string.
1036
+ */
1037
+
1038
+
1039
+ /*
1040
+ * Make copy of string with all trailing newline characters removed.
1041
+ */
1042
+