pg_query 4.2.1 → 6.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 (901) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +61 -0
  3. data/README.md +7 -9
  4. data/Rakefile +5 -6
  5. data/ext/pg_query/ext_symbols_freebsd.sym +1 -0
  6. data/ext/pg_query/ext_symbols_freebsd_with_ruby_abi_version.sym +2 -0
  7. data/ext/pg_query/ext_symbols_openbsd.sym +1 -0
  8. data/ext/pg_query/ext_symbols_openbsd_with_ruby_abi_version.sym +2 -0
  9. data/ext/pg_query/ext_symbols_with_ruby_abi_version.sym +2 -0
  10. data/ext/pg_query/extconf.rb +33 -9
  11. data/ext/pg_query/include/pg_query.h +28 -3
  12. data/ext/pg_query/include/pg_query_enum_defs.c +599 -167
  13. data/ext/pg_query/include/pg_query_fingerprint_conds.c +640 -520
  14. data/ext/pg_query/include/pg_query_fingerprint_defs.c +6400 -4633
  15. data/ext/pg_query/include/pg_query_outfuncs_conds.c +433 -343
  16. data/ext/pg_query/include/pg_query_outfuncs_defs.c +1472 -1152
  17. data/ext/pg_query/include/pg_query_readfuncs_conds.c +154 -124
  18. data/ext/pg_query/include/pg_query_readfuncs_defs.c +1886 -1506
  19. data/ext/pg_query/include/postgres/access/amapi.h +303 -0
  20. data/ext/pg_query/include/postgres/access/attmap.h +54 -0
  21. data/ext/pg_query/include/postgres/access/attnum.h +64 -0
  22. data/ext/pg_query/include/postgres/access/brin_internal.h +116 -0
  23. data/ext/pg_query/include/postgres/access/brin_tuple.h +112 -0
  24. data/ext/pg_query/include/postgres/access/clog.h +62 -0
  25. data/ext/pg_query/include/postgres/access/commit_ts.h +73 -0
  26. data/ext/pg_query/include/postgres/access/detoast.h +82 -0
  27. data/ext/pg_query/include/postgres/access/genam.h +246 -0
  28. data/ext/pg_query/include/postgres/access/gin.h +91 -0
  29. data/ext/pg_query/include/postgres/access/htup.h +89 -0
  30. data/ext/pg_query/include/postgres/access/htup_details.h +811 -0
  31. data/ext/pg_query/include/postgres/access/itup.h +170 -0
  32. data/ext/pg_query/include/postgres/access/parallel.h +81 -0
  33. data/ext/pg_query/include/postgres/access/printtup.h +35 -0
  34. data/ext/pg_query/include/postgres/access/relation.h +28 -0
  35. data/ext/pg_query/include/postgres/access/relscan.h +191 -0
  36. data/ext/pg_query/include/postgres/access/rmgrlist.h +49 -0
  37. data/ext/pg_query/include/postgres/access/sdir.h +67 -0
  38. data/ext/pg_query/include/postgres/access/skey.h +151 -0
  39. data/ext/pg_query/include/postgres/access/slru.h +218 -0
  40. data/ext/pg_query/include/postgres/access/stratnum.h +85 -0
  41. data/ext/pg_query/include/postgres/access/sysattr.h +29 -0
  42. data/ext/pg_query/include/postgres/access/table.h +28 -0
  43. data/ext/pg_query/include/postgres/access/tableam.h +2110 -0
  44. data/ext/pg_query/include/postgres/access/tidstore.h +50 -0
  45. data/ext/pg_query/include/postgres/access/toast_compression.h +73 -0
  46. data/ext/pg_query/include/postgres/access/transam.h +418 -0
  47. data/ext/pg_query/include/postgres/access/tsmapi.h +82 -0
  48. data/ext/pg_query/include/postgres/access/tupconvert.h +54 -0
  49. data/ext/pg_query/include/postgres/access/tupdesc.h +154 -0
  50. data/ext/pg_query/include/postgres/access/tupmacs.h +207 -0
  51. data/ext/pg_query/include/postgres/access/twophase.h +65 -0
  52. data/ext/pg_query/include/postgres/access/xact.h +530 -0
  53. data/ext/pg_query/include/postgres/access/xlog.h +310 -0
  54. data/ext/pg_query/include/postgres/access/xlog_internal.h +405 -0
  55. data/ext/pg_query/include/postgres/access/xlogbackup.h +43 -0
  56. data/ext/pg_query/include/postgres/access/xlogdefs.h +82 -0
  57. data/ext/pg_query/include/postgres/access/xlogprefetcher.h +55 -0
  58. data/ext/pg_query/include/postgres/access/xlogreader.h +444 -0
  59. data/ext/pg_query/include/postgres/access/xlogrecord.h +248 -0
  60. data/ext/pg_query/include/postgres/access/xlogrecovery.h +158 -0
  61. data/ext/pg_query/include/postgres/archive/archive_module.h +67 -0
  62. data/ext/pg_query/include/postgres/c.h +1374 -0
  63. data/ext/pg_query/include/postgres/catalog/catalog.h +47 -0
  64. data/ext/pg_query/include/postgres/catalog/catversion.h +62 -0
  65. data/ext/pg_query/include/postgres/catalog/dependency.h +228 -0
  66. data/ext/pg_query/include/postgres/catalog/genbki.h +149 -0
  67. data/ext/pg_query/include/postgres/catalog/index.h +218 -0
  68. data/ext/pg_query/include/postgres/catalog/indexing.h +54 -0
  69. data/ext/pg_query/include/postgres/catalog/namespace.h +189 -0
  70. data/ext/pg_query/include/postgres/catalog/objectaccess.h +267 -0
  71. data/ext/pg_query/include/postgres/catalog/objectaddress.h +93 -0
  72. data/ext/pg_query/include/postgres/catalog/pg_aggregate.h +182 -0
  73. data/ext/pg_query/include/postgres/catalog/pg_aggregate_d.h +78 -0
  74. data/ext/pg_query/include/postgres/catalog/pg_am.h +66 -0
  75. data/ext/pg_query/include/postgres/catalog/pg_am_d.h +47 -0
  76. data/ext/pg_query/include/postgres/catalog/pg_attribute.h +240 -0
  77. data/ext/pg_query/include/postgres/catalog/pg_attribute_d.h +62 -0
  78. data/ext/pg_query/include/postgres/catalog/pg_authid.h +66 -0
  79. data/ext/pg_query/include/postgres/catalog/pg_authid_d.h +60 -0
  80. data/ext/pg_query/include/postgres/catalog/pg_class.h +235 -0
  81. data/ext/pg_query/include/postgres/catalog/pg_class_d.h +134 -0
  82. data/ext/pg_query/include/postgres/catalog/pg_collation.h +106 -0
  83. data/ext/pg_query/include/postgres/catalog/pg_collation_d.h +66 -0
  84. data/ext/pg_query/include/postgres/catalog/pg_constraint.h +278 -0
  85. data/ext/pg_query/include/postgres/catalog/pg_constraint_d.h +74 -0
  86. data/ext/pg_query/include/postgres/catalog/pg_control.h +260 -0
  87. data/ext/pg_query/include/postgres/catalog/pg_conversion.h +79 -0
  88. data/ext/pg_query/include/postgres/catalog/pg_conversion_d.h +38 -0
  89. data/ext/pg_query/include/postgres/catalog/pg_database.h +129 -0
  90. data/ext/pg_query/include/postgres/catalog/pg_database_d.h +53 -0
  91. data/ext/pg_query/include/postgres/catalog/pg_depend.h +77 -0
  92. data/ext/pg_query/include/postgres/catalog/pg_depend_d.h +36 -0
  93. data/ext/pg_query/include/postgres/catalog/pg_event_trigger.h +60 -0
  94. data/ext/pg_query/include/postgres/catalog/pg_event_trigger_d.h +36 -0
  95. data/ext/pg_query/include/postgres/catalog/pg_index.h +92 -0
  96. data/ext/pg_query/include/postgres/catalog/pg_index_d.h +59 -0
  97. data/ext/pg_query/include/postgres/catalog/pg_language.h +75 -0
  98. data/ext/pg_query/include/postgres/catalog/pg_language_d.h +41 -0
  99. data/ext/pg_query/include/postgres/catalog/pg_namespace.h +67 -0
  100. data/ext/pg_query/include/postgres/catalog/pg_namespace_d.h +36 -0
  101. data/ext/pg_query/include/postgres/catalog/pg_opclass.h +91 -0
  102. data/ext/pg_query/include/postgres/catalog/pg_opclass_d.h +51 -0
  103. data/ext/pg_query/include/postgres/catalog/pg_operator.h +124 -0
  104. data/ext/pg_query/include/postgres/catalog/pg_operator_d.h +142 -0
  105. data/ext/pg_query/include/postgres/catalog/pg_opfamily.h +67 -0
  106. data/ext/pg_query/include/postgres/catalog/pg_opfamily_d.h +51 -0
  107. data/ext/pg_query/include/postgres/catalog/pg_partitioned_table.h +76 -0
  108. data/ext/pg_query/include/postgres/catalog/pg_partitioned_table_d.h +36 -0
  109. data/ext/pg_query/include/postgres/catalog/pg_proc.h +223 -0
  110. data/ext/pg_query/include/postgres/catalog/pg_proc_d.h +101 -0
  111. data/ext/pg_query/include/postgres/catalog/pg_publication.h +161 -0
  112. data/ext/pg_query/include/postgres/catalog/pg_publication_d.h +38 -0
  113. data/ext/pg_query/include/postgres/catalog/pg_replication_origin.h +65 -0
  114. data/ext/pg_query/include/postgres/catalog/pg_replication_origin_d.h +33 -0
  115. data/ext/pg_query/include/postgres/catalog/pg_statistic.h +288 -0
  116. data/ext/pg_query/include/postgres/catalog/pg_statistic_d.h +199 -0
  117. data/ext/pg_query/include/postgres/catalog/pg_statistic_ext.h +91 -0
  118. data/ext/pg_query/include/postgres/catalog/pg_statistic_ext_d.h +45 -0
  119. data/ext/pg_query/include/postgres/catalog/pg_transform.h +51 -0
  120. data/ext/pg_query/include/postgres/catalog/pg_transform_d.h +34 -0
  121. data/ext/pg_query/include/postgres/catalog/pg_trigger.h +153 -0
  122. data/ext/pg_query/include/postgres/catalog/pg_trigger_d.h +109 -0
  123. data/ext/pg_query/include/postgres/catalog/pg_ts_config.h +56 -0
  124. data/ext/pg_query/include/postgres/catalog/pg_ts_config_d.h +34 -0
  125. data/ext/pg_query/include/postgres/catalog/pg_ts_dict.h +62 -0
  126. data/ext/pg_query/include/postgres/catalog/pg_ts_dict_d.h +35 -0
  127. data/ext/pg_query/include/postgres/catalog/pg_ts_parser.h +63 -0
  128. data/ext/pg_query/include/postgres/catalog/pg_ts_parser_d.h +37 -0
  129. data/ext/pg_query/include/postgres/catalog/pg_ts_template.h +54 -0
  130. data/ext/pg_query/include/postgres/catalog/pg_ts_template_d.h +34 -0
  131. data/ext/pg_query/include/postgres/catalog/pg_type.h +407 -0
  132. data/ext/pg_query/include/postgres/catalog/pg_type_d.h +324 -0
  133. data/ext/pg_query/include/postgres/catalog/storage.h +50 -0
  134. data/ext/pg_query/include/postgres/catalog/syscache_ids.h +104 -0
  135. data/ext/pg_query/include/postgres/commands/async.h +49 -0
  136. data/ext/pg_query/include/postgres/commands/dbcommands.h +37 -0
  137. data/ext/pg_query/include/postgres/commands/defrem.h +161 -0
  138. data/ext/pg_query/include/postgres/commands/event_trigger.h +97 -0
  139. data/ext/pg_query/include/postgres/commands/explain.h +145 -0
  140. data/ext/pg_query/include/postgres/commands/prepare.h +61 -0
  141. data/ext/pg_query/include/postgres/commands/tablespace.h +69 -0
  142. data/ext/pg_query/include/postgres/commands/trigger.h +288 -0
  143. data/ext/pg_query/include/postgres/commands/user.h +43 -0
  144. data/ext/pg_query/include/postgres/commands/vacuum.h +388 -0
  145. data/ext/pg_query/include/postgres/common/cryptohash.h +39 -0
  146. data/ext/pg_query/include/postgres/common/file_perm.h +56 -0
  147. data/ext/pg_query/include/postgres/common/file_utils.h +65 -0
  148. data/ext/pg_query/include/postgres/common/hashfn.h +119 -0
  149. data/ext/pg_query/include/postgres/common/hashfn_unstable.h +407 -0
  150. data/ext/pg_query/include/postgres/common/int.h +512 -0
  151. data/ext/pg_query/include/postgres/common/keywords.h +29 -0
  152. data/ext/pg_query/include/postgres/common/kwlookup.h +44 -0
  153. data/ext/pg_query/include/postgres/common/pg_prng.h +62 -0
  154. data/ext/pg_query/include/postgres/common/relpath.h +97 -0
  155. data/ext/pg_query/include/postgres/common/scram-common.h +70 -0
  156. data/ext/pg_query/include/postgres/common/sha2.h +32 -0
  157. data/ext/pg_query/include/postgres/common/string.h +44 -0
  158. data/ext/pg_query/include/postgres/common/unicode_east_asian_fw_table.h +124 -0
  159. data/ext/pg_query/include/postgres/common/unicode_nonspacing_table.h +326 -0
  160. data/ext/pg_query/include/postgres/copyfuncs.funcs.c +5261 -0
  161. data/ext/pg_query/include/postgres/copyfuncs.switch.c +989 -0
  162. data/ext/pg_query/include/postgres/datatype/timestamp.h +269 -0
  163. data/ext/pg_query/include/postgres/equalfuncs.funcs.c +3310 -0
  164. data/ext/pg_query/include/postgres/equalfuncs.switch.c +836 -0
  165. data/ext/pg_query/include/postgres/executor/execdesc.h +70 -0
  166. data/ext/pg_query/include/postgres/executor/executor.h +681 -0
  167. data/ext/pg_query/include/postgres/executor/functions.h +56 -0
  168. data/ext/pg_query/include/postgres/executor/instrument.h +120 -0
  169. data/ext/pg_query/include/postgres/executor/spi.h +207 -0
  170. data/ext/pg_query/include/postgres/executor/tablefunc.h +67 -0
  171. data/ext/pg_query/include/postgres/executor/tuptable.h +523 -0
  172. data/ext/pg_query/include/postgres/fmgr.h +800 -0
  173. data/ext/pg_query/include/postgres/foreign/fdwapi.h +294 -0
  174. data/ext/pg_query/include/postgres/funcapi.h +360 -0
  175. data/ext/pg_query/include/postgres/gram.h +1168 -0
  176. data/ext/pg_query/include/postgres/gramparse.h +75 -0
  177. data/ext/pg_query/include/postgres/jit/jit.h +106 -0
  178. data/ext/pg_query/include/postgres/kwlist_d.h +1164 -0
  179. data/ext/pg_query/include/postgres/lib/dshash.h +130 -0
  180. data/ext/pg_query/include/postgres/lib/ilist.h +1159 -0
  181. data/ext/pg_query/include/postgres/lib/pairingheap.h +102 -0
  182. data/ext/pg_query/include/postgres/lib/simplehash.h +1206 -0
  183. data/ext/pg_query/include/postgres/lib/sort_template.h +445 -0
  184. data/ext/pg_query/include/postgres/lib/stringinfo.h +243 -0
  185. data/ext/pg_query/include/postgres/libpq/auth.h +37 -0
  186. data/ext/pg_query/include/postgres/libpq/crypt.h +47 -0
  187. data/ext/pg_query/include/postgres/libpq/hba.h +186 -0
  188. data/ext/pg_query/include/postgres/libpq/libpq-be.h +361 -0
  189. data/ext/pg_query/include/postgres/libpq/libpq.h +143 -0
  190. data/ext/pg_query/include/postgres/libpq/pqcomm.h +169 -0
  191. data/ext/pg_query/include/postgres/libpq/pqformat.h +209 -0
  192. data/ext/pg_query/include/postgres/libpq/pqsignal.h +54 -0
  193. data/ext/pg_query/include/postgres/libpq/protocol.h +89 -0
  194. data/ext/pg_query/include/postgres/libpq/sasl.h +136 -0
  195. data/ext/pg_query/include/postgres/libpq/scram.h +37 -0
  196. data/ext/pg_query/include/postgres/mb/pg_wchar.h +793 -0
  197. data/ext/pg_query/include/postgres/mb/stringinfo_mb.h +24 -0
  198. data/ext/pg_query/include/postgres/miscadmin.h +527 -0
  199. data/ext/pg_query/include/postgres/nodes/bitmapset.h +140 -0
  200. data/ext/pg_query/include/postgres/nodes/execnodes.h +2855 -0
  201. data/ext/pg_query/include/postgres/nodes/extensible.h +164 -0
  202. data/ext/pg_query/include/postgres/nodes/lockoptions.h +61 -0
  203. data/ext/pg_query/include/postgres/nodes/makefuncs.h +127 -0
  204. data/ext/pg_query/include/postgres/nodes/memnodes.h +152 -0
  205. data/ext/pg_query/include/postgres/nodes/miscnodes.h +56 -0
  206. data/ext/pg_query/include/postgres/nodes/nodeFuncs.h +222 -0
  207. data/ext/pg_query/include/postgres/nodes/nodes.h +435 -0
  208. data/ext/pg_query/include/postgres/nodes/nodetags.h +491 -0
  209. data/ext/pg_query/include/postgres/nodes/params.h +170 -0
  210. data/ext/pg_query/include/postgres/nodes/parsenodes.h +4233 -0
  211. data/ext/pg_query/include/postgres/nodes/pathnodes.h +3438 -0
  212. data/ext/pg_query/include/postgres/nodes/pg_list.h +686 -0
  213. data/ext/pg_query/include/postgres/nodes/plannodes.h +1593 -0
  214. data/ext/pg_query/include/postgres/nodes/primnodes.h +2339 -0
  215. data/ext/pg_query/include/postgres/nodes/print.h +34 -0
  216. data/ext/pg_query/include/postgres/nodes/queryjumble.h +86 -0
  217. data/ext/pg_query/include/postgres/nodes/replnodes.h +132 -0
  218. data/ext/pg_query/include/postgres/nodes/supportnodes.h +346 -0
  219. data/ext/pg_query/include/postgres/nodes/tidbitmap.h +75 -0
  220. data/ext/pg_query/include/postgres/nodes/value.h +90 -0
  221. data/ext/pg_query/include/postgres/optimizer/cost.h +216 -0
  222. data/ext/pg_query/include/postgres/optimizer/geqo.h +90 -0
  223. data/ext/pg_query/include/postgres/optimizer/geqo_gene.h +45 -0
  224. data/ext/pg_query/include/postgres/optimizer/optimizer.h +205 -0
  225. data/ext/pg_query/include/postgres/optimizer/paths.h +271 -0
  226. data/ext/pg_query/include/postgres/optimizer/planmain.h +123 -0
  227. data/ext/pg_query/include/postgres/parser/analyze.h +66 -0
  228. data/ext/pg_query/include/postgres/parser/kwlist.h +518 -0
  229. data/ext/pg_query/include/postgres/parser/parse_agg.h +65 -0
  230. data/ext/pg_query/include/postgres/parser/parse_coerce.h +105 -0
  231. data/ext/pg_query/include/postgres/parser/parse_expr.h +25 -0
  232. data/ext/pg_query/include/postgres/parser/parse_func.h +74 -0
  233. data/ext/pg_query/include/postgres/parser/parse_node.h +358 -0
  234. data/ext/pg_query/include/postgres/parser/parse_oper.h +68 -0
  235. data/ext/pg_query/include/postgres/parser/parse_relation.h +129 -0
  236. data/ext/pg_query/include/postgres/parser/parse_type.h +61 -0
  237. data/ext/pg_query/include/postgres/parser/parser.h +68 -0
  238. data/ext/pg_query/include/postgres/parser/parsetree.h +61 -0
  239. data/ext/pg_query/include/postgres/parser/scanner.h +152 -0
  240. data/ext/pg_query/include/postgres/parser/scansup.h +27 -0
  241. data/ext/pg_query/include/postgres/partitioning/partdefs.h +26 -0
  242. data/ext/pg_query/include/postgres/pg_config.h +985 -0
  243. data/ext/pg_query/include/postgres/pg_config_manual.h +385 -0
  244. data/ext/pg_query/include/postgres/pg_config_os.h +8 -0
  245. data/ext/pg_query/include/postgres/pg_getopt.h +56 -0
  246. data/ext/pg_query/include/postgres/pg_trace.h +17 -0
  247. data/ext/pg_query/include/postgres/pgstat.h +780 -0
  248. data/ext/pg_query/include/postgres/pgtime.h +94 -0
  249. data/ext/pg_query/include/postgres/pl_gram.h +385 -0
  250. data/ext/pg_query/include/postgres/pl_reserved_kwlist.h +52 -0
  251. data/ext/pg_query/include/postgres/pl_reserved_kwlist_d.h +114 -0
  252. data/ext/pg_query/include/postgres/pl_unreserved_kwlist.h +112 -0
  253. data/ext/pg_query/include/postgres/pl_unreserved_kwlist_d.h +246 -0
  254. data/ext/pg_query/include/postgres/plerrcodes.h +998 -0
  255. data/ext/pg_query/include/postgres/plpgsql.h +1342 -0
  256. data/ext/pg_query/include/postgres/port/atomics/arch-arm.h +32 -0
  257. data/ext/pg_query/include/postgres/port/atomics/arch-hppa.h +17 -0
  258. data/ext/pg_query/include/postgres/port/atomics/arch-ppc.h +256 -0
  259. data/ext/pg_query/include/postgres/port/atomics/arch-x86.h +254 -0
  260. data/ext/pg_query/include/postgres/port/atomics/fallback.h +170 -0
  261. data/ext/pg_query/include/postgres/port/atomics/generic-gcc.h +323 -0
  262. data/ext/pg_query/include/postgres/port/atomics/generic-msvc.h +119 -0
  263. data/ext/pg_query/include/postgres/port/atomics/generic-sunpro.h +121 -0
  264. data/ext/pg_query/include/postgres/port/atomics/generic.h +437 -0
  265. data/ext/pg_query/include/postgres/port/atomics.h +606 -0
  266. data/ext/pg_query/include/postgres/port/pg_bitutils.h +421 -0
  267. data/ext/pg_query/include/postgres/port/pg_bswap.h +161 -0
  268. data/ext/pg_query/include/postgres/port/pg_crc32c.h +110 -0
  269. data/ext/pg_query/include/postgres/port/pg_iovec.h +117 -0
  270. data/ext/pg_query/include/postgres/port/simd.h +422 -0
  271. data/ext/pg_query/include/postgres/port/win32/arpa/inet.h +3 -0
  272. data/ext/pg_query/include/postgres/port/win32/dlfcn.h +1 -0
  273. data/ext/pg_query/include/postgres/port/win32/grp.h +1 -0
  274. data/ext/pg_query/include/postgres/port/win32/netdb.h +7 -0
  275. data/ext/pg_query/include/postgres/port/win32/netinet/in.h +3 -0
  276. data/ext/pg_query/include/postgres/port/win32/netinet/tcp.h +7 -0
  277. data/ext/pg_query/include/postgres/port/win32/pwd.h +3 -0
  278. data/ext/pg_query/include/postgres/port/win32/sys/resource.h +20 -0
  279. data/ext/pg_query/include/postgres/port/win32/sys/select.h +3 -0
  280. data/ext/pg_query/include/postgres/port/win32/sys/socket.h +34 -0
  281. data/ext/pg_query/include/postgres/port/win32/sys/un.h +17 -0
  282. data/ext/pg_query/include/postgres/port/win32/sys/wait.h +3 -0
  283. data/ext/pg_query/include/postgres/port/win32.h +59 -0
  284. data/ext/pg_query/include/postgres/port/win32_msvc/dirent.h +34 -0
  285. data/ext/pg_query/include/postgres/port/win32_msvc/sys/file.h +1 -0
  286. data/ext/pg_query/include/postgres/port/win32_msvc/sys/param.h +1 -0
  287. data/ext/pg_query/include/postgres/port/win32_msvc/sys/time.h +1 -0
  288. data/ext/pg_query/include/postgres/port/win32_msvc/unistd.h +9 -0
  289. data/ext/pg_query/include/postgres/port/win32_msvc/utime.h +3 -0
  290. data/ext/pg_query/include/postgres/port/win32_port.h +582 -0
  291. data/ext/pg_query/include/postgres/port.h +555 -0
  292. data/ext/pg_query/include/postgres/portability/instr_time.h +197 -0
  293. data/ext/pg_query/include/postgres/postgres.h +579 -0
  294. data/ext/pg_query/include/postgres/postgres_ext.h +73 -0
  295. data/ext/pg_query/include/postgres/postmaster/autovacuum.h +69 -0
  296. data/ext/pg_query/include/postgres/postmaster/bgworker.h +164 -0
  297. data/ext/pg_query/include/postgres/postmaster/bgworker_internals.h +60 -0
  298. data/ext/pg_query/include/postgres/postmaster/bgwriter.h +45 -0
  299. data/ext/pg_query/include/postgres/postmaster/interrupt.h +32 -0
  300. data/ext/pg_query/include/postgres/postmaster/pgarch.h +36 -0
  301. data/ext/pg_query/include/postgres/postmaster/postmaster.h +101 -0
  302. data/ext/pg_query/include/postgres/postmaster/startup.h +41 -0
  303. data/ext/pg_query/include/postgres/postmaster/syslogger.h +101 -0
  304. data/ext/pg_query/include/postgres/postmaster/walsummarizer.h +35 -0
  305. data/ext/pg_query/include/postgres/postmaster/walwriter.h +23 -0
  306. data/ext/pg_query/include/postgres/regex/regex.h +272 -0
  307. data/ext/pg_query/include/postgres/replication/logicallauncher.h +34 -0
  308. data/ext/pg_query/include/postgres/replication/logicalproto.h +274 -0
  309. data/ext/pg_query/include/postgres/replication/logicalworker.h +33 -0
  310. data/ext/pg_query/include/postgres/replication/origin.h +73 -0
  311. data/ext/pg_query/include/postgres/replication/reorderbuffer.h +734 -0
  312. data/ext/pg_query/include/postgres/replication/slot.h +289 -0
  313. data/ext/pg_query/include/postgres/replication/slotsync.h +38 -0
  314. data/ext/pg_query/include/postgres/replication/syncrep.h +109 -0
  315. data/ext/pg_query/include/postgres/replication/walreceiver.h +504 -0
  316. data/ext/pg_query/include/postgres/replication/walsender.h +76 -0
  317. data/ext/pg_query/include/postgres/rewrite/prs2lock.h +46 -0
  318. data/ext/pg_query/include/postgres/rewrite/rewriteHandler.h +41 -0
  319. data/ext/pg_query/include/postgres/rewrite/rewriteManip.h +96 -0
  320. data/ext/pg_query/include/postgres/rewrite/rewriteSupport.h +26 -0
  321. data/ext/pg_query/include/postgres/storage/block.h +108 -0
  322. data/ext/pg_query/include/postgres/storage/buf.h +46 -0
  323. data/ext/pg_query/include/postgres/storage/bufmgr.h +411 -0
  324. data/ext/pg_query/include/postgres/storage/bufpage.h +510 -0
  325. data/ext/pg_query/include/postgres/storage/condition_variable.h +73 -0
  326. data/ext/pg_query/include/postgres/storage/dsm.h +61 -0
  327. data/ext/pg_query/include/postgres/storage/dsm_impl.h +79 -0
  328. data/ext/pg_query/include/postgres/storage/fd.h +219 -0
  329. data/ext/pg_query/include/postgres/storage/fileset.h +40 -0
  330. data/ext/pg_query/include/postgres/storage/ipc.h +87 -0
  331. data/ext/pg_query/include/postgres/storage/item.h +19 -0
  332. data/ext/pg_query/include/postgres/storage/itemid.h +184 -0
  333. data/ext/pg_query/include/postgres/storage/itemptr.h +245 -0
  334. data/ext/pg_query/include/postgres/storage/large_object.h +100 -0
  335. data/ext/pg_query/include/postgres/storage/latch.h +196 -0
  336. data/ext/pg_query/include/postgres/storage/lmgr.h +126 -0
  337. data/ext/pg_query/include/postgres/storage/lock.h +624 -0
  338. data/ext/pg_query/include/postgres/storage/lockdefs.h +61 -0
  339. data/ext/pg_query/include/postgres/storage/lwlock.h +228 -0
  340. data/ext/pg_query/include/postgres/storage/lwlocknames.h +47 -0
  341. data/ext/pg_query/include/postgres/storage/off.h +57 -0
  342. data/ext/pg_query/include/postgres/storage/pg_sema.h +61 -0
  343. data/ext/pg_query/include/postgres/storage/pg_shmem.h +93 -0
  344. data/ext/pg_query/include/postgres/storage/pmsignal.h +105 -0
  345. data/ext/pg_query/include/postgres/storage/predicate.h +83 -0
  346. data/ext/pg_query/include/postgres/storage/proc.h +488 -0
  347. data/ext/pg_query/include/postgres/storage/procarray.h +103 -0
  348. data/ext/pg_query/include/postgres/storage/proclist_types.h +53 -0
  349. data/ext/pg_query/include/postgres/storage/procnumber.h +43 -0
  350. data/ext/pg_query/include/postgres/storage/procsignal.h +75 -0
  351. data/ext/pg_query/include/postgres/storage/read_stream.h +65 -0
  352. data/ext/pg_query/include/postgres/storage/relfilelocator.h +100 -0
  353. data/ext/pg_query/include/postgres/storage/s_lock.h +847 -0
  354. data/ext/pg_query/include/postgres/storage/sharedfileset.h +37 -0
  355. data/ext/pg_query/include/postgres/storage/shm_mq.h +86 -0
  356. data/ext/pg_query/include/postgres/storage/shm_toc.h +58 -0
  357. data/ext/pg_query/include/postgres/storage/shmem.h +59 -0
  358. data/ext/pg_query/include/postgres/storage/sinval.h +153 -0
  359. data/ext/pg_query/include/postgres/storage/smgr.h +130 -0
  360. data/ext/pg_query/include/postgres/storage/spin.h +77 -0
  361. data/ext/pg_query/include/postgres/storage/standby.h +109 -0
  362. data/ext/pg_query/include/postgres/storage/standbydefs.h +74 -0
  363. data/ext/pg_query/include/postgres/storage/sync.h +66 -0
  364. data/ext/pg_query/include/postgres/tcop/cmdtag.h +62 -0
  365. data/ext/pg_query/include/postgres/tcop/cmdtaglist.h +219 -0
  366. data/ext/pg_query/include/postgres/tcop/deparse_utility.h +108 -0
  367. data/ext/pg_query/include/postgres/tcop/dest.h +148 -0
  368. data/ext/pg_query/include/postgres/tcop/fastpath.h +20 -0
  369. data/ext/pg_query/include/postgres/tcop/pquery.h +51 -0
  370. data/ext/pg_query/include/postgres/tcop/tcopprot.h +98 -0
  371. data/ext/pg_query/include/postgres/tcop/utility.h +112 -0
  372. data/ext/pg_query/include/postgres/tsearch/ts_cache.h +96 -0
  373. data/ext/pg_query/include/postgres/utils/acl.h +290 -0
  374. data/ext/pg_query/include/postgres/utils/aclchk_internal.h +45 -0
  375. data/ext/pg_query/include/postgres/utils/array.h +481 -0
  376. data/ext/pg_query/include/postgres/utils/ascii.h +84 -0
  377. data/ext/pg_query/include/postgres/utils/backend_progress.h +46 -0
  378. data/ext/pg_query/include/postgres/utils/backend_status.h +340 -0
  379. data/ext/pg_query/include/postgres/utils/builtins.h +139 -0
  380. data/ext/pg_query/include/postgres/utils/bytea.h +28 -0
  381. data/ext/pg_query/include/postgres/utils/catcache.h +231 -0
  382. data/ext/pg_query/include/postgres/utils/date.h +118 -0
  383. data/ext/pg_query/include/postgres/utils/datetime.h +367 -0
  384. data/ext/pg_query/include/postgres/utils/datum.h +76 -0
  385. data/ext/pg_query/include/postgres/utils/dsa.h +166 -0
  386. data/ext/pg_query/include/postgres/utils/elog.h +540 -0
  387. data/ext/pg_query/include/postgres/utils/errcodes.h +352 -0
  388. data/ext/pg_query/include/postgres/utils/expandeddatum.h +170 -0
  389. data/ext/pg_query/include/postgres/utils/expandedrecord.h +241 -0
  390. data/ext/pg_query/include/postgres/utils/float.h +357 -0
  391. data/ext/pg_query/include/postgres/utils/fmgroids.h +3347 -0
  392. data/ext/pg_query/include/postgres/utils/fmgrprotos.h +2904 -0
  393. data/ext/pg_query/include/postgres/utils/fmgrtab.h +49 -0
  394. data/ext/pg_query/include/postgres/utils/guc.h +456 -0
  395. data/ext/pg_query/include/postgres/utils/guc_hooks.h +184 -0
  396. data/ext/pg_query/include/postgres/utils/guc_tables.h +323 -0
  397. data/ext/pg_query/include/postgres/utils/hsearch.h +153 -0
  398. data/ext/pg_query/include/postgres/utils/injection_point.h +44 -0
  399. data/ext/pg_query/include/postgres/utils/inval.h +68 -0
  400. data/ext/pg_query/include/postgres/utils/logtape.h +77 -0
  401. data/ext/pg_query/include/postgres/utils/lsyscache.h +215 -0
  402. data/ext/pg_query/include/postgres/utils/memdebug.h +82 -0
  403. data/ext/pg_query/include/postgres/utils/memutils.h +193 -0
  404. data/ext/pg_query/include/postgres/utils/memutils_internal.h +176 -0
  405. data/ext/pg_query/include/postgres/utils/memutils_memorychunk.h +253 -0
  406. data/ext/pg_query/include/postgres/utils/numeric.h +110 -0
  407. data/ext/pg_query/include/postgres/utils/palloc.h +151 -0
  408. data/ext/pg_query/include/postgres/utils/partcache.h +103 -0
  409. data/ext/pg_query/include/postgres/utils/pg_locale.h +136 -0
  410. data/ext/pg_query/include/postgres/utils/pgstat_internal.h +827 -0
  411. data/ext/pg_query/include/postgres/utils/plancache.h +238 -0
  412. data/ext/pg_query/include/postgres/utils/portal.h +252 -0
  413. data/ext/pg_query/include/postgres/utils/probes.h +114 -0
  414. data/ext/pg_query/include/postgres/utils/ps_status.h +47 -0
  415. data/ext/pg_query/include/postgres/utils/queryenvironment.h +74 -0
  416. data/ext/pg_query/include/postgres/utils/regproc.h +39 -0
  417. data/ext/pg_query/include/postgres/utils/rel.h +711 -0
  418. data/ext/pg_query/include/postgres/utils/relcache.h +155 -0
  419. data/ext/pg_query/include/postgres/utils/reltrigger.h +81 -0
  420. data/ext/pg_query/include/postgres/utils/resowner.h +167 -0
  421. data/ext/pg_query/include/postgres/utils/ruleutils.h +52 -0
  422. data/ext/pg_query/include/postgres/utils/sharedtuplestore.h +61 -0
  423. data/ext/pg_query/include/postgres/utils/snapmgr.h +130 -0
  424. data/ext/pg_query/include/postgres/utils/snapshot.h +219 -0
  425. data/ext/pg_query/include/postgres/utils/sortsupport.h +391 -0
  426. data/ext/pg_query/include/postgres/utils/syscache.h +136 -0
  427. data/ext/pg_query/include/postgres/utils/timeout.h +96 -0
  428. data/ext/pg_query/include/postgres/utils/timestamp.h +147 -0
  429. data/ext/pg_query/include/postgres/utils/tuplesort.h +472 -0
  430. data/ext/pg_query/include/postgres/utils/tuplestore.h +88 -0
  431. data/ext/pg_query/include/postgres/utils/typcache.h +210 -0
  432. data/ext/pg_query/include/postgres/utils/varlena.h +53 -0
  433. data/ext/pg_query/include/postgres/utils/wait_event.h +108 -0
  434. data/ext/pg_query/include/postgres/utils/wait_event_types.h +218 -0
  435. data/ext/pg_query/include/postgres/utils/xml.h +94 -0
  436. data/ext/pg_query/include/postgres/varatt.h +358 -0
  437. data/ext/pg_query/include/protobuf/pg_query.pb-c.h +7723 -6368
  438. data/ext/pg_query/include/protobuf/pg_query.pb.h +120022 -87031
  439. data/ext/pg_query/pg_query.c +10 -1
  440. data/ext/pg_query/pg_query.pb-c.c +22595 -17738
  441. data/ext/pg_query/pg_query_deparse.c +1 -10635
  442. data/ext/pg_query/pg_query_fingerprint.c +12 -8
  443. data/ext/pg_query/pg_query_fingerprint.h +1 -1
  444. data/ext/pg_query/pg_query_internal.h +1 -1
  445. data/ext/pg_query/pg_query_json_plpgsql.c +1 -0
  446. data/ext/pg_query/pg_query_normalize.c +43 -2
  447. data/ext/pg_query/pg_query_outfuncs_json.c +9 -1
  448. data/ext/pg_query/pg_query_outfuncs_protobuf.c +3 -2
  449. data/ext/pg_query/pg_query_parse.c +47 -5
  450. data/ext/pg_query/pg_query_parse_plpgsql.c +19 -18
  451. data/ext/pg_query/pg_query_readfuncs_protobuf.c +3 -2
  452. data/ext/pg_query/pg_query_ruby.c +5 -0
  453. data/ext/pg_query/pg_query_scan.c +2 -2
  454. data/ext/pg_query/pg_query_split.c +3 -3
  455. data/ext/pg_query/postgres_deparse.c +11496 -0
  456. data/ext/pg_query/postgres_deparse.h +9 -0
  457. data/ext/pg_query/src_backend_catalog_namespace.c +243 -63
  458. data/ext/pg_query/src_backend_catalog_pg_proc.c +1 -3
  459. data/ext/pg_query/src_backend_commands_define.c +2 -3
  460. data/ext/pg_query/src_backend_nodes_bitmapset.c +140 -156
  461. data/ext/pg_query/src_backend_nodes_copyfuncs.c +96 -6202
  462. data/ext/pg_query/src_backend_nodes_equalfuncs.c +95 -4068
  463. data/ext/pg_query/src_backend_nodes_extensible.c +6 -29
  464. data/ext/pg_query/src_backend_nodes_list.c +16 -8
  465. data/ext/pg_query/src_backend_nodes_makefuncs.c +134 -1
  466. data/ext/pg_query/src_backend_nodes_nodeFuncs.c +391 -133
  467. data/ext/pg_query/src_backend_nodes_value.c +1 -1
  468. data/ext/pg_query/src_backend_parser_gram.c +43710 -39953
  469. data/ext/pg_query/src_backend_parser_parser.c +34 -8
  470. data/ext/pg_query/src_backend_parser_scan.c +6971 -3373
  471. data/ext/pg_query/src_backend_parser_scansup.c +2 -1
  472. data/ext/pg_query/src_backend_storage_ipc_ipc.c +1 -1
  473. data/ext/pg_query/src_backend_tcop_postgres.c +99 -96
  474. data/ext/pg_query/src_backend_utils_activity_pgstat_database.c +2 -2
  475. data/ext/pg_query/src_backend_utils_adt_datum.c +2 -2
  476. data/ext/pg_query/src_backend_utils_adt_expandeddatum.c +1 -1
  477. data/ext/pg_query/src_backend_utils_adt_format_type.c +1 -1
  478. data/ext/pg_query/src_backend_utils_adt_numutils.c +488 -0
  479. data/ext/pg_query/src_backend_utils_adt_ruleutils.c +177 -30
  480. data/ext/pg_query/src_backend_utils_error_assert.c +4 -7
  481. data/ext/pg_query/src_backend_utils_error_elog.c +397 -270
  482. data/ext/pg_query/src_backend_utils_fmgr_fmgr.c +36 -2
  483. data/ext/pg_query/src_backend_utils_init_globals.c +20 -5
  484. data/ext/pg_query/src_backend_utils_mb_mbutils.c +31 -84
  485. data/ext/pg_query/src_backend_utils_misc_guc_tables.c +502 -0
  486. data/ext/pg_query/src_backend_utils_mmgr_alignedalloc.c +166 -0
  487. data/ext/pg_query/src_backend_utils_mmgr_aset.c +704 -497
  488. data/ext/pg_query/src_backend_utils_mmgr_bump.c +728 -0
  489. data/ext/pg_query/src_backend_utils_mmgr_generation.c +1115 -0
  490. data/ext/pg_query/src_backend_utils_mmgr_mcxt.c +637 -233
  491. data/ext/pg_query/src_backend_utils_mmgr_slab.c +1079 -0
  492. data/ext/pg_query/src_common_encnames.c +46 -44
  493. data/ext/pg_query/src_common_hashfn.c +1 -1
  494. data/ext/pg_query/src_common_keywords.c +1 -1
  495. data/ext/pg_query/src_common_kwlist_d.h +586 -517
  496. data/ext/pg_query/src_common_kwlookup.c +1 -1
  497. data/ext/pg_query/src_common_psprintf.c +3 -3
  498. data/ext/pg_query/src_common_stringinfo.c +21 -4
  499. data/ext/pg_query/src_common_wchar.c +100 -116
  500. data/ext/pg_query/src_pl_plpgsql_src_pl_comp.c +99 -5
  501. data/ext/pg_query/src_pl_plpgsql_src_pl_funcs.c +3 -1
  502. data/ext/pg_query/src_pl_plpgsql_src_pl_gram.c +829 -763
  503. data/ext/pg_query/src_pl_plpgsql_src_pl_handler.c +1 -1
  504. data/ext/pg_query/src_pl_plpgsql_src_pl_reserved_kwlist_d.h +1 -1
  505. data/ext/pg_query/src_pl_plpgsql_src_pl_scanner.c +19 -1
  506. data/ext/pg_query/src_pl_plpgsql_src_pl_unreserved_kwlist_d.h +48 -46
  507. data/ext/pg_query/src_port_pg_bitutils.c +251 -32
  508. data/ext/pg_query/src_port_pgstrcasecmp.c +57 -1
  509. data/ext/pg_query/src_port_snprintf.c +20 -27
  510. data/ext/pg_query/src_port_strerror.c +1 -3
  511. data/ext/pg_query/src_port_strlcpy.c +79 -0
  512. data/lib/pg_query/fingerprint.rb +5 -8
  513. data/lib/pg_query/node.rb +16 -11
  514. data/lib/pg_query/param_refs.rb +2 -2
  515. data/lib/pg_query/parse.rb +6 -8
  516. data/lib/pg_query/parse_error.rb +1 -0
  517. data/lib/pg_query/pg_query_pb.rb +173 -3196
  518. data/lib/pg_query/scan.rb +1 -0
  519. data/lib/pg_query/treewalker.rb +52 -11
  520. data/lib/pg_query/truncate.rb +18 -20
  521. data/lib/pg_query/version.rb +1 -1
  522. metadata +443 -442
  523. data/ext/pg_query/guc-file.c +0 -0
  524. data/ext/pg_query/include/access/amapi.h +0 -290
  525. data/ext/pg_query/include/access/attmap.h +0 -52
  526. data/ext/pg_query/include/access/attnum.h +0 -64
  527. data/ext/pg_query/include/access/clog.h +0 -63
  528. data/ext/pg_query/include/access/commit_ts.h +0 -74
  529. data/ext/pg_query/include/access/detoast.h +0 -82
  530. data/ext/pg_query/include/access/genam.h +0 -231
  531. data/ext/pg_query/include/access/gin.h +0 -78
  532. data/ext/pg_query/include/access/htup.h +0 -89
  533. data/ext/pg_query/include/access/htup_details.h +0 -807
  534. data/ext/pg_query/include/access/itup.h +0 -167
  535. data/ext/pg_query/include/access/parallel.h +0 -82
  536. data/ext/pg_query/include/access/printtup.h +0 -35
  537. data/ext/pg_query/include/access/relation.h +0 -28
  538. data/ext/pg_query/include/access/relscan.h +0 -191
  539. data/ext/pg_query/include/access/rmgrlist.h +0 -49
  540. data/ext/pg_query/include/access/sdir.h +0 -58
  541. data/ext/pg_query/include/access/skey.h +0 -151
  542. data/ext/pg_query/include/access/stratnum.h +0 -85
  543. data/ext/pg_query/include/access/sysattr.h +0 -29
  544. data/ext/pg_query/include/access/table.h +0 -28
  545. data/ext/pg_query/include/access/tableam.h +0 -2077
  546. data/ext/pg_query/include/access/toast_compression.h +0 -73
  547. data/ext/pg_query/include/access/transam.h +0 -375
  548. data/ext/pg_query/include/access/tupconvert.h +0 -51
  549. data/ext/pg_query/include/access/tupdesc.h +0 -154
  550. data/ext/pg_query/include/access/tupmacs.h +0 -247
  551. data/ext/pg_query/include/access/twophase.h +0 -65
  552. data/ext/pg_query/include/access/xact.h +0 -523
  553. data/ext/pg_query/include/access/xlog.h +0 -303
  554. data/ext/pg_query/include/access/xlog_internal.h +0 -366
  555. data/ext/pg_query/include/access/xlogdefs.h +0 -101
  556. data/ext/pg_query/include/access/xlogprefetcher.h +0 -55
  557. data/ext/pg_query/include/access/xlogreader.h +0 -443
  558. data/ext/pg_query/include/access/xlogrecord.h +0 -236
  559. data/ext/pg_query/include/access/xlogrecovery.h +0 -157
  560. data/ext/pg_query/include/c.h +0 -1391
  561. data/ext/pg_query/include/catalog/catalog.h +0 -44
  562. data/ext/pg_query/include/catalog/catversion.h +0 -58
  563. data/ext/pg_query/include/catalog/dependency.h +0 -269
  564. data/ext/pg_query/include/catalog/genbki.h +0 -142
  565. data/ext/pg_query/include/catalog/index.h +0 -214
  566. data/ext/pg_query/include/catalog/indexing.h +0 -54
  567. data/ext/pg_query/include/catalog/namespace.h +0 -190
  568. data/ext/pg_query/include/catalog/objectaccess.h +0 -265
  569. data/ext/pg_query/include/catalog/objectaddress.h +0 -89
  570. data/ext/pg_query/include/catalog/pg_aggregate.h +0 -180
  571. data/ext/pg_query/include/catalog/pg_aggregate_d.h +0 -78
  572. data/ext/pg_query/include/catalog/pg_am.h +0 -63
  573. data/ext/pg_query/include/catalog/pg_am_d.h +0 -47
  574. data/ext/pg_query/include/catalog/pg_attribute.h +0 -221
  575. data/ext/pg_query/include/catalog/pg_attribute_d.h +0 -62
  576. data/ext/pg_query/include/catalog/pg_authid.h +0 -63
  577. data/ext/pg_query/include/catalog/pg_authid_d.h +0 -57
  578. data/ext/pg_query/include/catalog/pg_class.h +0 -230
  579. data/ext/pg_query/include/catalog/pg_class_d.h +0 -132
  580. data/ext/pg_query/include/catalog/pg_collation.h +0 -98
  581. data/ext/pg_query/include/catalog/pg_collation_d.h +0 -62
  582. data/ext/pg_query/include/catalog/pg_constraint.h +0 -273
  583. data/ext/pg_query/include/catalog/pg_constraint_d.h +0 -73
  584. data/ext/pg_query/include/catalog/pg_control.h +0 -250
  585. data/ext/pg_query/include/catalog/pg_conversion.h +0 -75
  586. data/ext/pg_query/include/catalog/pg_conversion_d.h +0 -38
  587. data/ext/pg_query/include/catalog/pg_depend.h +0 -77
  588. data/ext/pg_query/include/catalog/pg_depend_d.h +0 -36
  589. data/ext/pg_query/include/catalog/pg_event_trigger.h +0 -57
  590. data/ext/pg_query/include/catalog/pg_event_trigger_d.h +0 -36
  591. data/ext/pg_query/include/catalog/pg_index.h +0 -90
  592. data/ext/pg_query/include/catalog/pg_index_d.h +0 -59
  593. data/ext/pg_query/include/catalog/pg_language.h +0 -72
  594. data/ext/pg_query/include/catalog/pg_language_d.h +0 -41
  595. data/ext/pg_query/include/catalog/pg_namespace.h +0 -64
  596. data/ext/pg_query/include/catalog/pg_namespace_d.h +0 -36
  597. data/ext/pg_query/include/catalog/pg_opclass.h +0 -88
  598. data/ext/pg_query/include/catalog/pg_opclass_d.h +0 -51
  599. data/ext/pg_query/include/catalog/pg_operator.h +0 -107
  600. data/ext/pg_query/include/catalog/pg_operator_d.h +0 -142
  601. data/ext/pg_query/include/catalog/pg_opfamily.h +0 -63
  602. data/ext/pg_query/include/catalog/pg_opfamily_d.h +0 -49
  603. data/ext/pg_query/include/catalog/pg_parameter_acl.h +0 -60
  604. data/ext/pg_query/include/catalog/pg_parameter_acl_d.h +0 -34
  605. data/ext/pg_query/include/catalog/pg_partitioned_table.h +0 -74
  606. data/ext/pg_query/include/catalog/pg_partitioned_table_d.h +0 -36
  607. data/ext/pg_query/include/catalog/pg_proc.h +0 -220
  608. data/ext/pg_query/include/catalog/pg_proc_d.h +0 -101
  609. data/ext/pg_query/include/catalog/pg_publication.h +0 -161
  610. data/ext/pg_query/include/catalog/pg_publication_d.h +0 -38
  611. data/ext/pg_query/include/catalog/pg_replication_origin.h +0 -62
  612. data/ext/pg_query/include/catalog/pg_replication_origin_d.h +0 -33
  613. data/ext/pg_query/include/catalog/pg_statistic.h +0 -282
  614. data/ext/pg_query/include/catalog/pg_statistic_d.h +0 -195
  615. data/ext/pg_query/include/catalog/pg_statistic_ext.h +0 -88
  616. data/ext/pg_query/include/catalog/pg_statistic_ext_d.h +0 -45
  617. data/ext/pg_query/include/catalog/pg_transform.h +0 -48
  618. data/ext/pg_query/include/catalog/pg_transform_d.h +0 -34
  619. data/ext/pg_query/include/catalog/pg_trigger.h +0 -153
  620. data/ext/pg_query/include/catalog/pg_trigger_d.h +0 -109
  621. data/ext/pg_query/include/catalog/pg_ts_config.h +0 -53
  622. data/ext/pg_query/include/catalog/pg_ts_config_d.h +0 -34
  623. data/ext/pg_query/include/catalog/pg_ts_dict.h +0 -59
  624. data/ext/pg_query/include/catalog/pg_ts_dict_d.h +0 -35
  625. data/ext/pg_query/include/catalog/pg_ts_parser.h +0 -60
  626. data/ext/pg_query/include/catalog/pg_ts_parser_d.h +0 -37
  627. data/ext/pg_query/include/catalog/pg_ts_template.h +0 -51
  628. data/ext/pg_query/include/catalog/pg_ts_template_d.h +0 -34
  629. data/ext/pg_query/include/catalog/pg_type.h +0 -404
  630. data/ext/pg_query/include/catalog/pg_type_d.h +0 -324
  631. data/ext/pg_query/include/catalog/storage.h +0 -50
  632. data/ext/pg_query/include/commands/async.h +0 -53
  633. data/ext/pg_query/include/commands/dbcommands.h +0 -36
  634. data/ext/pg_query/include/commands/defrem.h +0 -160
  635. data/ext/pg_query/include/commands/event_trigger.h +0 -88
  636. data/ext/pg_query/include/commands/explain.h +0 -127
  637. data/ext/pg_query/include/commands/prepare.h +0 -61
  638. data/ext/pg_query/include/commands/tablespace.h +0 -69
  639. data/ext/pg_query/include/commands/trigger.h +0 -287
  640. data/ext/pg_query/include/commands/user.h +0 -37
  641. data/ext/pg_query/include/commands/vacuum.h +0 -340
  642. data/ext/pg_query/include/commands/variable.h +0 -38
  643. data/ext/pg_query/include/common/file_perm.h +0 -56
  644. data/ext/pg_query/include/common/hashfn.h +0 -104
  645. data/ext/pg_query/include/common/ip.h +0 -31
  646. data/ext/pg_query/include/common/keywords.h +0 -29
  647. data/ext/pg_query/include/common/kwlookup.h +0 -44
  648. data/ext/pg_query/include/common/pg_prng.h +0 -60
  649. data/ext/pg_query/include/common/relpath.h +0 -90
  650. data/ext/pg_query/include/common/string.h +0 -42
  651. data/ext/pg_query/include/common/unicode_combining_table.h +0 -308
  652. data/ext/pg_query/include/common/unicode_east_asian_fw_table.h +0 -125
  653. data/ext/pg_query/include/datatype/timestamp.h +0 -236
  654. data/ext/pg_query/include/executor/execdesc.h +0 -70
  655. data/ext/pg_query/include/executor/executor.h +0 -663
  656. data/ext/pg_query/include/executor/functions.h +0 -55
  657. data/ext/pg_query/include/executor/instrument.h +0 -118
  658. data/ext/pg_query/include/executor/spi.h +0 -213
  659. data/ext/pg_query/include/executor/tablefunc.h +0 -67
  660. data/ext/pg_query/include/executor/tuptable.h +0 -487
  661. data/ext/pg_query/include/fmgr.h +0 -781
  662. data/ext/pg_query/include/funcapi.h +0 -360
  663. data/ext/pg_query/include/getaddrinfo.h +0 -162
  664. data/ext/pg_query/include/jit/jit.h +0 -105
  665. data/ext/pg_query/include/kwlist_d.h +0 -1095
  666. data/ext/pg_query/include/lib/dshash.h +0 -112
  667. data/ext/pg_query/include/lib/ilist.h +0 -746
  668. data/ext/pg_query/include/lib/pairingheap.h +0 -102
  669. data/ext/pg_query/include/lib/simplehash.h +0 -1184
  670. data/ext/pg_query/include/lib/sort_template.h +0 -432
  671. data/ext/pg_query/include/lib/stringinfo.h +0 -161
  672. data/ext/pg_query/include/libpq/auth.h +0 -31
  673. data/ext/pg_query/include/libpq/crypt.h +0 -47
  674. data/ext/pg_query/include/libpq/hba.h +0 -179
  675. data/ext/pg_query/include/libpq/libpq-be.h +0 -343
  676. data/ext/pg_query/include/libpq/libpq.h +0 -144
  677. data/ext/pg_query/include/libpq/pqcomm.h +0 -194
  678. data/ext/pg_query/include/libpq/pqformat.h +0 -210
  679. data/ext/pg_query/include/libpq/pqsignal.h +0 -42
  680. data/ext/pg_query/include/mb/pg_wchar.h +0 -755
  681. data/ext/pg_query/include/mb/stringinfo_mb.h +0 -24
  682. data/ext/pg_query/include/miscadmin.h +0 -495
  683. data/ext/pg_query/include/nodes/bitmapset.h +0 -122
  684. data/ext/pg_query/include/nodes/execnodes.h +0 -2715
  685. data/ext/pg_query/include/nodes/extensible.h +0 -162
  686. data/ext/pg_query/include/nodes/lockoptions.h +0 -61
  687. data/ext/pg_query/include/nodes/makefuncs.h +0 -109
  688. data/ext/pg_query/include/nodes/memnodes.h +0 -110
  689. data/ext/pg_query/include/nodes/nodeFuncs.h +0 -162
  690. data/ext/pg_query/include/nodes/nodes.h +0 -861
  691. data/ext/pg_query/include/nodes/params.h +0 -170
  692. data/ext/pg_query/include/nodes/parsenodes.h +0 -3812
  693. data/ext/pg_query/include/nodes/pathnodes.h +0 -2734
  694. data/ext/pg_query/include/nodes/pg_list.h +0 -612
  695. data/ext/pg_query/include/nodes/plannodes.h +0 -1349
  696. data/ext/pg_query/include/nodes/primnodes.h +0 -1593
  697. data/ext/pg_query/include/nodes/print.h +0 -34
  698. data/ext/pg_query/include/nodes/tidbitmap.h +0 -75
  699. data/ext/pg_query/include/nodes/value.h +0 -80
  700. data/ext/pg_query/include/optimizer/cost.h +0 -213
  701. data/ext/pg_query/include/optimizer/geqo.h +0 -90
  702. data/ext/pg_query/include/optimizer/geqo_gene.h +0 -45
  703. data/ext/pg_query/include/optimizer/optimizer.h +0 -202
  704. data/ext/pg_query/include/optimizer/paths.h +0 -257
  705. data/ext/pg_query/include/optimizer/planmain.h +0 -120
  706. data/ext/pg_query/include/parser/analyze.h +0 -63
  707. data/ext/pg_query/include/parser/gram.h +0 -1101
  708. data/ext/pg_query/include/parser/gramparse.h +0 -75
  709. data/ext/pg_query/include/parser/kwlist.h +0 -487
  710. data/ext/pg_query/include/parser/parse_agg.h +0 -63
  711. data/ext/pg_query/include/parser/parse_coerce.h +0 -100
  712. data/ext/pg_query/include/parser/parse_expr.h +0 -25
  713. data/ext/pg_query/include/parser/parse_func.h +0 -74
  714. data/ext/pg_query/include/parser/parse_node.h +0 -339
  715. data/ext/pg_query/include/parser/parse_oper.h +0 -65
  716. data/ext/pg_query/include/parser/parse_relation.h +0 -124
  717. data/ext/pg_query/include/parser/parse_type.h +0 -60
  718. data/ext/pg_query/include/parser/parser.h +0 -68
  719. data/ext/pg_query/include/parser/parsetree.h +0 -61
  720. data/ext/pg_query/include/parser/scanner.h +0 -152
  721. data/ext/pg_query/include/parser/scansup.h +0 -27
  722. data/ext/pg_query/include/partitioning/partdefs.h +0 -26
  723. data/ext/pg_query/include/pg_config.h +0 -1037
  724. data/ext/pg_query/include/pg_config_manual.h +0 -410
  725. data/ext/pg_query/include/pg_config_os.h +0 -8
  726. data/ext/pg_query/include/pg_getopt.h +0 -56
  727. data/ext/pg_query/include/pg_trace.h +0 -17
  728. data/ext/pg_query/include/pgstat.h +0 -699
  729. data/ext/pg_query/include/pgtime.h +0 -94
  730. data/ext/pg_query/include/pl_gram.h +0 -383
  731. data/ext/pg_query/include/pl_reserved_kwlist.h +0 -52
  732. data/ext/pg_query/include/pl_reserved_kwlist_d.h +0 -114
  733. data/ext/pg_query/include/pl_unreserved_kwlist.h +0 -111
  734. data/ext/pg_query/include/pl_unreserved_kwlist_d.h +0 -244
  735. data/ext/pg_query/include/plerrcodes.h +0 -998
  736. data/ext/pg_query/include/plpgsql.h +0 -1345
  737. data/ext/pg_query/include/port/atomics/arch-arm.h +0 -32
  738. data/ext/pg_query/include/port/atomics/arch-ppc.h +0 -254
  739. data/ext/pg_query/include/port/atomics/arch-x86.h +0 -252
  740. data/ext/pg_query/include/port/atomics/fallback.h +0 -170
  741. data/ext/pg_query/include/port/atomics/generic-gcc.h +0 -286
  742. data/ext/pg_query/include/port/atomics/generic.h +0 -401
  743. data/ext/pg_query/include/port/atomics.h +0 -524
  744. data/ext/pg_query/include/port/pg_bitutils.h +0 -302
  745. data/ext/pg_query/include/port/pg_bswap.h +0 -161
  746. data/ext/pg_query/include/port/pg_crc32c.h +0 -101
  747. data/ext/pg_query/include/port.h +0 -553
  748. data/ext/pg_query/include/portability/instr_time.h +0 -256
  749. data/ext/pg_query/include/postgres.h +0 -808
  750. data/ext/pg_query/include/postgres_ext.h +0 -74
  751. data/ext/pg_query/include/postmaster/autovacuum.h +0 -83
  752. data/ext/pg_query/include/postmaster/auxprocess.h +0 -20
  753. data/ext/pg_query/include/postmaster/bgworker.h +0 -162
  754. data/ext/pg_query/include/postmaster/bgworker_internals.h +0 -64
  755. data/ext/pg_query/include/postmaster/bgwriter.h +0 -45
  756. data/ext/pg_query/include/postmaster/fork_process.h +0 -17
  757. data/ext/pg_query/include/postmaster/interrupt.h +0 -32
  758. data/ext/pg_query/include/postmaster/pgarch.h +0 -73
  759. data/ext/pg_query/include/postmaster/postmaster.h +0 -78
  760. data/ext/pg_query/include/postmaster/startup.h +0 -39
  761. data/ext/pg_query/include/postmaster/syslogger.h +0 -103
  762. data/ext/pg_query/include/postmaster/walwriter.h +0 -21
  763. data/ext/pg_query/include/regex/regex.h +0 -186
  764. data/ext/pg_query/include/replication/logicallauncher.h +0 -29
  765. data/ext/pg_query/include/replication/logicalproto.h +0 -254
  766. data/ext/pg_query/include/replication/logicalworker.h +0 -19
  767. data/ext/pg_query/include/replication/origin.h +0 -73
  768. data/ext/pg_query/include/replication/reorderbuffer.h +0 -685
  769. data/ext/pg_query/include/replication/slot.h +0 -230
  770. data/ext/pg_query/include/replication/syncrep.h +0 -115
  771. data/ext/pg_query/include/replication/walreceiver.h +0 -472
  772. data/ext/pg_query/include/replication/walsender.h +0 -74
  773. data/ext/pg_query/include/rewrite/prs2lock.h +0 -46
  774. data/ext/pg_query/include/rewrite/rewriteHandler.h +0 -38
  775. data/ext/pg_query/include/rewrite/rewriteManip.h +0 -87
  776. data/ext/pg_query/include/rewrite/rewriteSupport.h +0 -26
  777. data/ext/pg_query/include/storage/backendid.h +0 -37
  778. data/ext/pg_query/include/storage/block.h +0 -115
  779. data/ext/pg_query/include/storage/buf.h +0 -46
  780. data/ext/pg_query/include/storage/bufmgr.h +0 -297
  781. data/ext/pg_query/include/storage/bufpage.h +0 -457
  782. data/ext/pg_query/include/storage/condition_variable.h +0 -73
  783. data/ext/pg_query/include/storage/dsm.h +0 -64
  784. data/ext/pg_query/include/storage/dsm_impl.h +0 -76
  785. data/ext/pg_query/include/storage/fd.h +0 -198
  786. data/ext/pg_query/include/storage/fileset.h +0 -40
  787. data/ext/pg_query/include/storage/ipc.h +0 -84
  788. data/ext/pg_query/include/storage/item.h +0 -19
  789. data/ext/pg_query/include/storage/itemid.h +0 -184
  790. data/ext/pg_query/include/storage/itemptr.h +0 -208
  791. data/ext/pg_query/include/storage/large_object.h +0 -100
  792. data/ext/pg_query/include/storage/latch.h +0 -186
  793. data/ext/pg_query/include/storage/lmgr.h +0 -115
  794. data/ext/pg_query/include/storage/lock.h +0 -616
  795. data/ext/pg_query/include/storage/lockdefs.h +0 -59
  796. data/ext/pg_query/include/storage/lwlock.h +0 -206
  797. data/ext/pg_query/include/storage/lwlocknames.h +0 -50
  798. data/ext/pg_query/include/storage/off.h +0 -57
  799. data/ext/pg_query/include/storage/pg_sema.h +0 -61
  800. data/ext/pg_query/include/storage/pg_shmem.h +0 -92
  801. data/ext/pg_query/include/storage/pmsignal.h +0 -105
  802. data/ext/pg_query/include/storage/predicate.h +0 -87
  803. data/ext/pg_query/include/storage/proc.h +0 -461
  804. data/ext/pg_query/include/storage/procarray.h +0 -98
  805. data/ext/pg_query/include/storage/proclist_types.h +0 -51
  806. data/ext/pg_query/include/storage/procsignal.h +0 -71
  807. data/ext/pg_query/include/storage/relfilenode.h +0 -99
  808. data/ext/pg_query/include/storage/s_lock.h +0 -1110
  809. data/ext/pg_query/include/storage/sharedfileset.h +0 -37
  810. data/ext/pg_query/include/storage/shm_mq.h +0 -86
  811. data/ext/pg_query/include/storage/shm_toc.h +0 -58
  812. data/ext/pg_query/include/storage/shmem.h +0 -81
  813. data/ext/pg_query/include/storage/sinval.h +0 -153
  814. data/ext/pg_query/include/storage/sinvaladt.h +0 -43
  815. data/ext/pg_query/include/storage/smgr.h +0 -111
  816. data/ext/pg_query/include/storage/spin.h +0 -77
  817. data/ext/pg_query/include/storage/standby.h +0 -98
  818. data/ext/pg_query/include/storage/standbydefs.h +0 -74
  819. data/ext/pg_query/include/storage/sync.h +0 -66
  820. data/ext/pg_query/include/tcop/cmdtag.h +0 -58
  821. data/ext/pg_query/include/tcop/cmdtaglist.h +0 -218
  822. data/ext/pg_query/include/tcop/deparse_utility.h +0 -108
  823. data/ext/pg_query/include/tcop/dest.h +0 -149
  824. data/ext/pg_query/include/tcop/fastpath.h +0 -20
  825. data/ext/pg_query/include/tcop/pquery.h +0 -51
  826. data/ext/pg_query/include/tcop/tcopprot.h +0 -97
  827. data/ext/pg_query/include/tcop/utility.h +0 -112
  828. data/ext/pg_query/include/tsearch/ts_cache.h +0 -98
  829. data/ext/pg_query/include/utils/acl.h +0 -333
  830. data/ext/pg_query/include/utils/aclchk_internal.h +0 -45
  831. data/ext/pg_query/include/utils/array.h +0 -464
  832. data/ext/pg_query/include/utils/backend_progress.h +0 -44
  833. data/ext/pg_query/include/utils/backend_status.h +0 -321
  834. data/ext/pg_query/include/utils/builtins.h +0 -127
  835. data/ext/pg_query/include/utils/bytea.h +0 -28
  836. data/ext/pg_query/include/utils/catcache.h +0 -231
  837. data/ext/pg_query/include/utils/date.h +0 -90
  838. data/ext/pg_query/include/utils/datetime.h +0 -344
  839. data/ext/pg_query/include/utils/datum.h +0 -76
  840. data/ext/pg_query/include/utils/dsa.h +0 -123
  841. data/ext/pg_query/include/utils/dynahash.h +0 -20
  842. data/ext/pg_query/include/utils/elog.h +0 -470
  843. data/ext/pg_query/include/utils/errcodes.h +0 -354
  844. data/ext/pg_query/include/utils/expandeddatum.h +0 -159
  845. data/ext/pg_query/include/utils/expandedrecord.h +0 -231
  846. data/ext/pg_query/include/utils/float.h +0 -356
  847. data/ext/pg_query/include/utils/fmgroids.h +0 -3261
  848. data/ext/pg_query/include/utils/fmgrprotos.h +0 -2829
  849. data/ext/pg_query/include/utils/fmgrtab.h +0 -49
  850. data/ext/pg_query/include/utils/guc.h +0 -469
  851. data/ext/pg_query/include/utils/guc_tables.h +0 -276
  852. data/ext/pg_query/include/utils/hsearch.h +0 -153
  853. data/ext/pg_query/include/utils/inval.h +0 -68
  854. data/ext/pg_query/include/utils/lsyscache.h +0 -208
  855. data/ext/pg_query/include/utils/memdebug.h +0 -82
  856. data/ext/pg_query/include/utils/memutils.h +0 -230
  857. data/ext/pg_query/include/utils/numeric.h +0 -90
  858. data/ext/pg_query/include/utils/palloc.h +0 -158
  859. data/ext/pg_query/include/utils/partcache.h +0 -102
  860. data/ext/pg_query/include/utils/pg_locale.h +0 -127
  861. data/ext/pg_query/include/utils/pg_lsn.h +0 -29
  862. data/ext/pg_query/include/utils/pgstat_internal.h +0 -784
  863. data/ext/pg_query/include/utils/pidfile.h +0 -56
  864. data/ext/pg_query/include/utils/plancache.h +0 -236
  865. data/ext/pg_query/include/utils/portal.h +0 -252
  866. data/ext/pg_query/include/utils/probes.h +0 -114
  867. data/ext/pg_query/include/utils/ps_status.h +0 -25
  868. data/ext/pg_query/include/utils/queryenvironment.h +0 -74
  869. data/ext/pg_query/include/utils/queryjumble.h +0 -88
  870. data/ext/pg_query/include/utils/regproc.h +0 -39
  871. data/ext/pg_query/include/utils/rel.h +0 -695
  872. data/ext/pg_query/include/utils/relcache.h +0 -153
  873. data/ext/pg_query/include/utils/reltrigger.h +0 -81
  874. data/ext/pg_query/include/utils/resowner.h +0 -86
  875. data/ext/pg_query/include/utils/rls.h +0 -50
  876. data/ext/pg_query/include/utils/ruleutils.h +0 -47
  877. data/ext/pg_query/include/utils/sharedtuplestore.h +0 -61
  878. data/ext/pg_query/include/utils/snapmgr.h +0 -179
  879. data/ext/pg_query/include/utils/snapshot.h +0 -219
  880. data/ext/pg_query/include/utils/sortsupport.h +0 -391
  881. data/ext/pg_query/include/utils/syscache.h +0 -224
  882. data/ext/pg_query/include/utils/timeout.h +0 -95
  883. data/ext/pg_query/include/utils/timestamp.h +0 -117
  884. data/ext/pg_query/include/utils/tuplesort.h +0 -291
  885. data/ext/pg_query/include/utils/tuplestore.h +0 -91
  886. data/ext/pg_query/include/utils/typcache.h +0 -209
  887. data/ext/pg_query/include/utils/tzparser.h +0 -39
  888. data/ext/pg_query/include/utils/varlena.h +0 -41
  889. data/ext/pg_query/include/utils/wait_event.h +0 -289
  890. data/ext/pg_query/include/utils/xml.h +0 -84
  891. data/ext/pg_query/src_backend_postmaster_postmaster.c +0 -2201
  892. data/ext/pg_query/src_backend_storage_lmgr_s_lock.c +0 -371
  893. data/ext/pg_query/src_backend_utils_hash_dynahash.c +0 -1116
  894. data/ext/pg_query/src_backend_utils_misc_guc.c +0 -1993
  895. data/ext/pg_query/src_common_pg_prng.c +0 -152
  896. data/ext/pg_query/src_common_string.c +0 -92
  897. data/ext/pg_query/src_port_pgsleep.c +0 -69
  898. data/ext/pg_query/src_port_strnlen.c +0 -39
  899. /data/ext/pg_query/{pg_query_ruby.sym → ext_symbols.sym} +0 -0
  900. /data/ext/pg_query/include/{access → postgres/access}/rmgr.h +0 -0
  901. /data/ext/pg_query/include/{pg_config_ext.h → postgres/pg_config_ext.h} +0 -0
@@ -4,29 +4,43 @@
4
4
  * - MemoryContextReset
5
5
  * - MemoryContextDeleteChildren
6
6
  * - MemoryContextDelete
7
+ * - MemoryContextDeleteOnly
7
8
  * - TopMemoryContext
8
9
  * - CurrentMemoryContext
9
10
  * - MemoryContextSetParent
10
11
  * - MemoryContextCallResetCallbacks
11
12
  * - MemoryContextResetOnly
12
13
  * - repalloc
14
+ * - GetMemoryChunkContext
15
+ * - mcxt_methods
16
+ * - MemoryContextAllocationFailure
13
17
  * - MemoryContextStats
14
18
  * - MemoryContextStatsDetail
15
19
  * - MemoryContextStatsInternal
16
20
  * - MemoryContextStatsPrint
21
+ * - MemoryContextTraverseNext
22
+ * - GetMemoryChunkSpace
23
+ * - MemoryContextAllocAligned
24
+ * - MemoryContextAllocExtended
25
+ * - BogusFree
26
+ * - GetMemoryChunkHeader
27
+ * - BogusRealloc
28
+ * - BogusGetChunkContext
29
+ * - BogusGetChunkSpace
30
+ * - GetMemoryChunkMethodID
17
31
  * - pfree
18
32
  * - pstrdup
19
33
  * - MemoryContextStrdup
20
34
  * - MemoryContextAlloc
21
35
  * - palloc
22
- * - MemoryContextAllocZeroAligned
23
- * - MemoryContextAllocZero
24
36
  * - palloc0
25
37
  * - MemoryContextCreate
26
38
  * - MemoryContextInit
27
39
  * - MemoryContextAllowInCriticalSection
28
40
  * - CurrentMemoryContext
29
41
  * - MemoryContextDelete
42
+ * - MemoryContextAllocZero
43
+ * - MemoryContextSizeFailure
30
44
  * - palloc0
31
45
  * - MemoryContextAllocExtended
32
46
  *--------------------------------------------------------------------
@@ -43,7 +57,7 @@
43
57
  * context's MemoryContextMethods struct.
44
58
  *
45
59
  *
46
- * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
60
+ * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group
47
61
  * Portions Copyright (c) 1994, Regents of the University of California
48
62
  *
49
63
  *
@@ -57,17 +71,118 @@
57
71
 
58
72
  #include "mb/pg_wchar.h"
59
73
  #include "miscadmin.h"
60
- #include "storage/proc.h"
61
- #include "storage/procarray.h"
62
- #include "storage/procsignal.h"
63
- #include "utils/fmgrprotos.h"
64
74
  #include "utils/memdebug.h"
65
75
  #include "utils/memutils.h"
76
+ #include "utils/memutils_internal.h"
77
+ #include "utils/memutils_memorychunk.h"
66
78
 
67
79
 
80
+ static void BogusFree(void *pointer);
81
+ static void *BogusRealloc(void *pointer, Size size, int flags);
82
+ static MemoryContext BogusGetChunkContext(void *pointer);
83
+ static Size BogusGetChunkSpace(void *pointer);
84
+
68
85
  /*****************************************************************************
69
86
  * GLOBAL MEMORY *
70
87
  *****************************************************************************/
88
+ #define BOGUS_MCTX(id) \
89
+ [id].free_p = BogusFree, \
90
+ [id].realloc = BogusRealloc, \
91
+ [id].get_chunk_context = BogusGetChunkContext, \
92
+ [id].get_chunk_space = BogusGetChunkSpace
93
+
94
+ static const MemoryContextMethods mcxt_methods[] = {
95
+ /* aset.c */
96
+ [MCTX_ASET_ID].alloc = AllocSetAlloc,
97
+ [MCTX_ASET_ID].free_p = AllocSetFree,
98
+ [MCTX_ASET_ID].realloc = AllocSetRealloc,
99
+ [MCTX_ASET_ID].reset = AllocSetReset,
100
+ [MCTX_ASET_ID].delete_context = AllocSetDelete,
101
+ [MCTX_ASET_ID].get_chunk_context = AllocSetGetChunkContext,
102
+ [MCTX_ASET_ID].get_chunk_space = AllocSetGetChunkSpace,
103
+ [MCTX_ASET_ID].is_empty = AllocSetIsEmpty,
104
+ [MCTX_ASET_ID].stats = AllocSetStats,
105
+ #ifdef MEMORY_CONTEXT_CHECKING
106
+ [MCTX_ASET_ID].check = AllocSetCheck,
107
+ #endif
108
+
109
+ /* generation.c */
110
+ [MCTX_GENERATION_ID].alloc = GenerationAlloc,
111
+ [MCTX_GENERATION_ID].free_p = GenerationFree,
112
+ [MCTX_GENERATION_ID].realloc = GenerationRealloc,
113
+ [MCTX_GENERATION_ID].reset = GenerationReset,
114
+ [MCTX_GENERATION_ID].delete_context = GenerationDelete,
115
+ [MCTX_GENERATION_ID].get_chunk_context = GenerationGetChunkContext,
116
+ [MCTX_GENERATION_ID].get_chunk_space = GenerationGetChunkSpace,
117
+ [MCTX_GENERATION_ID].is_empty = GenerationIsEmpty,
118
+ [MCTX_GENERATION_ID].stats = GenerationStats,
119
+ #ifdef MEMORY_CONTEXT_CHECKING
120
+ [MCTX_GENERATION_ID].check = GenerationCheck,
121
+ #endif
122
+
123
+ /* slab.c */
124
+ [MCTX_SLAB_ID].alloc = SlabAlloc,
125
+ [MCTX_SLAB_ID].free_p = SlabFree,
126
+ [MCTX_SLAB_ID].realloc = SlabRealloc,
127
+ [MCTX_SLAB_ID].reset = SlabReset,
128
+ [MCTX_SLAB_ID].delete_context = SlabDelete,
129
+ [MCTX_SLAB_ID].get_chunk_context = SlabGetChunkContext,
130
+ [MCTX_SLAB_ID].get_chunk_space = SlabGetChunkSpace,
131
+ [MCTX_SLAB_ID].is_empty = SlabIsEmpty,
132
+ [MCTX_SLAB_ID].stats = SlabStats,
133
+ #ifdef MEMORY_CONTEXT_CHECKING
134
+ [MCTX_SLAB_ID].check = SlabCheck,
135
+ #endif
136
+
137
+ /* alignedalloc.c */
138
+ [MCTX_ALIGNED_REDIRECT_ID].alloc = NULL, /* not required */
139
+ [MCTX_ALIGNED_REDIRECT_ID].free_p = AlignedAllocFree,
140
+ [MCTX_ALIGNED_REDIRECT_ID].realloc = AlignedAllocRealloc,
141
+ [MCTX_ALIGNED_REDIRECT_ID].reset = NULL, /* not required */
142
+ [MCTX_ALIGNED_REDIRECT_ID].delete_context = NULL, /* not required */
143
+ [MCTX_ALIGNED_REDIRECT_ID].get_chunk_context = AlignedAllocGetChunkContext,
144
+ [MCTX_ALIGNED_REDIRECT_ID].get_chunk_space = AlignedAllocGetChunkSpace,
145
+ [MCTX_ALIGNED_REDIRECT_ID].is_empty = NULL, /* not required */
146
+ [MCTX_ALIGNED_REDIRECT_ID].stats = NULL, /* not required */
147
+ #ifdef MEMORY_CONTEXT_CHECKING
148
+ [MCTX_ALIGNED_REDIRECT_ID].check = NULL, /* not required */
149
+ #endif
150
+
151
+ /* bump.c */
152
+ [MCTX_BUMP_ID].alloc = BumpAlloc,
153
+ [MCTX_BUMP_ID].free_p = BumpFree,
154
+ [MCTX_BUMP_ID].realloc = BumpRealloc,
155
+ [MCTX_BUMP_ID].reset = BumpReset,
156
+ [MCTX_BUMP_ID].delete_context = BumpDelete,
157
+ [MCTX_BUMP_ID].get_chunk_context = BumpGetChunkContext,
158
+ [MCTX_BUMP_ID].get_chunk_space = BumpGetChunkSpace,
159
+ [MCTX_BUMP_ID].is_empty = BumpIsEmpty,
160
+ [MCTX_BUMP_ID].stats = BumpStats,
161
+ #ifdef MEMORY_CONTEXT_CHECKING
162
+ [MCTX_BUMP_ID].check = BumpCheck,
163
+ #endif
164
+
165
+
166
+ /*
167
+ * Reserved and unused IDs should have dummy entries here. This allows us
168
+ * to fail cleanly if a bogus pointer is passed to pfree or the like. It
169
+ * seems sufficient to provide routines for the methods that might get
170
+ * invoked from inspection of a chunk (see MCXT_METHOD calls below).
171
+ */
172
+ BOGUS_MCTX(MCTX_1_RESERVED_GLIBC_ID),
173
+ BOGUS_MCTX(MCTX_2_RESERVED_GLIBC_ID),
174
+ BOGUS_MCTX(MCTX_8_UNUSED_ID),
175
+ BOGUS_MCTX(MCTX_9_UNUSED_ID),
176
+ BOGUS_MCTX(MCTX_10_UNUSED_ID),
177
+ BOGUS_MCTX(MCTX_11_UNUSED_ID),
178
+ BOGUS_MCTX(MCTX_12_UNUSED_ID),
179
+ BOGUS_MCTX(MCTX_13_UNUSED_ID),
180
+ BOGUS_MCTX(MCTX_14_UNUSED_ID),
181
+ BOGUS_MCTX(MCTX_0_RESERVED_UNUSEDMEM_ID),
182
+ BOGUS_MCTX(MCTX_15_RESERVED_WIPEDMEM_ID)
183
+ };
184
+
185
+ #undef BOGUS_MCTX
71
186
 
72
187
  /*
73
188
  * CurrentMemoryContext
@@ -93,9 +208,10 @@ __thread MemoryContext ErrorContext = NULL;
93
208
  /* This is a transient link to the active portal's memory context: */
94
209
 
95
210
 
211
+ static void MemoryContextDeleteOnly(MemoryContext context);
96
212
  static void MemoryContextCallResetCallbacks(MemoryContext context);
97
213
  static void MemoryContextStatsInternal(MemoryContext context, int level,
98
- bool print, int max_children,
214
+ int max_level, int max_children,
99
215
  MemoryContextCounters *totals,
100
216
  bool print_to_stderr);
101
217
  static void MemoryContextStatsPrint(MemoryContext context, void *passthru,
@@ -110,6 +226,144 @@ static void MemoryContextStatsPrint(MemoryContext context, void *passthru,
110
226
  #define AssertNotInCriticalSection(context) \
111
227
  Assert(CritSectionCount == 0 || (context)->allowInCritSection)
112
228
 
229
+ /*
230
+ * Call the given function in the MemoryContextMethods for the memory context
231
+ * type that 'pointer' belongs to.
232
+ */
233
+ #define MCXT_METHOD(pointer, method) \
234
+ mcxt_methods[GetMemoryChunkMethodID(pointer)].method
235
+
236
+ /*
237
+ * GetMemoryChunkMethodID
238
+ * Return the MemoryContextMethodID from the uint64 chunk header which
239
+ * directly precedes 'pointer'.
240
+ */
241
+ static inline MemoryContextMethodID
242
+ GetMemoryChunkMethodID(const void *pointer)
243
+ {
244
+ uint64 header;
245
+
246
+ /*
247
+ * Try to detect bogus pointers handed to us, poorly though we can.
248
+ * Presumably, a pointer that isn't MAXALIGNED isn't pointing at an
249
+ * allocated chunk.
250
+ */
251
+ Assert(pointer == (const void *) MAXALIGN(pointer));
252
+
253
+ /* Allow access to the uint64 header */
254
+ VALGRIND_MAKE_MEM_DEFINED((char *) pointer - sizeof(uint64), sizeof(uint64));
255
+
256
+ header = *((const uint64 *) ((const char *) pointer - sizeof(uint64)));
257
+
258
+ /* Disallow access to the uint64 header */
259
+ VALGRIND_MAKE_MEM_NOACCESS((char *) pointer - sizeof(uint64), sizeof(uint64));
260
+
261
+ return (MemoryContextMethodID) (header & MEMORY_CONTEXT_METHODID_MASK);
262
+ }
263
+
264
+ /*
265
+ * GetMemoryChunkHeader
266
+ * Return the uint64 chunk header which directly precedes 'pointer'.
267
+ *
268
+ * This is only used after GetMemoryChunkMethodID, so no need for error checks.
269
+ */
270
+ static inline uint64
271
+ GetMemoryChunkHeader(const void *pointer)
272
+ {
273
+ uint64 header;
274
+
275
+ /* Allow access to the uint64 header */
276
+ VALGRIND_MAKE_MEM_DEFINED((char *) pointer - sizeof(uint64), sizeof(uint64));
277
+
278
+ header = *((const uint64 *) ((const char *) pointer - sizeof(uint64)));
279
+
280
+ /* Disallow access to the uint64 header */
281
+ VALGRIND_MAKE_MEM_NOACCESS((char *) pointer - sizeof(uint64), sizeof(uint64));
282
+
283
+ return header;
284
+ }
285
+
286
+ /*
287
+ * MemoryContextTraverseNext
288
+ * Helper function to traverse all descendants of a memory context
289
+ * without recursion.
290
+ *
291
+ * Recursion could lead to out-of-stack errors with deep context hierarchies,
292
+ * which would be unpleasant in error cleanup code paths.
293
+ *
294
+ * To process 'context' and all its descendants, use a loop like this:
295
+ *
296
+ * <process 'context'>
297
+ * for (MemoryContext curr = context->firstchild;
298
+ * curr != NULL;
299
+ * curr = MemoryContextTraverseNext(curr, context))
300
+ * {
301
+ * <process 'curr'>
302
+ * }
303
+ *
304
+ * This visits all the contexts in pre-order, that is a node is visited
305
+ * before its children.
306
+ */
307
+ static MemoryContext
308
+ MemoryContextTraverseNext(MemoryContext curr, MemoryContext top)
309
+ {
310
+ /* After processing a node, traverse to its first child if any */
311
+ if (curr->firstchild != NULL)
312
+ return curr->firstchild;
313
+
314
+ /*
315
+ * After processing a childless node, traverse to its next sibling if
316
+ * there is one. If there isn't, traverse back up to the parent (which
317
+ * has already been visited, and now so have all its descendants). We're
318
+ * done if that is "top", otherwise traverse to its next sibling if any,
319
+ * otherwise repeat moving up.
320
+ */
321
+ while (curr->nextchild == NULL)
322
+ {
323
+ curr = curr->parent;
324
+ if (curr == top)
325
+ return NULL;
326
+ }
327
+ return curr->nextchild;
328
+ }
329
+
330
+ /*
331
+ * Support routines to trap use of invalid memory context method IDs
332
+ * (from calling pfree or the like on a bogus pointer). As a possible
333
+ * aid in debugging, we report the header word along with the pointer
334
+ * address (if we got here, there must be an accessible header word).
335
+ */
336
+ static void
337
+ BogusFree(void *pointer)
338
+ {
339
+ elog(ERROR, "pfree called with invalid pointer %p (header 0x%016llx)",
340
+ pointer, (unsigned long long) GetMemoryChunkHeader(pointer));
341
+ }
342
+
343
+ static void *
344
+ BogusRealloc(void *pointer, Size size, int flags)
345
+ {
346
+ elog(ERROR, "repalloc called with invalid pointer %p (header 0x%016llx)",
347
+ pointer, (unsigned long long) GetMemoryChunkHeader(pointer));
348
+ return NULL; /* keep compiler quiet */
349
+ }
350
+
351
+ static MemoryContext
352
+ BogusGetChunkContext(void *pointer)
353
+ {
354
+ elog(ERROR, "GetMemoryChunkContext called with invalid pointer %p (header 0x%016llx)",
355
+ pointer, (unsigned long long) GetMemoryChunkHeader(pointer));
356
+ return NULL; /* keep compiler quiet */
357
+ }
358
+
359
+ static Size
360
+ BogusGetChunkSpace(void *pointer)
361
+ {
362
+ elog(ERROR, "GetMemoryChunkSpace called with invalid pointer %p (header 0x%016llx)",
363
+ pointer, (unsigned long long) GetMemoryChunkHeader(pointer));
364
+ return 0; /* keep compiler quiet */
365
+ }
366
+
113
367
 
114
368
  /*****************************************************************************
115
369
  * EXPORTED ROUTINES *
@@ -135,7 +389,7 @@ static void MemoryContextStatsPrint(MemoryContext context, void *passthru,
135
389
  void
136
390
  MemoryContextInit(void)
137
391
  {
138
- AssertState(TopMemoryContext == NULL);
392
+ Assert(TopMemoryContext == NULL);
139
393
 
140
394
  /*
141
395
  * First, initialize TopMemoryContext, which is the parent of all others.
@@ -179,7 +433,7 @@ MemoryContextInit(void)
179
433
  void
180
434
  MemoryContextReset(MemoryContext context)
181
435
  {
182
- AssertArg(MemoryContextIsValid(context));
436
+ Assert(MemoryContextIsValid(context));
183
437
 
184
438
  /* save a function call in common case where there are no children */
185
439
  if (context->firstchild != NULL)
@@ -198,7 +452,7 @@ MemoryContextReset(MemoryContext context)
198
452
  void
199
453
  MemoryContextResetOnly(MemoryContext context)
200
454
  {
201
- AssertArg(MemoryContextIsValid(context));
455
+ Assert(MemoryContextIsValid(context));
202
456
 
203
457
  /* Nothing to do if no pallocs since startup or last reset */
204
458
  if (!context->isReset)
@@ -209,10 +463,8 @@ MemoryContextResetOnly(MemoryContext context)
209
463
  * If context->ident points into the context's memory, it will become
210
464
  * a dangling pointer. We could prevent that by setting it to NULL
211
465
  * here, but that would break valid coding patterns that keep the
212
- * ident elsewhere, e.g. in a parent context. Another idea is to use
213
- * MemoryContextContains(), but we don't require ident strings to be
214
- * in separately-palloc'd chunks, so that risks false positives. So
215
- * for now we assume the programmer got it right.
466
+ * ident elsewhere, e.g. in a parent context. So for now we assume
467
+ * the programmer got it right.
216
468
  */
217
469
 
218
470
  context->methods->reset(context);
@@ -236,21 +488,60 @@ MemoryContextResetOnly(MemoryContext context)
236
488
  * allocated therein.
237
489
  *
238
490
  * The type-specific delete routine removes all storage for the context,
239
- * but we have to recurse to handle the children.
240
- * We must also delink the context from its parent, if it has one.
491
+ * but we have to deal with descendant nodes here.
241
492
  */
242
493
  void
243
494
  MemoryContextDelete(MemoryContext context)
244
495
  {
245
- AssertArg(MemoryContextIsValid(context));
496
+ MemoryContext curr;
497
+
498
+ Assert(MemoryContextIsValid(context));
499
+
500
+ /*
501
+ * Delete subcontexts from the bottom up.
502
+ *
503
+ * Note: Do not use recursion here. A "stack depth limit exceeded" error
504
+ * would be unpleasant if we're already in the process of cleaning up from
505
+ * transaction abort. We also cannot use MemoryContextTraverseNext() here
506
+ * because we modify the tree as we go.
507
+ */
508
+ curr = context;
509
+ for (;;)
510
+ {
511
+ MemoryContext parent;
512
+
513
+ /* Descend down until we find a leaf context with no children */
514
+ while (curr->firstchild != NULL)
515
+ curr = curr->firstchild;
516
+
517
+ /*
518
+ * We're now at a leaf with no children. Free it and continue from the
519
+ * parent. Or if this was the original node, we're all done.
520
+ */
521
+ parent = curr->parent;
522
+ MemoryContextDeleteOnly(curr);
523
+
524
+ if (curr == context)
525
+ break;
526
+ curr = parent;
527
+ }
528
+ }
529
+
530
+ /*
531
+ * Subroutine of MemoryContextDelete,
532
+ * to delete a context that has no children.
533
+ * We must also delink the context from its parent, if it has one.
534
+ */
535
+ static void
536
+ MemoryContextDeleteOnly(MemoryContext context)
537
+ {
538
+ Assert(MemoryContextIsValid(context));
246
539
  /* We had better not be deleting TopMemoryContext ... */
247
540
  Assert(context != TopMemoryContext);
248
541
  /* And not CurrentMemoryContext, either */
249
542
  Assert(context != CurrentMemoryContext);
250
-
251
- /* save a function call in common case where there are no children */
252
- if (context->firstchild != NULL)
253
- MemoryContextDeleteChildren(context);
543
+ /* All the children should've been deleted already */
544
+ Assert(context->firstchild == NULL);
254
545
 
255
546
  /*
256
547
  * It's not entirely clear whether 'tis better to do this before or after
@@ -287,7 +578,7 @@ MemoryContextDelete(MemoryContext context)
287
578
  void
288
579
  MemoryContextDeleteChildren(MemoryContext context)
289
580
  {
290
- AssertArg(MemoryContextIsValid(context));
581
+ Assert(MemoryContextIsValid(context));
291
582
 
292
583
  /*
293
584
  * MemoryContextDelete will delink the child from me, so just iterate as
@@ -369,8 +660,8 @@ MemoryContextCallResetCallbacks(MemoryContext context)
369
660
  void
370
661
  MemoryContextSetParent(MemoryContext context, MemoryContext new_parent)
371
662
  {
372
- AssertArg(MemoryContextIsValid(context));
373
- AssertArg(context != new_parent);
663
+ Assert(MemoryContextIsValid(context));
664
+ Assert(context != new_parent);
374
665
 
375
666
  /* Fast path if it's got correct parent already */
376
667
  if (new_parent == context->parent)
@@ -396,7 +687,7 @@ MemoryContextSetParent(MemoryContext context, MemoryContext new_parent)
396
687
  /* And relink */
397
688
  if (new_parent)
398
689
  {
399
- AssertArg(MemoryContextIsValid(new_parent));
690
+ Assert(MemoryContextIsValid(new_parent));
400
691
  context->parent = new_parent;
401
692
  context->prevchild = NULL;
402
693
  context->nextchild = new_parent->firstchild;
@@ -426,11 +717,22 @@ MemoryContextSetParent(MemoryContext context, MemoryContext new_parent)
426
717
  void
427
718
  MemoryContextAllowInCriticalSection(MemoryContext context, bool allow)
428
719
  {
429
- AssertArg(MemoryContextIsValid(context));
720
+ Assert(MemoryContextIsValid(context));
430
721
 
431
722
  context->allowInCritSection = allow;
432
723
  }
433
724
 
725
+ /*
726
+ * GetMemoryChunkContext
727
+ * Given a currently-allocated chunk, determine the MemoryContext that
728
+ * the chunk belongs to.
729
+ */
730
+ MemoryContext
731
+ GetMemoryChunkContext(void *pointer)
732
+ {
733
+ return MCXT_METHOD(pointer, get_chunk_context) (pointer);
734
+ }
735
+
434
736
  /*
435
737
  * GetMemoryChunkSpace
436
738
  * Given a currently-allocated chunk, determine the total space
@@ -439,7 +741,11 @@ MemoryContextAllowInCriticalSection(MemoryContext context, bool allow)
439
741
  * This is useful for measuring the total space occupied by a set of
440
742
  * allocated chunks.
441
743
  */
442
-
744
+ Size
745
+ GetMemoryChunkSpace(void *pointer)
746
+ {
747
+ return MCXT_METHOD(pointer, get_chunk_space) (pointer);
748
+ }
443
749
 
444
750
  /*
445
751
  * MemoryContextGetParent
@@ -459,6 +765,12 @@ MemoryContextAllowInCriticalSection(MemoryContext context, bool allow)
459
765
  */
460
766
 
461
767
 
768
+ /*
769
+ * Return the memory consumption statistics about the given context and its
770
+ * children.
771
+ */
772
+
773
+
462
774
  /*
463
775
  * MemoryContextStats
464
776
  * Print statistics about the named context and all its descendants.
@@ -470,8 +782,8 @@ MemoryContextAllowInCriticalSection(MemoryContext context, bool allow)
470
782
  void
471
783
  MemoryContextStats(MemoryContext context)
472
784
  {
473
- /* A hard-wired limit on the number of children is usually good enough */
474
- MemoryContextStatsDetail(context, 100, true);
785
+ /* Hard-wired limits are usually good enough */
786
+ MemoryContextStatsDetail(context, 100, 100, true);
475
787
  }
476
788
 
477
789
  /*
@@ -483,14 +795,16 @@ MemoryContextStats(MemoryContext context)
483
795
  * with fprintf(stderr), otherwise use ereport().
484
796
  */
485
797
  void
486
- MemoryContextStatsDetail(MemoryContext context, int max_children,
798
+ MemoryContextStatsDetail(MemoryContext context,
799
+ int max_level, int max_children,
487
800
  bool print_to_stderr)
488
801
  {
489
802
  MemoryContextCounters grand_totals;
490
803
 
491
804
  memset(&grand_totals, 0, sizeof(grand_totals));
492
805
 
493
- MemoryContextStatsInternal(context, 0, true, max_children, &grand_totals, print_to_stderr);
806
+ MemoryContextStatsInternal(context, 0, max_level, max_children,
807
+ &grand_totals, print_to_stderr);
494
808
 
495
809
  if (print_to_stderr)
496
810
  fprintf(stderr,
@@ -499,16 +813,16 @@ MemoryContextStatsDetail(MemoryContext context, int max_children,
499
813
  grand_totals.freespace, grand_totals.freechunks,
500
814
  grand_totals.totalspace - grand_totals.freespace);
501
815
  else
502
-
816
+ {
503
817
  /*
504
818
  * Use LOG_SERVER_ONLY to prevent the memory contexts from being sent
505
819
  * to the connected client.
506
820
  *
507
821
  * We don't buffer the information about all memory contexts in a
508
- * backend into StringInfo and log it as one message. Otherwise which
509
- * may require the buffer to be enlarged very much and lead to OOM
510
- * error since there can be a large number of memory contexts in a
511
- * backend. Instead, we log one message per memory context.
822
+ * backend into StringInfo and log it as one message. That would
823
+ * require the buffer to be enlarged, risking an OOM as there could be
824
+ * a large number of memory contexts in a backend. Instead, we log
825
+ * one message per memory context.
512
826
  */
513
827
  ereport(LOG_SERVER_ONLY,
514
828
  (errhidestmt(true),
@@ -517,89 +831,96 @@ MemoryContextStatsDetail(MemoryContext context, int max_children,
517
831
  grand_totals.totalspace, grand_totals.nblocks,
518
832
  grand_totals.freespace, grand_totals.freechunks,
519
833
  grand_totals.totalspace - grand_totals.freespace)));
834
+ }
520
835
  }
521
836
 
522
837
  /*
523
838
  * MemoryContextStatsInternal
524
839
  * One recursion level for MemoryContextStats
525
840
  *
526
- * Print this context if print is true, but in any case accumulate counts into
527
- * *totals (if given).
841
+ * Print stats for this context if possible, but in any case accumulate counts
842
+ * into *totals (if not NULL).
528
843
  */
529
844
  static void
530
845
  MemoryContextStatsInternal(MemoryContext context, int level,
531
- bool print, int max_children,
846
+ int max_level, int max_children,
532
847
  MemoryContextCounters *totals,
533
848
  bool print_to_stderr)
534
849
  {
535
- MemoryContextCounters local_totals;
536
850
  MemoryContext child;
537
851
  int ichild;
538
852
 
539
- AssertArg(MemoryContextIsValid(context));
853
+ Assert(MemoryContextIsValid(context));
540
854
 
541
855
  /* Examine the context itself */
542
856
  context->methods->stats(context,
543
- print ? MemoryContextStatsPrint : NULL,
857
+ MemoryContextStatsPrint,
544
858
  (void *) &level,
545
859
  totals, print_to_stderr);
546
860
 
547
861
  /*
548
- * Examine children. If there are more than max_children of them, we do
549
- * not print the rest explicitly, but just summarize them.
862
+ * Examine children.
863
+ *
864
+ * If we are past the recursion depth limit or already running low on
865
+ * stack, do not print them explicitly but just summarize them. Similarly,
866
+ * if there are more than max_children of them, we do not print the rest
867
+ * explicitly, but just summarize them.
550
868
  */
551
- memset(&local_totals, 0, sizeof(local_totals));
552
-
553
- for (child = context->firstchild, ichild = 0;
554
- child != NULL;
555
- child = child->nextchild, ichild++)
869
+ child = context->firstchild;
870
+ ichild = 0;
871
+ if (level < max_level && !stack_is_too_deep())
556
872
  {
557
- if (ichild < max_children)
873
+ for (; child != NULL && ichild < max_children;
874
+ child = child->nextchild, ichild++)
875
+ {
558
876
  MemoryContextStatsInternal(child, level + 1,
559
- print, max_children,
877
+ max_level, max_children,
560
878
  totals,
561
879
  print_to_stderr);
562
- else
563
- MemoryContextStatsInternal(child, level + 1,
564
- false, max_children,
565
- &local_totals,
566
- print_to_stderr);
880
+ }
567
881
  }
568
882
 
569
- /* Deal with excess children */
570
- if (ichild > max_children)
883
+ if (child != NULL)
571
884
  {
572
- if (print)
885
+ /* Summarize the rest of the children, avoiding recursion. */
886
+ MemoryContextCounters local_totals;
887
+
888
+ memset(&local_totals, 0, sizeof(local_totals));
889
+
890
+ ichild = 0;
891
+ while (child != NULL)
573
892
  {
574
- if (print_to_stderr)
575
- {
576
- int i;
577
-
578
- for (i = 0; i <= level; i++)
579
- fprintf(stderr, " ");
580
- fprintf(stderr,
581
- "%d more child contexts containing %zu total in %zu blocks; %zu free (%zu chunks); %zu used\n",
582
- ichild - max_children,
583
- local_totals.totalspace,
584
- local_totals.nblocks,
585
- local_totals.freespace,
586
- local_totals.freechunks,
587
- local_totals.totalspace - local_totals.freespace);
588
- }
589
- else
590
- ereport(LOG_SERVER_ONLY,
591
- (errhidestmt(true),
592
- errhidecontext(true),
593
- errmsg_internal("level: %d; %d more child contexts containing %zu total in %zu blocks; %zu free (%zu chunks); %zu used",
594
- level,
595
- ichild - max_children,
596
- local_totals.totalspace,
597
- local_totals.nblocks,
598
- local_totals.freespace,
599
- local_totals.freechunks,
600
- local_totals.totalspace - local_totals.freespace)));
893
+ child->methods->stats(child, NULL, NULL, &local_totals, false);
894
+ ichild++;
895
+ child = MemoryContextTraverseNext(child, context);
601
896
  }
602
897
 
898
+ if (print_to_stderr)
899
+ {
900
+ for (int i = 0; i <= level; i++)
901
+ fprintf(stderr, " ");
902
+ fprintf(stderr,
903
+ "%d more child contexts containing %zu total in %zu blocks; %zu free (%zu chunks); %zu used\n",
904
+ ichild,
905
+ local_totals.totalspace,
906
+ local_totals.nblocks,
907
+ local_totals.freespace,
908
+ local_totals.freechunks,
909
+ local_totals.totalspace - local_totals.freespace);
910
+ }
911
+ else
912
+ ereport(LOG_SERVER_ONLY,
913
+ (errhidestmt(true),
914
+ errhidecontext(true),
915
+ errmsg_internal("level: %d; %d more child contexts containing %zu total in %zu blocks; %zu free (%zu chunks); %zu used",
916
+ level,
917
+ ichild,
918
+ local_totals.totalspace,
919
+ local_totals.nblocks,
920
+ local_totals.freespace,
921
+ local_totals.freechunks,
922
+ local_totals.totalspace - local_totals.freespace)));
923
+
603
924
  if (totals)
604
925
  {
605
926
  totals->nblocks += local_totals.nblocks;
@@ -691,7 +1012,7 @@ MemoryContextStatsPrint(MemoryContext context, void *passthru,
691
1012
 
692
1013
  /*
693
1014
  * MemoryContextCheck
694
- * Check all chunks in the named context.
1015
+ * Check all chunks in the named context and its children.
695
1016
  *
696
1017
  * This is just a debugging utility, so it's not fancy.
697
1018
  */
@@ -699,19 +1020,6 @@ MemoryContextStatsPrint(MemoryContext context, void *passthru,
699
1020
 
700
1021
  #endif
701
1022
 
702
- /*
703
- * MemoryContextContains
704
- * Detect whether an allocated chunk of memory belongs to a given
705
- * context or not.
706
- *
707
- * Caution: this test is reliable as long as 'pointer' does point to
708
- * a chunk of memory allocated from *some* context. If 'pointer' points
709
- * at memory obtained in some other way, there is a small chance of a
710
- * false-positive result, since the bits right before it might look like
711
- * a valid chunk header by chance.
712
- */
713
-
714
-
715
1023
  /*
716
1024
  * MemoryContextCreate
717
1025
  * Context-type-independent part of context creation.
@@ -737,7 +1045,7 @@ MemoryContextStatsPrint(MemoryContext context, void *passthru,
737
1045
  *
738
1046
  * node: the as-yet-uninitialized common part of the context header node.
739
1047
  * tag: NodeTag code identifying the memory context type.
740
- * methods: context-type-specific methods (usually statically allocated).
1048
+ * method_id: MemoryContextMethodID of the context-type being created.
741
1049
  * parent: parent context, or NULL if this will be a top-level context.
742
1050
  * name: name of context (must be statically allocated).
743
1051
  *
@@ -747,7 +1055,7 @@ MemoryContextStatsPrint(MemoryContext context, void *passthru,
747
1055
  void
748
1056
  MemoryContextCreate(MemoryContext node,
749
1057
  NodeTag tag,
750
- const MemoryContextMethods *methods,
1058
+ MemoryContextMethodID method_id,
751
1059
  MemoryContext parent,
752
1060
  const char *name)
753
1061
  {
@@ -757,7 +1065,7 @@ MemoryContextCreate(MemoryContext node,
757
1065
  /* Initialize all standard fields of memory context header */
758
1066
  node->type = tag;
759
1067
  node->isReset = true;
760
- node->methods = methods;
1068
+ node->methods = &mcxt_methods[method_id];
761
1069
  node->parent = parent;
762
1070
  node->firstchild = NULL;
763
1071
  node->mem_allocated = 0;
@@ -786,120 +1094,93 @@ MemoryContextCreate(MemoryContext node,
786
1094
  }
787
1095
 
788
1096
  /*
789
- * MemoryContextAlloc
790
- * Allocate space within the specified context.
791
- *
792
- * This could be turned into a macro, but we'd have to import
793
- * nodes/memnodes.h into postgres.h which seems a bad idea.
1097
+ * MemoryContextAllocationFailure
1098
+ * For use by MemoryContextMethods implementations to handle when malloc
1099
+ * returns NULL. The behavior is specific to whether MCXT_ALLOC_NO_OOM
1100
+ * is in 'flags'.
794
1101
  */
795
1102
  void *
796
- MemoryContextAlloc(MemoryContext context, Size size)
1103
+ MemoryContextAllocationFailure(MemoryContext context, Size size, int flags)
797
1104
  {
798
- void *ret;
799
-
800
- AssertArg(MemoryContextIsValid(context));
801
- AssertNotInCriticalSection(context);
802
-
803
- if (!AllocSizeIsValid(size))
804
- elog(ERROR, "invalid memory alloc request size %zu", size);
805
-
806
- context->isReset = false;
807
-
808
- ret = context->methods->alloc(context, size);
809
- if (unlikely(ret == NULL))
1105
+ if ((flags & MCXT_ALLOC_NO_OOM) == 0)
810
1106
  {
811
1107
  MemoryContextStats(TopMemoryContext);
812
-
813
- /*
814
- * Here, and elsewhere in this module, we show the target context's
815
- * "name" but not its "ident" (if any) in user-visible error messages.
816
- * The "ident" string might contain security-sensitive data, such as
817
- * values in SQL commands.
818
- */
819
1108
  ereport(ERROR,
820
1109
  (errcode(ERRCODE_OUT_OF_MEMORY),
821
1110
  errmsg("out of memory"),
822
1111
  errdetail("Failed on request of size %zu in memory context \"%s\".",
823
1112
  size, context->name)));
824
1113
  }
1114
+ return NULL;
1115
+ }
825
1116
 
826
- VALGRIND_MEMPOOL_ALLOC(context, ret, size);
827
-
828
- return ret;
1117
+ /*
1118
+ * MemoryContextSizeFailure
1119
+ * For use by MemoryContextMethods implementations to handle invalid
1120
+ * memory allocation request sizes.
1121
+ */
1122
+ void
1123
+ MemoryContextSizeFailure(MemoryContext context, Size size, int flags)
1124
+ {
1125
+ elog(ERROR, "invalid memory alloc request size %zu", size);
829
1126
  }
830
1127
 
831
1128
  /*
832
- * MemoryContextAllocZero
833
- * Like MemoryContextAlloc, but clears allocated memory
1129
+ * MemoryContextAlloc
1130
+ * Allocate space within the specified context.
834
1131
  *
835
- * We could just call MemoryContextAlloc then clear the memory, but this
836
- * is a very common combination, so we provide the combined operation.
1132
+ * This could be turned into a macro, but we'd have to import
1133
+ * nodes/memnodes.h into postgres.h which seems a bad idea.
837
1134
  */
838
1135
  void *
839
- MemoryContextAllocZero(MemoryContext context, Size size)
1136
+ MemoryContextAlloc(MemoryContext context, Size size)
840
1137
  {
841
1138
  void *ret;
842
1139
 
843
- AssertArg(MemoryContextIsValid(context));
1140
+ Assert(MemoryContextIsValid(context));
844
1141
  AssertNotInCriticalSection(context);
845
1142
 
846
- if (!AllocSizeIsValid(size))
847
- elog(ERROR, "invalid memory alloc request size %zu", size);
848
-
849
1143
  context->isReset = false;
850
1144
 
851
- ret = context->methods->alloc(context, size);
852
- if (unlikely(ret == NULL))
853
- {
854
- MemoryContextStats(TopMemoryContext);
855
- ereport(ERROR,
856
- (errcode(ERRCODE_OUT_OF_MEMORY),
857
- errmsg("out of memory"),
858
- errdetail("Failed on request of size %zu in memory context \"%s\".",
859
- size, context->name)));
860
- }
1145
+ /*
1146
+ * For efficiency reasons, we purposefully offload the handling of
1147
+ * allocation failures to the MemoryContextMethods implementation as this
1148
+ * allows these checks to be performed only when an actual malloc needs to
1149
+ * be done to request more memory from the OS. Additionally, not having
1150
+ * to execute any instructions after this call allows the compiler to use
1151
+ * the sibling call optimization. If you're considering adding code after
1152
+ * this call, consider making it the responsibility of the 'alloc'
1153
+ * function instead.
1154
+ */
1155
+ ret = context->methods->alloc(context, size, 0);
861
1156
 
862
1157
  VALGRIND_MEMPOOL_ALLOC(context, ret, size);
863
1158
 
864
- MemSetAligned(ret, 0, size);
865
-
866
1159
  return ret;
867
1160
  }
868
1161
 
869
1162
  /*
870
- * MemoryContextAllocZeroAligned
871
- * MemoryContextAllocZero where length is suitable for MemSetLoop
1163
+ * MemoryContextAllocZero
1164
+ * Like MemoryContextAlloc, but clears allocated memory
872
1165
  *
873
- * This might seem overly specialized, but it's not because newNode()
874
- * is so often called with compile-time-constant sizes.
1166
+ * We could just call MemoryContextAlloc then clear the memory, but this
1167
+ * is a very common combination, so we provide the combined operation.
875
1168
  */
876
1169
  void *
877
- MemoryContextAllocZeroAligned(MemoryContext context, Size size)
1170
+ MemoryContextAllocZero(MemoryContext context, Size size)
878
1171
  {
879
1172
  void *ret;
880
1173
 
881
- AssertArg(MemoryContextIsValid(context));
1174
+ Assert(MemoryContextIsValid(context));
882
1175
  AssertNotInCriticalSection(context);
883
1176
 
884
- if (!AllocSizeIsValid(size))
885
- elog(ERROR, "invalid memory alloc request size %zu", size);
886
-
887
1177
  context->isReset = false;
888
1178
 
889
- ret = context->methods->alloc(context, size);
890
- if (unlikely(ret == NULL))
891
- {
892
- MemoryContextStats(TopMemoryContext);
893
- ereport(ERROR,
894
- (errcode(ERRCODE_OUT_OF_MEMORY),
895
- errmsg("out of memory"),
896
- errdetail("Failed on request of size %zu in memory context \"%s\".",
897
- size, context->name)));
898
- }
1179
+ ret = context->methods->alloc(context, size, 0);
899
1180
 
900
1181
  VALGRIND_MEMPOOL_ALLOC(context, ret, size);
901
1182
 
902
- MemSetLoop(ret, 0, size);
1183
+ MemSetAligned(ret, 0, size);
903
1184
 
904
1185
  return ret;
905
1186
  }
@@ -913,29 +1194,18 @@ MemoryContextAllocExtended(MemoryContext context, Size size, int flags)
913
1194
  {
914
1195
  void *ret;
915
1196
 
916
- AssertArg(MemoryContextIsValid(context));
1197
+ Assert(MemoryContextIsValid(context));
917
1198
  AssertNotInCriticalSection(context);
918
1199
 
919
- if (((flags & MCXT_ALLOC_HUGE) != 0 && !AllocHugeSizeIsValid(size)) ||
920
- ((flags & MCXT_ALLOC_HUGE) == 0 && !AllocSizeIsValid(size)))
1200
+ if (!((flags & MCXT_ALLOC_HUGE) != 0 ? AllocHugeSizeIsValid(size) :
1201
+ AllocSizeIsValid(size)))
921
1202
  elog(ERROR, "invalid memory alloc request size %zu", size);
922
1203
 
923
1204
  context->isReset = false;
924
1205
 
925
- ret = context->methods->alloc(context, size);
1206
+ ret = context->methods->alloc(context, size, flags);
926
1207
  if (unlikely(ret == NULL))
927
- {
928
- if ((flags & MCXT_ALLOC_NO_OOM) == 0)
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
1208
  return NULL;
938
- }
939
1209
 
940
1210
  VALGRIND_MEMPOOL_ALLOC(context, ret, size);
941
1211
 
@@ -973,25 +1243,24 @@ palloc(Size size)
973
1243
  void *ret;
974
1244
  MemoryContext context = CurrentMemoryContext;
975
1245
 
976
- AssertArg(MemoryContextIsValid(context));
1246
+ Assert(MemoryContextIsValid(context));
977
1247
  AssertNotInCriticalSection(context);
978
1248
 
979
- if (!AllocSizeIsValid(size))
980
- elog(ERROR, "invalid memory alloc request size %zu", size);
981
-
982
1249
  context->isReset = false;
983
1250
 
984
- ret = context->methods->alloc(context, size);
985
- if (unlikely(ret == NULL))
986
- {
987
- MemoryContextStats(TopMemoryContext);
988
- ereport(ERROR,
989
- (errcode(ERRCODE_OUT_OF_MEMORY),
990
- errmsg("out of memory"),
991
- errdetail("Failed on request of size %zu in memory context \"%s\".",
992
- size, context->name)));
993
- }
994
-
1251
+ /*
1252
+ * For efficiency reasons, we purposefully offload the handling of
1253
+ * allocation failures to the MemoryContextMethods implementation as this
1254
+ * allows these checks to be performed only when an actual malloc needs to
1255
+ * be done to request more memory from the OS. Additionally, not having
1256
+ * to execute any instructions after this call allows the compiler to use
1257
+ * the sibling call optimization. If you're considering adding code after
1258
+ * this call, consider making it the responsibility of the 'alloc'
1259
+ * function instead.
1260
+ */
1261
+ ret = context->methods->alloc(context, size, 0);
1262
+ /* We expect OOM to be handled by the alloc function */
1263
+ Assert(ret != NULL);
995
1264
  VALGRIND_MEMPOOL_ALLOC(context, ret, size);
996
1265
 
997
1266
  return ret;
@@ -1004,24 +1273,12 @@ palloc0(Size size)
1004
1273
  void *ret;
1005
1274
  MemoryContext context = CurrentMemoryContext;
1006
1275
 
1007
- AssertArg(MemoryContextIsValid(context));
1276
+ Assert(MemoryContextIsValid(context));
1008
1277
  AssertNotInCriticalSection(context);
1009
1278
 
1010
- if (!AllocSizeIsValid(size))
1011
- elog(ERROR, "invalid memory alloc request size %zu", size);
1012
-
1013
1279
  context->isReset = false;
1014
1280
 
1015
- ret = context->methods->alloc(context, size);
1016
- if (unlikely(ret == NULL))
1017
- {
1018
- MemoryContextStats(TopMemoryContext);
1019
- ereport(ERROR,
1020
- (errcode(ERRCODE_OUT_OF_MEMORY),
1021
- errmsg("out of memory"),
1022
- errdetail("Failed on request of size %zu in memory context \"%s\".",
1023
- size, context->name)));
1024
- }
1281
+ ret = context->methods->alloc(context, size, 0);
1025
1282
 
1026
1283
  VALGRIND_MEMPOOL_ALLOC(context, ret, size);
1027
1284
 
@@ -1032,6 +1289,125 @@ palloc0(Size size)
1032
1289
 
1033
1290
 
1034
1291
 
1292
+ /*
1293
+ * MemoryContextAllocAligned
1294
+ * Allocate 'size' bytes of memory in 'context' aligned to 'alignto'
1295
+ * bytes.
1296
+ *
1297
+ * Currently, we align addresses by requesting additional bytes from the
1298
+ * MemoryContext's standard allocator function and then aligning the returned
1299
+ * address by the required alignment. This means that the given MemoryContext
1300
+ * must support providing us with a chunk of memory that's larger than 'size'.
1301
+ * For allocators such as Slab, that's not going to work, as slab only allows
1302
+ * chunks of the size that's specified when the context is created.
1303
+ *
1304
+ * 'alignto' must be a power of 2.
1305
+ * 'flags' may be 0 or set the same as MemoryContextAllocExtended().
1306
+ */
1307
+ void *
1308
+ MemoryContextAllocAligned(MemoryContext context,
1309
+ Size size, Size alignto, int flags)
1310
+ {
1311
+ MemoryChunk *alignedchunk;
1312
+ Size alloc_size;
1313
+ void *unaligned;
1314
+ void *aligned;
1315
+
1316
+ /* wouldn't make much sense to waste that much space */
1317
+ Assert(alignto < (128 * 1024 * 1024));
1318
+
1319
+ /* ensure alignto is a power of 2 */
1320
+ Assert((alignto & (alignto - 1)) == 0);
1321
+
1322
+ /*
1323
+ * If the alignment requirements are less than what we already guarantee
1324
+ * then just use the standard allocation function.
1325
+ */
1326
+ if (unlikely(alignto <= MAXIMUM_ALIGNOF))
1327
+ return MemoryContextAllocExtended(context, size, flags);
1328
+
1329
+ /*
1330
+ * We implement aligned pointers by simply allocating enough memory for
1331
+ * the requested size plus the alignment and an additional "redirection"
1332
+ * MemoryChunk. This additional MemoryChunk is required for operations
1333
+ * such as pfree when used on the pointer returned by this function. We
1334
+ * use this redirection MemoryChunk in order to find the pointer to the
1335
+ * memory that was returned by the MemoryContextAllocExtended call below.
1336
+ * We do that by "borrowing" the block offset field and instead of using
1337
+ * that to find the offset into the owning block, we use it to find the
1338
+ * original allocated address.
1339
+ *
1340
+ * Here we must allocate enough extra memory so that we can still align
1341
+ * the pointer returned by MemoryContextAllocExtended and also have enough
1342
+ * space for the redirection MemoryChunk. Since allocations will already
1343
+ * be at least aligned by MAXIMUM_ALIGNOF, we can subtract that amount
1344
+ * from the allocation size to save a little memory.
1345
+ */
1346
+ alloc_size = size + PallocAlignedExtraBytes(alignto);
1347
+
1348
+ #ifdef MEMORY_CONTEXT_CHECKING
1349
+ /* ensure there's space for a sentinel byte */
1350
+ alloc_size += 1;
1351
+ #endif
1352
+
1353
+ /* perform the actual allocation */
1354
+ unaligned = MemoryContextAllocExtended(context, alloc_size, flags);
1355
+
1356
+ /* set the aligned pointer */
1357
+ aligned = (void *) TYPEALIGN(alignto, (char *) unaligned +
1358
+ sizeof(MemoryChunk));
1359
+
1360
+ alignedchunk = PointerGetMemoryChunk(aligned);
1361
+
1362
+ /*
1363
+ * We set the redirect MemoryChunk so that the block offset calculation is
1364
+ * used to point back to the 'unaligned' allocated chunk. This allows us
1365
+ * to use MemoryChunkGetBlock() to find the unaligned chunk when we need
1366
+ * to perform operations such as pfree() and repalloc().
1367
+ *
1368
+ * We store 'alignto' in the MemoryChunk's 'value' so that we know what
1369
+ * the alignment was set to should we ever be asked to realloc this
1370
+ * pointer.
1371
+ */
1372
+ MemoryChunkSetHdrMask(alignedchunk, unaligned, alignto,
1373
+ MCTX_ALIGNED_REDIRECT_ID);
1374
+
1375
+ /* double check we produced a correctly aligned pointer */
1376
+ Assert((void *) TYPEALIGN(alignto, aligned) == aligned);
1377
+
1378
+ #ifdef MEMORY_CONTEXT_CHECKING
1379
+ alignedchunk->requested_size = size;
1380
+ /* set mark to catch clobber of "unused" space */
1381
+ set_sentinel(aligned, size);
1382
+ #endif
1383
+
1384
+ /* Mark the bytes before the redirection header as noaccess */
1385
+ VALGRIND_MAKE_MEM_NOACCESS(unaligned,
1386
+ (char *) alignedchunk - (char *) unaligned);
1387
+
1388
+ /* Disallow access to the redirection chunk header. */
1389
+ VALGRIND_MAKE_MEM_NOACCESS(alignedchunk, sizeof(MemoryChunk));
1390
+
1391
+ return aligned;
1392
+ }
1393
+
1394
+ /*
1395
+ * palloc_aligned
1396
+ * Allocate 'size' bytes returning a pointer that's aligned to the
1397
+ * 'alignto' boundary.
1398
+ *
1399
+ * Currently, we align addresses by requesting additional bytes from the
1400
+ * MemoryContext's standard allocator function and then aligning the returned
1401
+ * address by the required alignment. This means that the given MemoryContext
1402
+ * must support providing us with a chunk of memory that's larger than 'size'.
1403
+ * For allocators such as Slab, that's not going to work, as slab only allows
1404
+ * chunks of the size that's specified when the context is created.
1405
+ *
1406
+ * 'alignto' must be a power of 2.
1407
+ * 'flags' may be 0 or set the same as MemoryContextAllocExtended().
1408
+ */
1409
+
1410
+
1035
1411
  /*
1036
1412
  * pfree
1037
1413
  * Release an allocated chunk.
@@ -1039,10 +1415,17 @@ palloc0(Size size)
1039
1415
  void
1040
1416
  pfree(void *pointer)
1041
1417
  {
1418
+ #ifdef USE_VALGRIND
1419
+ MemoryContextMethodID method = GetMemoryChunkMethodID(pointer);
1042
1420
  MemoryContext context = GetMemoryChunkContext(pointer);
1421
+ #endif
1422
+
1423
+ MCXT_METHOD(pointer, free_p) (pointer);
1043
1424
 
1044
- context->methods->free_p(context, pointer);
1045
- VALGRIND_MEMPOOL_FREE(context, pointer);
1425
+ #ifdef USE_VALGRIND
1426
+ if (method != MCTX_ALIGNED_REDIRECT_ID)
1427
+ VALGRIND_MEMPOOL_FREE(context, pointer);
1428
+ #endif
1046
1429
  }
1047
1430
 
1048
1431
  /*
@@ -1052,33 +1435,54 @@ pfree(void *pointer)
1052
1435
  void *
1053
1436
  repalloc(void *pointer, Size size)
1054
1437
  {
1438
+ #ifdef USE_VALGRIND
1439
+ MemoryContextMethodID method = GetMemoryChunkMethodID(pointer);
1440
+ #endif
1441
+ #if defined(USE_ASSERT_CHECKING) || defined(USE_VALGRIND)
1055
1442
  MemoryContext context = GetMemoryChunkContext(pointer);
1443
+ #endif
1056
1444
  void *ret;
1057
1445
 
1058
- if (!AllocSizeIsValid(size))
1059
- elog(ERROR, "invalid memory alloc request size %zu", size);
1060
-
1061
1446
  AssertNotInCriticalSection(context);
1062
1447
 
1063
1448
  /* isReset must be false already */
1064
1449
  Assert(!context->isReset);
1065
1450
 
1066
- ret = context->methods->realloc(context, pointer, size);
1067
- if (unlikely(ret == NULL))
1068
- {
1069
- MemoryContextStats(TopMemoryContext);
1070
- ereport(ERROR,
1071
- (errcode(ERRCODE_OUT_OF_MEMORY),
1072
- errmsg("out of memory"),
1073
- errdetail("Failed on request of size %zu in memory context \"%s\".",
1074
- size, context->name)));
1075
- }
1451
+ /*
1452
+ * For efficiency reasons, we purposefully offload the handling of
1453
+ * allocation failures to the MemoryContextMethods implementation as this
1454
+ * allows these checks to be performed only when an actual malloc needs to
1455
+ * be done to request more memory from the OS. Additionally, not having
1456
+ * to execute any instructions after this call allows the compiler to use
1457
+ * the sibling call optimization. If you're considering adding code after
1458
+ * this call, consider making it the responsibility of the 'realloc'
1459
+ * function instead.
1460
+ */
1461
+ ret = MCXT_METHOD(pointer, realloc) (pointer, size, 0);
1076
1462
 
1077
- VALGRIND_MEMPOOL_CHANGE(context, pointer, ret, size);
1463
+ #ifdef USE_VALGRIND
1464
+ if (method != MCTX_ALIGNED_REDIRECT_ID)
1465
+ VALGRIND_MEMPOOL_CHANGE(context, pointer, ret, size);
1466
+ #endif
1078
1467
 
1079
1468
  return ret;
1080
1469
  }
1081
1470
 
1471
+ /*
1472
+ * repalloc_extended
1473
+ * Adjust the size of a previously allocated chunk,
1474
+ * with HUGE and NO_OOM options.
1475
+ */
1476
+ #if defined(USE_ASSERT_CHECKING) || defined(USE_VALGRIND)
1477
+ #endif
1478
+
1479
+ /*
1480
+ * repalloc0
1481
+ * Adjust the size of a previously allocated chunk and zero out the added
1482
+ * space.
1483
+ */
1484
+
1485
+
1082
1486
  /*
1083
1487
  * MemoryContextAllocHuge
1084
1488
  * Allocate (possibly-expansive) space within the specified context.