pg_query 2.2.0 → 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 (895) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +86 -0
  3. data/README.md +57 -31
  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 +30 -4
  12. data/ext/pg_query/include/pg_query_enum_defs.c +839 -290
  13. data/ext/pg_query/include/pg_query_fingerprint_conds.c +638 -481
  14. data/ext/pg_query/include/pg_query_fingerprint_defs.c +6786 -4193
  15. data/ext/pg_query/include/pg_query_outfuncs_conds.c +450 -330
  16. data/ext/pg_query/include/pg_query_outfuncs_defs.c +1489 -1044
  17. data/ext/pg_query/include/pg_query_readfuncs_conds.c +157 -118
  18. data/ext/pg_query/include/pg_query_readfuncs_defs.c +1933 -1410
  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/rmgr.h +62 -0
  37. data/ext/pg_query/include/postgres/access/rmgrlist.h +49 -0
  38. data/ext/pg_query/include/postgres/access/sdir.h +67 -0
  39. data/ext/pg_query/include/postgres/access/skey.h +151 -0
  40. data/ext/pg_query/include/postgres/access/slru.h +218 -0
  41. data/ext/pg_query/include/postgres/access/stratnum.h +85 -0
  42. data/ext/pg_query/include/postgres/access/sysattr.h +29 -0
  43. data/ext/pg_query/include/postgres/access/table.h +28 -0
  44. data/ext/pg_query/include/postgres/access/tableam.h +2110 -0
  45. data/ext/pg_query/include/postgres/access/tidstore.h +50 -0
  46. data/ext/pg_query/include/postgres/access/toast_compression.h +73 -0
  47. data/ext/pg_query/include/postgres/access/transam.h +418 -0
  48. data/ext/pg_query/include/postgres/access/tsmapi.h +82 -0
  49. data/ext/pg_query/include/postgres/access/tupconvert.h +54 -0
  50. data/ext/pg_query/include/postgres/access/tupdesc.h +154 -0
  51. data/ext/pg_query/include/postgres/access/tupmacs.h +207 -0
  52. data/ext/pg_query/include/postgres/access/twophase.h +65 -0
  53. data/ext/pg_query/include/postgres/access/xact.h +530 -0
  54. data/ext/pg_query/include/postgres/access/xlog.h +310 -0
  55. data/ext/pg_query/include/postgres/access/xlog_internal.h +405 -0
  56. data/ext/pg_query/include/postgres/access/xlogbackup.h +43 -0
  57. data/ext/pg_query/include/postgres/access/xlogdefs.h +82 -0
  58. data/ext/pg_query/include/postgres/access/xlogprefetcher.h +55 -0
  59. data/ext/pg_query/include/postgres/access/xlogreader.h +444 -0
  60. data/ext/pg_query/include/postgres/access/xlogrecord.h +248 -0
  61. data/ext/pg_query/include/postgres/access/xlogrecovery.h +158 -0
  62. data/ext/pg_query/include/postgres/archive/archive_module.h +67 -0
  63. data/ext/pg_query/include/postgres/c.h +1374 -0
  64. data/ext/pg_query/include/postgres/catalog/catalog.h +47 -0
  65. data/ext/pg_query/include/postgres/catalog/catversion.h +62 -0
  66. data/ext/pg_query/include/postgres/catalog/dependency.h +228 -0
  67. data/ext/pg_query/include/postgres/catalog/genbki.h +149 -0
  68. data/ext/pg_query/include/postgres/catalog/index.h +218 -0
  69. data/ext/pg_query/include/postgres/catalog/indexing.h +54 -0
  70. data/ext/pg_query/include/postgres/catalog/namespace.h +189 -0
  71. data/ext/pg_query/include/postgres/catalog/objectaccess.h +267 -0
  72. data/ext/pg_query/include/postgres/catalog/objectaddress.h +93 -0
  73. data/ext/pg_query/include/postgres/catalog/pg_aggregate.h +182 -0
  74. data/ext/pg_query/include/postgres/catalog/pg_aggregate_d.h +78 -0
  75. data/ext/pg_query/include/postgres/catalog/pg_am.h +66 -0
  76. data/ext/pg_query/include/postgres/catalog/pg_am_d.h +47 -0
  77. data/ext/pg_query/include/postgres/catalog/pg_attribute.h +240 -0
  78. data/ext/pg_query/include/postgres/catalog/pg_attribute_d.h +62 -0
  79. data/ext/pg_query/include/postgres/catalog/pg_authid.h +66 -0
  80. data/ext/pg_query/include/postgres/catalog/pg_authid_d.h +60 -0
  81. data/ext/pg_query/include/postgres/catalog/pg_class.h +235 -0
  82. data/ext/pg_query/include/postgres/catalog/pg_class_d.h +134 -0
  83. data/ext/pg_query/include/postgres/catalog/pg_collation.h +106 -0
  84. data/ext/pg_query/include/postgres/catalog/pg_collation_d.h +66 -0
  85. data/ext/pg_query/include/postgres/catalog/pg_constraint.h +278 -0
  86. data/ext/pg_query/include/postgres/catalog/pg_constraint_d.h +74 -0
  87. data/ext/pg_query/include/postgres/catalog/pg_control.h +260 -0
  88. data/ext/pg_query/include/postgres/catalog/pg_conversion.h +79 -0
  89. data/ext/pg_query/include/postgres/catalog/pg_conversion_d.h +38 -0
  90. data/ext/pg_query/include/postgres/catalog/pg_database.h +129 -0
  91. data/ext/pg_query/include/postgres/catalog/pg_database_d.h +53 -0
  92. data/ext/pg_query/include/postgres/catalog/pg_depend.h +77 -0
  93. data/ext/pg_query/include/postgres/catalog/pg_depend_d.h +36 -0
  94. data/ext/pg_query/include/postgres/catalog/pg_event_trigger.h +60 -0
  95. data/ext/pg_query/include/postgres/catalog/pg_event_trigger_d.h +36 -0
  96. data/ext/pg_query/include/postgres/catalog/pg_index.h +92 -0
  97. data/ext/pg_query/include/postgres/catalog/pg_index_d.h +59 -0
  98. data/ext/pg_query/include/postgres/catalog/pg_language.h +75 -0
  99. data/ext/pg_query/include/postgres/catalog/pg_language_d.h +41 -0
  100. data/ext/pg_query/include/postgres/catalog/pg_namespace.h +67 -0
  101. data/ext/pg_query/include/postgres/catalog/pg_namespace_d.h +36 -0
  102. data/ext/pg_query/include/postgres/catalog/pg_opclass.h +91 -0
  103. data/ext/pg_query/include/postgres/catalog/pg_opclass_d.h +51 -0
  104. data/ext/pg_query/include/postgres/catalog/pg_operator.h +124 -0
  105. data/ext/pg_query/include/postgres/catalog/pg_operator_d.h +142 -0
  106. data/ext/pg_query/include/postgres/catalog/pg_opfamily.h +67 -0
  107. data/ext/pg_query/include/postgres/catalog/pg_opfamily_d.h +51 -0
  108. data/ext/pg_query/include/postgres/catalog/pg_partitioned_table.h +76 -0
  109. data/ext/pg_query/include/postgres/catalog/pg_partitioned_table_d.h +36 -0
  110. data/ext/pg_query/include/postgres/catalog/pg_proc.h +223 -0
  111. data/ext/pg_query/include/postgres/catalog/pg_proc_d.h +101 -0
  112. data/ext/pg_query/include/postgres/catalog/pg_publication.h +161 -0
  113. data/ext/pg_query/include/postgres/catalog/pg_publication_d.h +38 -0
  114. data/ext/pg_query/include/postgres/catalog/pg_replication_origin.h +65 -0
  115. data/ext/pg_query/include/postgres/catalog/pg_replication_origin_d.h +33 -0
  116. data/ext/pg_query/include/postgres/catalog/pg_statistic.h +288 -0
  117. data/ext/pg_query/include/postgres/catalog/pg_statistic_d.h +199 -0
  118. data/ext/pg_query/include/postgres/catalog/pg_statistic_ext.h +91 -0
  119. data/ext/pg_query/include/postgres/catalog/pg_statistic_ext_d.h +45 -0
  120. data/ext/pg_query/include/postgres/catalog/pg_transform.h +51 -0
  121. data/ext/pg_query/include/postgres/catalog/pg_transform_d.h +34 -0
  122. data/ext/pg_query/include/postgres/catalog/pg_trigger.h +153 -0
  123. data/ext/pg_query/include/postgres/catalog/pg_trigger_d.h +109 -0
  124. data/ext/pg_query/include/postgres/catalog/pg_ts_config.h +56 -0
  125. data/ext/pg_query/include/postgres/catalog/pg_ts_config_d.h +34 -0
  126. data/ext/pg_query/include/postgres/catalog/pg_ts_dict.h +62 -0
  127. data/ext/pg_query/include/postgres/catalog/pg_ts_dict_d.h +35 -0
  128. data/ext/pg_query/include/postgres/catalog/pg_ts_parser.h +63 -0
  129. data/ext/pg_query/include/postgres/catalog/pg_ts_parser_d.h +37 -0
  130. data/ext/pg_query/include/postgres/catalog/pg_ts_template.h +54 -0
  131. data/ext/pg_query/include/postgres/catalog/pg_ts_template_d.h +34 -0
  132. data/ext/pg_query/include/postgres/catalog/pg_type.h +407 -0
  133. data/ext/pg_query/include/postgres/catalog/pg_type_d.h +324 -0
  134. data/ext/pg_query/include/postgres/catalog/storage.h +50 -0
  135. data/ext/pg_query/include/postgres/catalog/syscache_ids.h +104 -0
  136. data/ext/pg_query/include/postgres/commands/async.h +49 -0
  137. data/ext/pg_query/include/postgres/commands/dbcommands.h +37 -0
  138. data/ext/pg_query/include/postgres/commands/defrem.h +161 -0
  139. data/ext/pg_query/include/postgres/commands/event_trigger.h +97 -0
  140. data/ext/pg_query/include/postgres/commands/explain.h +145 -0
  141. data/ext/pg_query/include/postgres/commands/prepare.h +61 -0
  142. data/ext/pg_query/include/postgres/commands/tablespace.h +69 -0
  143. data/ext/pg_query/include/postgres/commands/trigger.h +288 -0
  144. data/ext/pg_query/include/postgres/commands/user.h +43 -0
  145. data/ext/pg_query/include/postgres/commands/vacuum.h +388 -0
  146. data/ext/pg_query/include/postgres/common/cryptohash.h +39 -0
  147. data/ext/pg_query/include/postgres/common/file_perm.h +56 -0
  148. data/ext/pg_query/include/postgres/common/file_utils.h +65 -0
  149. data/ext/pg_query/include/postgres/common/hashfn.h +119 -0
  150. data/ext/pg_query/include/postgres/common/hashfn_unstable.h +407 -0
  151. data/ext/pg_query/include/postgres/common/int.h +512 -0
  152. data/ext/pg_query/include/postgres/common/keywords.h +29 -0
  153. data/ext/pg_query/include/postgres/common/kwlookup.h +44 -0
  154. data/ext/pg_query/include/postgres/common/pg_prng.h +62 -0
  155. data/ext/pg_query/include/postgres/common/relpath.h +97 -0
  156. data/ext/pg_query/include/postgres/common/scram-common.h +70 -0
  157. data/ext/pg_query/include/postgres/common/sha2.h +32 -0
  158. data/ext/pg_query/include/postgres/common/string.h +44 -0
  159. data/ext/pg_query/include/postgres/common/unicode_east_asian_fw_table.h +124 -0
  160. data/ext/pg_query/include/postgres/common/unicode_nonspacing_table.h +326 -0
  161. data/ext/pg_query/include/postgres/copyfuncs.funcs.c +5261 -0
  162. data/ext/pg_query/include/postgres/copyfuncs.switch.c +989 -0
  163. data/ext/pg_query/include/postgres/datatype/timestamp.h +269 -0
  164. data/ext/pg_query/include/postgres/equalfuncs.funcs.c +3310 -0
  165. data/ext/pg_query/include/postgres/equalfuncs.switch.c +836 -0
  166. data/ext/pg_query/include/postgres/executor/execdesc.h +70 -0
  167. data/ext/pg_query/include/postgres/executor/executor.h +681 -0
  168. data/ext/pg_query/include/postgres/executor/functions.h +56 -0
  169. data/ext/pg_query/include/postgres/executor/instrument.h +120 -0
  170. data/ext/pg_query/include/postgres/executor/spi.h +207 -0
  171. data/ext/pg_query/include/postgres/executor/tablefunc.h +67 -0
  172. data/ext/pg_query/include/postgres/executor/tuptable.h +523 -0
  173. data/ext/pg_query/include/postgres/fmgr.h +800 -0
  174. data/ext/pg_query/include/postgres/foreign/fdwapi.h +294 -0
  175. data/ext/pg_query/include/postgres/funcapi.h +360 -0
  176. data/ext/pg_query/include/postgres/gram.h +1168 -0
  177. data/ext/pg_query/include/postgres/gramparse.h +75 -0
  178. data/ext/pg_query/include/postgres/jit/jit.h +106 -0
  179. data/ext/pg_query/include/postgres/kwlist_d.h +1164 -0
  180. data/ext/pg_query/include/postgres/lib/dshash.h +130 -0
  181. data/ext/pg_query/include/postgres/lib/ilist.h +1159 -0
  182. data/ext/pg_query/include/postgres/lib/pairingheap.h +102 -0
  183. data/ext/pg_query/include/postgres/lib/simplehash.h +1206 -0
  184. data/ext/pg_query/include/postgres/lib/sort_template.h +445 -0
  185. data/ext/pg_query/include/postgres/lib/stringinfo.h +243 -0
  186. data/ext/pg_query/include/postgres/libpq/auth.h +37 -0
  187. data/ext/pg_query/include/postgres/libpq/crypt.h +47 -0
  188. data/ext/pg_query/include/postgres/libpq/hba.h +186 -0
  189. data/ext/pg_query/include/postgres/libpq/libpq-be.h +361 -0
  190. data/ext/pg_query/include/postgres/libpq/libpq.h +143 -0
  191. data/ext/pg_query/include/postgres/libpq/pqcomm.h +169 -0
  192. data/ext/pg_query/include/postgres/libpq/pqformat.h +209 -0
  193. data/ext/pg_query/include/postgres/libpq/pqsignal.h +54 -0
  194. data/ext/pg_query/include/postgres/libpq/protocol.h +89 -0
  195. data/ext/pg_query/include/postgres/libpq/sasl.h +136 -0
  196. data/ext/pg_query/include/postgres/libpq/scram.h +37 -0
  197. data/ext/pg_query/include/postgres/mb/pg_wchar.h +793 -0
  198. data/ext/pg_query/include/postgres/mb/stringinfo_mb.h +24 -0
  199. data/ext/pg_query/include/postgres/miscadmin.h +527 -0
  200. data/ext/pg_query/include/postgres/nodes/bitmapset.h +140 -0
  201. data/ext/pg_query/include/postgres/nodes/execnodes.h +2855 -0
  202. data/ext/pg_query/include/postgres/nodes/extensible.h +164 -0
  203. data/ext/pg_query/include/postgres/nodes/lockoptions.h +61 -0
  204. data/ext/pg_query/include/postgres/nodes/makefuncs.h +127 -0
  205. data/ext/pg_query/include/postgres/nodes/memnodes.h +152 -0
  206. data/ext/pg_query/include/postgres/nodes/miscnodes.h +56 -0
  207. data/ext/pg_query/include/postgres/nodes/nodeFuncs.h +222 -0
  208. data/ext/pg_query/include/postgres/nodes/nodes.h +435 -0
  209. data/ext/pg_query/include/postgres/nodes/nodetags.h +491 -0
  210. data/ext/pg_query/include/postgres/nodes/params.h +170 -0
  211. data/ext/pg_query/include/postgres/nodes/parsenodes.h +4233 -0
  212. data/ext/pg_query/include/postgres/nodes/pathnodes.h +3438 -0
  213. data/ext/pg_query/include/postgres/nodes/pg_list.h +686 -0
  214. data/ext/pg_query/include/postgres/nodes/plannodes.h +1593 -0
  215. data/ext/pg_query/include/postgres/nodes/primnodes.h +2339 -0
  216. data/ext/pg_query/include/postgres/nodes/print.h +34 -0
  217. data/ext/pg_query/include/postgres/nodes/queryjumble.h +86 -0
  218. data/ext/pg_query/include/postgres/nodes/replnodes.h +132 -0
  219. data/ext/pg_query/include/postgres/nodes/supportnodes.h +346 -0
  220. data/ext/pg_query/include/postgres/nodes/tidbitmap.h +75 -0
  221. data/ext/pg_query/include/postgres/nodes/value.h +90 -0
  222. data/ext/pg_query/include/postgres/optimizer/cost.h +216 -0
  223. data/ext/pg_query/include/postgres/optimizer/geqo.h +90 -0
  224. data/ext/pg_query/include/postgres/optimizer/geqo_gene.h +45 -0
  225. data/ext/pg_query/include/postgres/optimizer/optimizer.h +205 -0
  226. data/ext/pg_query/include/postgres/optimizer/paths.h +271 -0
  227. data/ext/pg_query/include/postgres/optimizer/planmain.h +123 -0
  228. data/ext/pg_query/include/postgres/parser/analyze.h +66 -0
  229. data/ext/pg_query/include/postgres/parser/kwlist.h +518 -0
  230. data/ext/pg_query/include/postgres/parser/parse_agg.h +65 -0
  231. data/ext/pg_query/include/postgres/parser/parse_coerce.h +105 -0
  232. data/ext/pg_query/include/postgres/parser/parse_expr.h +25 -0
  233. data/ext/pg_query/include/postgres/parser/parse_func.h +74 -0
  234. data/ext/pg_query/include/postgres/parser/parse_node.h +358 -0
  235. data/ext/pg_query/include/postgres/parser/parse_oper.h +68 -0
  236. data/ext/pg_query/include/postgres/parser/parse_relation.h +129 -0
  237. data/ext/pg_query/include/postgres/parser/parse_type.h +61 -0
  238. data/ext/pg_query/include/postgres/parser/parser.h +68 -0
  239. data/ext/pg_query/include/postgres/parser/parsetree.h +61 -0
  240. data/ext/pg_query/include/postgres/parser/scanner.h +152 -0
  241. data/ext/pg_query/include/postgres/parser/scansup.h +27 -0
  242. data/ext/pg_query/include/postgres/partitioning/partdefs.h +26 -0
  243. data/ext/pg_query/include/postgres/pg_config.h +985 -0
  244. data/ext/pg_query/include/postgres/pg_config_manual.h +385 -0
  245. data/ext/pg_query/include/postgres/pg_config_os.h +8 -0
  246. data/ext/pg_query/include/postgres/pg_getopt.h +56 -0
  247. data/ext/pg_query/include/postgres/pg_trace.h +17 -0
  248. data/ext/pg_query/include/postgres/pgstat.h +780 -0
  249. data/ext/pg_query/include/postgres/pgtime.h +94 -0
  250. data/ext/pg_query/include/postgres/pl_gram.h +385 -0
  251. data/ext/pg_query/include/postgres/pl_reserved_kwlist.h +52 -0
  252. data/ext/pg_query/include/postgres/pl_reserved_kwlist_d.h +114 -0
  253. data/ext/pg_query/include/postgres/pl_unreserved_kwlist.h +112 -0
  254. data/ext/pg_query/include/postgres/pl_unreserved_kwlist_d.h +246 -0
  255. data/ext/pg_query/include/postgres/plerrcodes.h +998 -0
  256. data/ext/pg_query/include/postgres/plpgsql.h +1342 -0
  257. data/ext/pg_query/include/postgres/port/atomics/arch-arm.h +32 -0
  258. data/ext/pg_query/include/postgres/port/atomics/arch-hppa.h +17 -0
  259. data/ext/pg_query/include/postgres/port/atomics/arch-ppc.h +256 -0
  260. data/ext/pg_query/include/postgres/port/atomics/arch-x86.h +254 -0
  261. data/ext/pg_query/include/postgres/port/atomics/fallback.h +170 -0
  262. data/ext/pg_query/include/postgres/port/atomics/generic-gcc.h +323 -0
  263. data/ext/pg_query/include/postgres/port/atomics/generic-msvc.h +119 -0
  264. data/ext/pg_query/include/postgres/port/atomics/generic-sunpro.h +121 -0
  265. data/ext/pg_query/include/postgres/port/atomics/generic.h +437 -0
  266. data/ext/pg_query/include/postgres/port/atomics.h +606 -0
  267. data/ext/pg_query/include/postgres/port/pg_bitutils.h +421 -0
  268. data/ext/pg_query/include/postgres/port/pg_bswap.h +161 -0
  269. data/ext/pg_query/include/postgres/port/pg_crc32c.h +110 -0
  270. data/ext/pg_query/include/postgres/port/pg_iovec.h +117 -0
  271. data/ext/pg_query/include/postgres/port/simd.h +422 -0
  272. data/ext/pg_query/include/postgres/port/win32/arpa/inet.h +3 -0
  273. data/ext/pg_query/include/postgres/port/win32/dlfcn.h +1 -0
  274. data/ext/pg_query/include/postgres/port/win32/grp.h +1 -0
  275. data/ext/pg_query/include/postgres/port/win32/netdb.h +7 -0
  276. data/ext/pg_query/include/postgres/port/win32/netinet/in.h +3 -0
  277. data/ext/pg_query/include/postgres/port/win32/netinet/tcp.h +7 -0
  278. data/ext/pg_query/include/postgres/port/win32/pwd.h +3 -0
  279. data/ext/pg_query/include/postgres/port/win32/sys/resource.h +20 -0
  280. data/ext/pg_query/include/postgres/port/win32/sys/select.h +3 -0
  281. data/ext/pg_query/include/postgres/port/win32/sys/socket.h +34 -0
  282. data/ext/pg_query/include/postgres/port/win32/sys/un.h +17 -0
  283. data/ext/pg_query/include/postgres/port/win32/sys/wait.h +3 -0
  284. data/ext/pg_query/include/postgres/port/win32.h +59 -0
  285. data/ext/pg_query/include/postgres/port/win32_msvc/dirent.h +34 -0
  286. data/ext/pg_query/include/postgres/port/win32_msvc/sys/file.h +1 -0
  287. data/ext/pg_query/include/postgres/port/win32_msvc/sys/param.h +1 -0
  288. data/ext/pg_query/include/postgres/port/win32_msvc/sys/time.h +1 -0
  289. data/ext/pg_query/include/postgres/port/win32_msvc/unistd.h +9 -0
  290. data/ext/pg_query/include/postgres/port/win32_msvc/utime.h +3 -0
  291. data/ext/pg_query/include/postgres/port/win32_port.h +582 -0
  292. data/ext/pg_query/include/postgres/port.h +555 -0
  293. data/ext/pg_query/include/postgres/portability/instr_time.h +197 -0
  294. data/ext/pg_query/include/postgres/postgres.h +579 -0
  295. data/ext/pg_query/include/postgres/postgres_ext.h +73 -0
  296. data/ext/pg_query/include/postgres/postmaster/autovacuum.h +69 -0
  297. data/ext/pg_query/include/postgres/postmaster/bgworker.h +164 -0
  298. data/ext/pg_query/include/postgres/postmaster/bgworker_internals.h +60 -0
  299. data/ext/pg_query/include/postgres/postmaster/bgwriter.h +45 -0
  300. data/ext/pg_query/include/postgres/postmaster/interrupt.h +32 -0
  301. data/ext/pg_query/include/postgres/postmaster/pgarch.h +36 -0
  302. data/ext/pg_query/include/postgres/postmaster/postmaster.h +101 -0
  303. data/ext/pg_query/include/postgres/postmaster/startup.h +41 -0
  304. data/ext/pg_query/include/postgres/postmaster/syslogger.h +101 -0
  305. data/ext/pg_query/include/postgres/postmaster/walsummarizer.h +35 -0
  306. data/ext/pg_query/include/postgres/postmaster/walwriter.h +23 -0
  307. data/ext/pg_query/include/postgres/regex/regex.h +272 -0
  308. data/ext/pg_query/include/postgres/replication/logicallauncher.h +34 -0
  309. data/ext/pg_query/include/postgres/replication/logicalproto.h +274 -0
  310. data/ext/pg_query/include/postgres/replication/logicalworker.h +33 -0
  311. data/ext/pg_query/include/postgres/replication/origin.h +73 -0
  312. data/ext/pg_query/include/postgres/replication/reorderbuffer.h +734 -0
  313. data/ext/pg_query/include/postgres/replication/slot.h +289 -0
  314. data/ext/pg_query/include/postgres/replication/slotsync.h +38 -0
  315. data/ext/pg_query/include/postgres/replication/syncrep.h +109 -0
  316. data/ext/pg_query/include/postgres/replication/walreceiver.h +504 -0
  317. data/ext/pg_query/include/postgres/replication/walsender.h +76 -0
  318. data/ext/pg_query/include/postgres/rewrite/prs2lock.h +46 -0
  319. data/ext/pg_query/include/postgres/rewrite/rewriteHandler.h +41 -0
  320. data/ext/pg_query/include/postgres/rewrite/rewriteManip.h +96 -0
  321. data/ext/pg_query/include/postgres/rewrite/rewriteSupport.h +26 -0
  322. data/ext/pg_query/include/postgres/storage/block.h +108 -0
  323. data/ext/pg_query/include/postgres/storage/buf.h +46 -0
  324. data/ext/pg_query/include/postgres/storage/bufmgr.h +411 -0
  325. data/ext/pg_query/include/postgres/storage/bufpage.h +510 -0
  326. data/ext/pg_query/include/postgres/storage/condition_variable.h +73 -0
  327. data/ext/pg_query/include/postgres/storage/dsm.h +61 -0
  328. data/ext/pg_query/include/postgres/storage/dsm_impl.h +79 -0
  329. data/ext/pg_query/include/postgres/storage/fd.h +219 -0
  330. data/ext/pg_query/include/postgres/storage/fileset.h +40 -0
  331. data/ext/pg_query/include/postgres/storage/ipc.h +87 -0
  332. data/ext/pg_query/include/postgres/storage/item.h +19 -0
  333. data/ext/pg_query/include/postgres/storage/itemid.h +184 -0
  334. data/ext/pg_query/include/postgres/storage/itemptr.h +245 -0
  335. data/ext/pg_query/include/postgres/storage/large_object.h +100 -0
  336. data/ext/pg_query/include/postgres/storage/latch.h +196 -0
  337. data/ext/pg_query/include/postgres/storage/lmgr.h +126 -0
  338. data/ext/pg_query/include/postgres/storage/lock.h +624 -0
  339. data/ext/pg_query/include/postgres/storage/lockdefs.h +61 -0
  340. data/ext/pg_query/include/postgres/storage/lwlock.h +228 -0
  341. data/ext/pg_query/include/postgres/storage/lwlocknames.h +47 -0
  342. data/ext/pg_query/include/postgres/storage/off.h +57 -0
  343. data/ext/pg_query/include/postgres/storage/pg_sema.h +61 -0
  344. data/ext/pg_query/include/postgres/storage/pg_shmem.h +93 -0
  345. data/ext/pg_query/include/postgres/storage/pmsignal.h +105 -0
  346. data/ext/pg_query/include/postgres/storage/predicate.h +83 -0
  347. data/ext/pg_query/include/postgres/storage/proc.h +488 -0
  348. data/ext/pg_query/include/postgres/storage/procarray.h +103 -0
  349. data/ext/pg_query/include/postgres/storage/proclist_types.h +53 -0
  350. data/ext/pg_query/include/postgres/storage/procnumber.h +43 -0
  351. data/ext/pg_query/include/postgres/storage/procsignal.h +75 -0
  352. data/ext/pg_query/include/postgres/storage/read_stream.h +65 -0
  353. data/ext/pg_query/include/postgres/storage/relfilelocator.h +100 -0
  354. data/ext/pg_query/include/postgres/storage/s_lock.h +847 -0
  355. data/ext/pg_query/include/postgres/storage/sharedfileset.h +37 -0
  356. data/ext/pg_query/include/postgres/storage/shm_mq.h +86 -0
  357. data/ext/pg_query/include/postgres/storage/shm_toc.h +58 -0
  358. data/ext/pg_query/include/postgres/storage/shmem.h +59 -0
  359. data/ext/pg_query/include/postgres/storage/sinval.h +153 -0
  360. data/ext/pg_query/include/postgres/storage/smgr.h +130 -0
  361. data/ext/pg_query/include/postgres/storage/spin.h +77 -0
  362. data/ext/pg_query/include/postgres/storage/standby.h +109 -0
  363. data/ext/pg_query/include/postgres/storage/standbydefs.h +74 -0
  364. data/ext/pg_query/include/postgres/storage/sync.h +66 -0
  365. data/ext/pg_query/include/postgres/tcop/cmdtag.h +62 -0
  366. data/ext/pg_query/include/postgres/tcop/cmdtaglist.h +219 -0
  367. data/ext/pg_query/include/postgres/tcop/deparse_utility.h +108 -0
  368. data/ext/pg_query/include/postgres/tcop/dest.h +148 -0
  369. data/ext/pg_query/include/postgres/tcop/fastpath.h +20 -0
  370. data/ext/pg_query/include/postgres/tcop/pquery.h +51 -0
  371. data/ext/pg_query/include/postgres/tcop/tcopprot.h +98 -0
  372. data/ext/pg_query/include/postgres/tcop/utility.h +112 -0
  373. data/ext/pg_query/include/postgres/tsearch/ts_cache.h +96 -0
  374. data/ext/pg_query/include/postgres/utils/acl.h +290 -0
  375. data/ext/pg_query/include/postgres/utils/aclchk_internal.h +45 -0
  376. data/ext/pg_query/include/postgres/utils/array.h +481 -0
  377. data/ext/pg_query/include/postgres/utils/ascii.h +84 -0
  378. data/ext/pg_query/include/postgres/utils/backend_progress.h +46 -0
  379. data/ext/pg_query/include/postgres/utils/backend_status.h +340 -0
  380. data/ext/pg_query/include/postgres/utils/builtins.h +139 -0
  381. data/ext/pg_query/include/postgres/utils/bytea.h +28 -0
  382. data/ext/pg_query/include/postgres/utils/catcache.h +231 -0
  383. data/ext/pg_query/include/postgres/utils/date.h +118 -0
  384. data/ext/pg_query/include/postgres/utils/datetime.h +367 -0
  385. data/ext/pg_query/include/postgres/utils/datum.h +76 -0
  386. data/ext/pg_query/include/postgres/utils/dsa.h +166 -0
  387. data/ext/pg_query/include/postgres/utils/elog.h +540 -0
  388. data/ext/pg_query/include/postgres/utils/errcodes.h +352 -0
  389. data/ext/pg_query/include/postgres/utils/expandeddatum.h +170 -0
  390. data/ext/pg_query/include/postgres/utils/expandedrecord.h +241 -0
  391. data/ext/pg_query/include/postgres/utils/float.h +357 -0
  392. data/ext/pg_query/include/postgres/utils/fmgroids.h +3347 -0
  393. data/ext/pg_query/include/postgres/utils/fmgrprotos.h +2904 -0
  394. data/ext/pg_query/include/postgres/utils/fmgrtab.h +49 -0
  395. data/ext/pg_query/include/postgres/utils/guc.h +456 -0
  396. data/ext/pg_query/include/postgres/utils/guc_hooks.h +184 -0
  397. data/ext/pg_query/include/postgres/utils/guc_tables.h +323 -0
  398. data/ext/pg_query/include/postgres/utils/hsearch.h +153 -0
  399. data/ext/pg_query/include/postgres/utils/injection_point.h +44 -0
  400. data/ext/pg_query/include/postgres/utils/inval.h +68 -0
  401. data/ext/pg_query/include/postgres/utils/logtape.h +77 -0
  402. data/ext/pg_query/include/postgres/utils/lsyscache.h +215 -0
  403. data/ext/pg_query/include/postgres/utils/memdebug.h +82 -0
  404. data/ext/pg_query/include/postgres/utils/memutils.h +193 -0
  405. data/ext/pg_query/include/postgres/utils/memutils_internal.h +176 -0
  406. data/ext/pg_query/include/postgres/utils/memutils_memorychunk.h +253 -0
  407. data/ext/pg_query/include/postgres/utils/numeric.h +110 -0
  408. data/ext/pg_query/include/postgres/utils/palloc.h +151 -0
  409. data/ext/pg_query/include/postgres/utils/partcache.h +103 -0
  410. data/ext/pg_query/include/postgres/utils/pg_locale.h +136 -0
  411. data/ext/pg_query/include/postgres/utils/pgstat_internal.h +827 -0
  412. data/ext/pg_query/include/postgres/utils/plancache.h +238 -0
  413. data/ext/pg_query/include/postgres/utils/portal.h +252 -0
  414. data/ext/pg_query/include/postgres/utils/probes.h +114 -0
  415. data/ext/pg_query/include/postgres/utils/ps_status.h +47 -0
  416. data/ext/pg_query/include/postgres/utils/queryenvironment.h +74 -0
  417. data/ext/pg_query/include/postgres/utils/regproc.h +39 -0
  418. data/ext/pg_query/include/postgres/utils/rel.h +711 -0
  419. data/ext/pg_query/include/postgres/utils/relcache.h +155 -0
  420. data/ext/pg_query/include/postgres/utils/reltrigger.h +81 -0
  421. data/ext/pg_query/include/postgres/utils/resowner.h +167 -0
  422. data/ext/pg_query/include/postgres/utils/ruleutils.h +52 -0
  423. data/ext/pg_query/include/postgres/utils/sharedtuplestore.h +61 -0
  424. data/ext/pg_query/include/postgres/utils/snapmgr.h +130 -0
  425. data/ext/pg_query/include/postgres/utils/snapshot.h +219 -0
  426. data/ext/pg_query/include/postgres/utils/sortsupport.h +391 -0
  427. data/ext/pg_query/include/postgres/utils/syscache.h +136 -0
  428. data/ext/pg_query/include/postgres/utils/timeout.h +96 -0
  429. data/ext/pg_query/include/postgres/utils/timestamp.h +147 -0
  430. data/ext/pg_query/include/postgres/utils/tuplesort.h +472 -0
  431. data/ext/pg_query/include/postgres/utils/tuplestore.h +88 -0
  432. data/ext/pg_query/include/postgres/utils/typcache.h +210 -0
  433. data/ext/pg_query/include/postgres/utils/varlena.h +53 -0
  434. data/ext/pg_query/include/postgres/utils/wait_event.h +108 -0
  435. data/ext/pg_query/include/postgres/utils/wait_event_types.h +218 -0
  436. data/ext/pg_query/include/postgres/utils/xml.h +94 -0
  437. data/ext/pg_query/include/postgres/varatt.h +358 -0
  438. data/ext/pg_query/include/protobuf/pg_query.pb-c.h +8077 -6217
  439. data/ext/pg_query/include/protobuf/pg_query.pb.h +132024 -88124
  440. data/ext/pg_query/pg_query.c +10 -1
  441. data/ext/pg_query/pg_query.pb-c.c +24028 -17173
  442. data/ext/pg_query/pg_query_deparse.c +1 -9902
  443. data/ext/pg_query/pg_query_fingerprint.c +42 -18
  444. data/ext/pg_query/pg_query_fingerprint.h +1 -1
  445. data/ext/pg_query/pg_query_internal.h +1 -1
  446. data/ext/pg_query/pg_query_json_plpgsql.c +1 -25
  447. data/ext/pg_query/pg_query_normalize.c +44 -3
  448. data/ext/pg_query/pg_query_outfuncs_json.c +62 -16
  449. data/ext/pg_query/pg_query_outfuncs_protobuf.c +73 -12
  450. data/ext/pg_query/pg_query_parse.c +47 -5
  451. data/ext/pg_query/pg_query_parse_plpgsql.c +19 -18
  452. data/ext/pg_query/pg_query_readfuncs_protobuf.c +45 -10
  453. data/ext/pg_query/pg_query_ruby.c +5 -0
  454. data/ext/pg_query/pg_query_scan.c +4 -3
  455. data/ext/pg_query/pg_query_split.c +6 -5
  456. data/ext/pg_query/postgres_deparse.c +11496 -0
  457. data/ext/pg_query/postgres_deparse.h +9 -0
  458. data/ext/pg_query/src_backend_catalog_namespace.c +262 -71
  459. data/ext/pg_query/src_backend_catalog_pg_proc.c +3 -2
  460. data/ext/pg_query/src_backend_commands_define.c +12 -3
  461. data/ext/pg_query/src_backend_nodes_bitmapset.c +142 -156
  462. data/ext/pg_query/src_backend_nodes_copyfuncs.c +100 -5881
  463. data/ext/pg_query/src_backend_nodes_equalfuncs.c +102 -3831
  464. data/ext/pg_query/src_backend_nodes_extensible.c +6 -29
  465. data/ext/pg_query/src_backend_nodes_list.c +89 -18
  466. data/ext/pg_query/src_backend_nodes_makefuncs.c +138 -4
  467. data/ext/pg_query/src_backend_nodes_nodeFuncs.c +433 -132
  468. data/ext/pg_query/src_backend_nodes_value.c +28 -19
  469. data/ext/pg_query/src_backend_parser_gram.c +45255 -38885
  470. data/ext/pg_query/src_backend_parser_parser.c +53 -8
  471. data/ext/pg_query/src_backend_parser_scan.c +6999 -3438
  472. data/ext/pg_query/src_backend_parser_scansup.c +5 -28
  473. data/ext/pg_query/src_backend_storage_ipc_ipc.c +13 -4
  474. data/ext/pg_query/src_backend_tcop_postgres.c +156 -114
  475. data/ext/pg_query/src_backend_utils_activity_pgstat_database.c +140 -0
  476. data/ext/pg_query/src_backend_utils_adt_datum.c +14 -2
  477. data/ext/pg_query/src_backend_utils_adt_expandeddatum.c +1 -1
  478. data/ext/pg_query/src_backend_utils_adt_format_type.c +6 -2
  479. data/ext/pg_query/src_backend_utils_adt_numutils.c +488 -0
  480. data/ext/pg_query/src_backend_utils_adt_ruleutils.c +247 -34
  481. data/ext/pg_query/src_backend_utils_error_assert.c +17 -18
  482. data/ext/pg_query/src_backend_utils_error_elog.c +543 -343
  483. data/ext/pg_query/src_backend_utils_fmgr_fmgr.c +47 -18
  484. data/ext/pg_query/src_backend_utils_init_globals.c +22 -7
  485. data/ext/pg_query/src_backend_utils_mb_mbutils.c +84 -148
  486. data/ext/pg_query/src_backend_utils_misc_guc_tables.c +502 -0
  487. data/ext/pg_query/src_backend_utils_mmgr_alignedalloc.c +166 -0
  488. data/ext/pg_query/src_backend_utils_mmgr_aset.c +708 -499
  489. data/ext/pg_query/src_backend_utils_mmgr_bump.c +728 -0
  490. data/ext/pg_query/src_backend_utils_mmgr_generation.c +1115 -0
  491. data/ext/pg_query/src_backend_utils_mmgr_mcxt.c +710 -218
  492. data/ext/pg_query/src_backend_utils_mmgr_slab.c +1079 -0
  493. data/ext/pg_query/src_common_encnames.c +46 -44
  494. data/ext/pg_query/src_common_hashfn.c +3 -3
  495. data/ext/pg_query/src_common_keywords.c +15 -2
  496. data/ext/pg_query/src_common_kwlist_d.h +602 -510
  497. data/ext/pg_query/src_common_kwlookup.c +1 -1
  498. data/ext/pg_query/src_common_psprintf.c +3 -3
  499. data/ext/pg_query/src_common_stringinfo.c +21 -4
  500. data/ext/pg_query/src_common_wchar.c +754 -178
  501. data/ext/pg_query/src_pl_plpgsql_src_pl_comp.c +143 -24
  502. data/ext/pg_query/src_pl_plpgsql_src_pl_funcs.c +3 -18
  503. data/ext/pg_query/src_pl_plpgsql_src_pl_gram.c +1295 -1255
  504. data/ext/pg_query/src_pl_plpgsql_src_pl_handler.c +1 -1
  505. data/ext/pg_query/src_pl_plpgsql_src_pl_reserved_kwlist_d.h +10 -10
  506. data/ext/pg_query/src_pl_plpgsql_src_pl_scanner.c +20 -2
  507. data/ext/pg_query/src_pl_plpgsql_src_pl_unreserved_kwlist_d.h +60 -60
  508. data/ext/pg_query/src_port_pg_bitutils.c +283 -54
  509. data/ext/pg_query/src_port_pgstrcasecmp.c +57 -1
  510. data/ext/pg_query/src_port_qsort.c +12 -224
  511. data/ext/pg_query/src_port_snprintf.c +56 -39
  512. data/ext/pg_query/src_port_strerror.c +9 -21
  513. data/ext/pg_query/src_port_strlcpy.c +79 -0
  514. data/lib/pg_query/filter_columns.rb +1 -1
  515. data/lib/pg_query/fingerprint.rb +10 -9
  516. data/lib/pg_query/node.rb +18 -13
  517. data/lib/pg_query/param_refs.rb +3 -3
  518. data/lib/pg_query/parse.rb +25 -15
  519. data/lib/pg_query/parse_error.rb +1 -0
  520. data/lib/pg_query/pg_query_pb.rb +181 -3038
  521. data/lib/pg_query/scan.rb +1 -0
  522. data/lib/pg_query/treewalker.rb +55 -8
  523. data/lib/pg_query/truncate.rb +19 -21
  524. data/lib/pg_query/version.rb +1 -1
  525. metadata +447 -436
  526. data/ext/pg_query/guc-file.c +0 -0
  527. data/ext/pg_query/include/access/amapi.h +0 -246
  528. data/ext/pg_query/include/access/attmap.h +0 -52
  529. data/ext/pg_query/include/access/attnum.h +0 -64
  530. data/ext/pg_query/include/access/clog.h +0 -61
  531. data/ext/pg_query/include/access/commit_ts.h +0 -77
  532. data/ext/pg_query/include/access/detoast.h +0 -92
  533. data/ext/pg_query/include/access/genam.h +0 -228
  534. data/ext/pg_query/include/access/gin.h +0 -78
  535. data/ext/pg_query/include/access/htup.h +0 -89
  536. data/ext/pg_query/include/access/htup_details.h +0 -819
  537. data/ext/pg_query/include/access/itup.h +0 -161
  538. data/ext/pg_query/include/access/parallel.h +0 -82
  539. data/ext/pg_query/include/access/printtup.h +0 -35
  540. data/ext/pg_query/include/access/relation.h +0 -28
  541. data/ext/pg_query/include/access/relscan.h +0 -176
  542. data/ext/pg_query/include/access/rmgr.h +0 -35
  543. data/ext/pg_query/include/access/rmgrlist.h +0 -49
  544. data/ext/pg_query/include/access/sdir.h +0 -58
  545. data/ext/pg_query/include/access/skey.h +0 -151
  546. data/ext/pg_query/include/access/stratnum.h +0 -83
  547. data/ext/pg_query/include/access/sysattr.h +0 -29
  548. data/ext/pg_query/include/access/table.h +0 -27
  549. data/ext/pg_query/include/access/tableam.h +0 -1825
  550. data/ext/pg_query/include/access/transam.h +0 -265
  551. data/ext/pg_query/include/access/tupconvert.h +0 -51
  552. data/ext/pg_query/include/access/tupdesc.h +0 -154
  553. data/ext/pg_query/include/access/tupmacs.h +0 -247
  554. data/ext/pg_query/include/access/twophase.h +0 -63
  555. data/ext/pg_query/include/access/xact.h +0 -469
  556. data/ext/pg_query/include/access/xlog.h +0 -398
  557. data/ext/pg_query/include/access/xlog_internal.h +0 -339
  558. data/ext/pg_query/include/access/xlogdefs.h +0 -109
  559. data/ext/pg_query/include/access/xloginsert.h +0 -64
  560. data/ext/pg_query/include/access/xlogreader.h +0 -337
  561. data/ext/pg_query/include/access/xlogrecord.h +0 -227
  562. data/ext/pg_query/include/bootstrap/bootstrap.h +0 -62
  563. data/ext/pg_query/include/c.h +0 -1334
  564. data/ext/pg_query/include/catalog/catalog.h +0 -42
  565. data/ext/pg_query/include/catalog/catversion.h +0 -58
  566. data/ext/pg_query/include/catalog/dependency.h +0 -277
  567. data/ext/pg_query/include/catalog/genbki.h +0 -64
  568. data/ext/pg_query/include/catalog/index.h +0 -199
  569. data/ext/pg_query/include/catalog/indexing.h +0 -366
  570. data/ext/pg_query/include/catalog/namespace.h +0 -188
  571. data/ext/pg_query/include/catalog/objectaccess.h +0 -197
  572. data/ext/pg_query/include/catalog/objectaddress.h +0 -84
  573. data/ext/pg_query/include/catalog/pg_aggregate.h +0 -176
  574. data/ext/pg_query/include/catalog/pg_aggregate_d.h +0 -77
  575. data/ext/pg_query/include/catalog/pg_am.h +0 -60
  576. data/ext/pg_query/include/catalog/pg_am_d.h +0 -45
  577. data/ext/pg_query/include/catalog/pg_attribute.h +0 -204
  578. data/ext/pg_query/include/catalog/pg_attribute_d.h +0 -59
  579. data/ext/pg_query/include/catalog/pg_authid.h +0 -58
  580. data/ext/pg_query/include/catalog/pg_authid_d.h +0 -49
  581. data/ext/pg_query/include/catalog/pg_class.h +0 -200
  582. data/ext/pg_query/include/catalog/pg_class_d.h +0 -103
  583. data/ext/pg_query/include/catalog/pg_collation.h +0 -73
  584. data/ext/pg_query/include/catalog/pg_collation_d.h +0 -45
  585. data/ext/pg_query/include/catalog/pg_constraint.h +0 -247
  586. data/ext/pg_query/include/catalog/pg_constraint_d.h +0 -67
  587. data/ext/pg_query/include/catalog/pg_control.h +0 -252
  588. data/ext/pg_query/include/catalog/pg_conversion.h +0 -72
  589. data/ext/pg_query/include/catalog/pg_conversion_d.h +0 -35
  590. data/ext/pg_query/include/catalog/pg_depend.h +0 -73
  591. data/ext/pg_query/include/catalog/pg_depend_d.h +0 -34
  592. data/ext/pg_query/include/catalog/pg_event_trigger.h +0 -51
  593. data/ext/pg_query/include/catalog/pg_event_trigger_d.h +0 -34
  594. data/ext/pg_query/include/catalog/pg_index.h +0 -80
  595. data/ext/pg_query/include/catalog/pg_index_d.h +0 -56
  596. data/ext/pg_query/include/catalog/pg_language.h +0 -67
  597. data/ext/pg_query/include/catalog/pg_language_d.h +0 -39
  598. data/ext/pg_query/include/catalog/pg_namespace.h +0 -59
  599. data/ext/pg_query/include/catalog/pg_namespace_d.h +0 -34
  600. data/ext/pg_query/include/catalog/pg_opclass.h +0 -85
  601. data/ext/pg_query/include/catalog/pg_opclass_d.h +0 -49
  602. data/ext/pg_query/include/catalog/pg_operator.h +0 -104
  603. data/ext/pg_query/include/catalog/pg_operator_d.h +0 -106
  604. data/ext/pg_query/include/catalog/pg_opfamily.h +0 -60
  605. data/ext/pg_query/include/catalog/pg_opfamily_d.h +0 -47
  606. data/ext/pg_query/include/catalog/pg_partitioned_table.h +0 -63
  607. data/ext/pg_query/include/catalog/pg_partitioned_table_d.h +0 -35
  608. data/ext/pg_query/include/catalog/pg_proc.h +0 -211
  609. data/ext/pg_query/include/catalog/pg_proc_d.h +0 -99
  610. data/ext/pg_query/include/catalog/pg_publication.h +0 -118
  611. data/ext/pg_query/include/catalog/pg_publication_d.h +0 -36
  612. data/ext/pg_query/include/catalog/pg_replication_origin.h +0 -57
  613. data/ext/pg_query/include/catalog/pg_replication_origin_d.h +0 -29
  614. data/ext/pg_query/include/catalog/pg_statistic.h +0 -275
  615. data/ext/pg_query/include/catalog/pg_statistic_d.h +0 -194
  616. data/ext/pg_query/include/catalog/pg_statistic_ext.h +0 -74
  617. data/ext/pg_query/include/catalog/pg_statistic_ext_d.h +0 -40
  618. data/ext/pg_query/include/catalog/pg_transform.h +0 -45
  619. data/ext/pg_query/include/catalog/pg_transform_d.h +0 -32
  620. data/ext/pg_query/include/catalog/pg_trigger.h +0 -137
  621. data/ext/pg_query/include/catalog/pg_trigger_d.h +0 -106
  622. data/ext/pg_query/include/catalog/pg_ts_config.h +0 -50
  623. data/ext/pg_query/include/catalog/pg_ts_config_d.h +0 -32
  624. data/ext/pg_query/include/catalog/pg_ts_dict.h +0 -54
  625. data/ext/pg_query/include/catalog/pg_ts_dict_d.h +0 -33
  626. data/ext/pg_query/include/catalog/pg_ts_parser.h +0 -57
  627. data/ext/pg_query/include/catalog/pg_ts_parser_d.h +0 -35
  628. data/ext/pg_query/include/catalog/pg_ts_template.h +0 -48
  629. data/ext/pg_query/include/catalog/pg_ts_template_d.h +0 -32
  630. data/ext/pg_query/include/catalog/pg_type.h +0 -373
  631. data/ext/pg_query/include/catalog/pg_type_d.h +0 -285
  632. data/ext/pg_query/include/catalog/storage.h +0 -48
  633. data/ext/pg_query/include/commands/async.h +0 -54
  634. data/ext/pg_query/include/commands/dbcommands.h +0 -35
  635. data/ext/pg_query/include/commands/defrem.h +0 -173
  636. data/ext/pg_query/include/commands/event_trigger.h +0 -88
  637. data/ext/pg_query/include/commands/explain.h +0 -127
  638. data/ext/pg_query/include/commands/prepare.h +0 -61
  639. data/ext/pg_query/include/commands/tablespace.h +0 -69
  640. data/ext/pg_query/include/commands/trigger.h +0 -285
  641. data/ext/pg_query/include/commands/user.h +0 -37
  642. data/ext/pg_query/include/commands/vacuum.h +0 -293
  643. data/ext/pg_query/include/commands/variable.h +0 -38
  644. data/ext/pg_query/include/common/file_perm.h +0 -56
  645. data/ext/pg_query/include/common/hashfn.h +0 -104
  646. data/ext/pg_query/include/common/ip.h +0 -37
  647. data/ext/pg_query/include/common/keywords.h +0 -33
  648. data/ext/pg_query/include/common/kwlookup.h +0 -44
  649. data/ext/pg_query/include/common/relpath.h +0 -90
  650. data/ext/pg_query/include/common/string.h +0 -19
  651. data/ext/pg_query/include/common/unicode_combining_table.h +0 -196
  652. data/ext/pg_query/include/datatype/timestamp.h +0 -197
  653. data/ext/pg_query/include/executor/execdesc.h +0 -70
  654. data/ext/pg_query/include/executor/executor.h +0 -620
  655. data/ext/pg_query/include/executor/functions.h +0 -41
  656. data/ext/pg_query/include/executor/instrument.h +0 -101
  657. data/ext/pg_query/include/executor/spi.h +0 -175
  658. data/ext/pg_query/include/executor/tablefunc.h +0 -67
  659. data/ext/pg_query/include/executor/tuptable.h +0 -487
  660. data/ext/pg_query/include/fmgr.h +0 -775
  661. data/ext/pg_query/include/funcapi.h +0 -348
  662. data/ext/pg_query/include/getaddrinfo.h +0 -162
  663. data/ext/pg_query/include/jit/jit.h +0 -105
  664. data/ext/pg_query/include/kwlist_d.h +0 -1072
  665. data/ext/pg_query/include/lib/ilist.h +0 -727
  666. data/ext/pg_query/include/lib/pairingheap.h +0 -102
  667. data/ext/pg_query/include/lib/simplehash.h +0 -1059
  668. data/ext/pg_query/include/lib/stringinfo.h +0 -161
  669. data/ext/pg_query/include/libpq/auth.h +0 -29
  670. data/ext/pg_query/include/libpq/crypt.h +0 -46
  671. data/ext/pg_query/include/libpq/hba.h +0 -140
  672. data/ext/pg_query/include/libpq/libpq-be.h +0 -326
  673. data/ext/pg_query/include/libpq/libpq.h +0 -134
  674. data/ext/pg_query/include/libpq/pqcomm.h +0 -208
  675. data/ext/pg_query/include/libpq/pqformat.h +0 -210
  676. data/ext/pg_query/include/libpq/pqsignal.h +0 -42
  677. data/ext/pg_query/include/mb/pg_wchar.h +0 -673
  678. data/ext/pg_query/include/mb/stringinfo_mb.h +0 -24
  679. data/ext/pg_query/include/miscadmin.h +0 -489
  680. data/ext/pg_query/include/nodes/bitmapset.h +0 -122
  681. data/ext/pg_query/include/nodes/execnodes.h +0 -2523
  682. data/ext/pg_query/include/nodes/extensible.h +0 -160
  683. data/ext/pg_query/include/nodes/lockoptions.h +0 -61
  684. data/ext/pg_query/include/nodes/makefuncs.h +0 -108
  685. data/ext/pg_query/include/nodes/memnodes.h +0 -108
  686. data/ext/pg_query/include/nodes/nodeFuncs.h +0 -162
  687. data/ext/pg_query/include/nodes/nodes.h +0 -842
  688. data/ext/pg_query/include/nodes/params.h +0 -170
  689. data/ext/pg_query/include/nodes/parsenodes.h +0 -3580
  690. data/ext/pg_query/include/nodes/pathnodes.h +0 -2557
  691. data/ext/pg_query/include/nodes/pg_list.h +0 -606
  692. data/ext/pg_query/include/nodes/plannodes.h +0 -1266
  693. data/ext/pg_query/include/nodes/primnodes.h +0 -1541
  694. data/ext/pg_query/include/nodes/print.h +0 -34
  695. data/ext/pg_query/include/nodes/tidbitmap.h +0 -75
  696. data/ext/pg_query/include/nodes/value.h +0 -61
  697. data/ext/pg_query/include/optimizer/cost.h +0 -206
  698. data/ext/pg_query/include/optimizer/geqo.h +0 -88
  699. data/ext/pg_query/include/optimizer/geqo_gene.h +0 -45
  700. data/ext/pg_query/include/optimizer/optimizer.h +0 -194
  701. data/ext/pg_query/include/optimizer/paths.h +0 -257
  702. data/ext/pg_query/include/optimizer/planmain.h +0 -119
  703. data/ext/pg_query/include/parser/analyze.h +0 -49
  704. data/ext/pg_query/include/parser/gram.h +0 -1067
  705. data/ext/pg_query/include/parser/gramparse.h +0 -75
  706. data/ext/pg_query/include/parser/kwlist.h +0 -477
  707. data/ext/pg_query/include/parser/parse_agg.h +0 -68
  708. data/ext/pg_query/include/parser/parse_clause.h +0 -54
  709. data/ext/pg_query/include/parser/parse_coerce.h +0 -98
  710. data/ext/pg_query/include/parser/parse_collate.h +0 -27
  711. data/ext/pg_query/include/parser/parse_expr.h +0 -26
  712. data/ext/pg_query/include/parser/parse_func.h +0 -73
  713. data/ext/pg_query/include/parser/parse_node.h +0 -327
  714. data/ext/pg_query/include/parser/parse_oper.h +0 -67
  715. data/ext/pg_query/include/parser/parse_relation.h +0 -123
  716. data/ext/pg_query/include/parser/parse_target.h +0 -46
  717. data/ext/pg_query/include/parser/parse_type.h +0 -60
  718. data/ext/pg_query/include/parser/parser.h +0 -41
  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 -30
  722. data/ext/pg_query/include/partitioning/partdefs.h +0 -26
  723. data/ext/pg_query/include/pg_config.h +0 -995
  724. data/ext/pg_query/include/pg_config_manual.h +0 -357
  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 -1488
  729. data/ext/pg_query/include/pgtime.h +0 -84
  730. data/ext/pg_query/include/pl_gram.h +0 -385
  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 -112
  734. data/ext/pg_query/include/pl_unreserved_kwlist_d.h +0 -246
  735. data/ext/pg_query/include/plerrcodes.h +0 -990
  736. data/ext/pg_query/include/plpgsql.h +0 -1347
  737. data/ext/pg_query/include/port/atomics/arch-arm.h +0 -26
  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 -272
  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 -528
  748. data/ext/pg_query/include/portability/instr_time.h +0 -256
  749. data/ext/pg_query/include/postgres.h +0 -764
  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/bgworker.h +0 -161
  753. data/ext/pg_query/include/postmaster/bgworker_internals.h +0 -64
  754. data/ext/pg_query/include/postmaster/bgwriter.h +0 -45
  755. data/ext/pg_query/include/postmaster/fork_process.h +0 -17
  756. data/ext/pg_query/include/postmaster/interrupt.h +0 -32
  757. data/ext/pg_query/include/postmaster/pgarch.h +0 -39
  758. data/ext/pg_query/include/postmaster/postmaster.h +0 -77
  759. data/ext/pg_query/include/postmaster/syslogger.h +0 -98
  760. data/ext/pg_query/include/postmaster/walwriter.h +0 -21
  761. data/ext/pg_query/include/regex/regex.h +0 -184
  762. data/ext/pg_query/include/replication/logicallauncher.h +0 -31
  763. data/ext/pg_query/include/replication/logicalproto.h +0 -110
  764. data/ext/pg_query/include/replication/logicalworker.h +0 -19
  765. data/ext/pg_query/include/replication/origin.h +0 -73
  766. data/ext/pg_query/include/replication/reorderbuffer.h +0 -468
  767. data/ext/pg_query/include/replication/slot.h +0 -219
  768. data/ext/pg_query/include/replication/syncrep.h +0 -115
  769. data/ext/pg_query/include/replication/walreceiver.h +0 -340
  770. data/ext/pg_query/include/replication/walsender.h +0 -74
  771. data/ext/pg_query/include/rewrite/prs2lock.h +0 -46
  772. data/ext/pg_query/include/rewrite/rewriteHandler.h +0 -40
  773. data/ext/pg_query/include/rewrite/rewriteManip.h +0 -87
  774. data/ext/pg_query/include/rewrite/rewriteSupport.h +0 -26
  775. data/ext/pg_query/include/storage/backendid.h +0 -37
  776. data/ext/pg_query/include/storage/block.h +0 -121
  777. data/ext/pg_query/include/storage/buf.h +0 -46
  778. data/ext/pg_query/include/storage/bufmgr.h +0 -292
  779. data/ext/pg_query/include/storage/bufpage.h +0 -459
  780. data/ext/pg_query/include/storage/condition_variable.h +0 -62
  781. data/ext/pg_query/include/storage/dsm.h +0 -61
  782. data/ext/pg_query/include/storage/dsm_impl.h +0 -75
  783. data/ext/pg_query/include/storage/fd.h +0 -168
  784. data/ext/pg_query/include/storage/ipc.h +0 -81
  785. data/ext/pg_query/include/storage/item.h +0 -19
  786. data/ext/pg_query/include/storage/itemid.h +0 -184
  787. data/ext/pg_query/include/storage/itemptr.h +0 -206
  788. data/ext/pg_query/include/storage/large_object.h +0 -100
  789. data/ext/pg_query/include/storage/latch.h +0 -190
  790. data/ext/pg_query/include/storage/lmgr.h +0 -114
  791. data/ext/pg_query/include/storage/lock.h +0 -613
  792. data/ext/pg_query/include/storage/lockdefs.h +0 -59
  793. data/ext/pg_query/include/storage/lwlock.h +0 -233
  794. data/ext/pg_query/include/storage/lwlocknames.h +0 -51
  795. data/ext/pg_query/include/storage/off.h +0 -57
  796. data/ext/pg_query/include/storage/pg_sema.h +0 -61
  797. data/ext/pg_query/include/storage/pg_shmem.h +0 -90
  798. data/ext/pg_query/include/storage/pmsignal.h +0 -94
  799. data/ext/pg_query/include/storage/predicate.h +0 -87
  800. data/ext/pg_query/include/storage/proc.h +0 -347
  801. data/ext/pg_query/include/storage/proclist_types.h +0 -51
  802. data/ext/pg_query/include/storage/procsignal.h +0 -75
  803. data/ext/pg_query/include/storage/relfilenode.h +0 -99
  804. data/ext/pg_query/include/storage/s_lock.h +0 -1071
  805. data/ext/pg_query/include/storage/sharedfileset.h +0 -45
  806. data/ext/pg_query/include/storage/shm_mq.h +0 -85
  807. data/ext/pg_query/include/storage/shm_toc.h +0 -58
  808. data/ext/pg_query/include/storage/shmem.h +0 -81
  809. data/ext/pg_query/include/storage/sinval.h +0 -153
  810. data/ext/pg_query/include/storage/sinvaladt.h +0 -43
  811. data/ext/pg_query/include/storage/smgr.h +0 -109
  812. data/ext/pg_query/include/storage/spin.h +0 -77
  813. data/ext/pg_query/include/storage/standby.h +0 -91
  814. data/ext/pg_query/include/storage/standbydefs.h +0 -74
  815. data/ext/pg_query/include/storage/sync.h +0 -62
  816. data/ext/pg_query/include/tcop/cmdtag.h +0 -58
  817. data/ext/pg_query/include/tcop/cmdtaglist.h +0 -217
  818. data/ext/pg_query/include/tcop/deparse_utility.h +0 -108
  819. data/ext/pg_query/include/tcop/dest.h +0 -149
  820. data/ext/pg_query/include/tcop/fastpath.h +0 -21
  821. data/ext/pg_query/include/tcop/pquery.h +0 -51
  822. data/ext/pg_query/include/tcop/tcopprot.h +0 -89
  823. data/ext/pg_query/include/tcop/utility.h +0 -108
  824. data/ext/pg_query/include/tsearch/ts_cache.h +0 -98
  825. data/ext/pg_query/include/utils/acl.h +0 -312
  826. data/ext/pg_query/include/utils/aclchk_internal.h +0 -45
  827. data/ext/pg_query/include/utils/array.h +0 -459
  828. data/ext/pg_query/include/utils/builtins.h +0 -128
  829. data/ext/pg_query/include/utils/bytea.h +0 -27
  830. data/ext/pg_query/include/utils/catcache.h +0 -231
  831. data/ext/pg_query/include/utils/date.h +0 -90
  832. data/ext/pg_query/include/utils/datetime.h +0 -343
  833. data/ext/pg_query/include/utils/datum.h +0 -68
  834. data/ext/pg_query/include/utils/dsa.h +0 -123
  835. data/ext/pg_query/include/utils/dynahash.h +0 -19
  836. data/ext/pg_query/include/utils/elog.h +0 -439
  837. data/ext/pg_query/include/utils/errcodes.h +0 -352
  838. data/ext/pg_query/include/utils/expandeddatum.h +0 -159
  839. data/ext/pg_query/include/utils/expandedrecord.h +0 -231
  840. data/ext/pg_query/include/utils/float.h +0 -356
  841. data/ext/pg_query/include/utils/fmgroids.h +0 -2657
  842. data/ext/pg_query/include/utils/fmgrprotos.h +0 -2646
  843. data/ext/pg_query/include/utils/fmgrtab.h +0 -48
  844. data/ext/pg_query/include/utils/guc.h +0 -443
  845. data/ext/pg_query/include/utils/guc_tables.h +0 -272
  846. data/ext/pg_query/include/utils/hsearch.h +0 -149
  847. data/ext/pg_query/include/utils/inval.h +0 -65
  848. data/ext/pg_query/include/utils/lsyscache.h +0 -198
  849. data/ext/pg_query/include/utils/memdebug.h +0 -82
  850. data/ext/pg_query/include/utils/memutils.h +0 -225
  851. data/ext/pg_query/include/utils/numeric.h +0 -76
  852. data/ext/pg_query/include/utils/palloc.h +0 -136
  853. data/ext/pg_query/include/utils/partcache.h +0 -102
  854. data/ext/pg_query/include/utils/pg_locale.h +0 -119
  855. data/ext/pg_query/include/utils/pg_lsn.h +0 -29
  856. data/ext/pg_query/include/utils/pidfile.h +0 -56
  857. data/ext/pg_query/include/utils/plancache.h +0 -235
  858. data/ext/pg_query/include/utils/portal.h +0 -254
  859. data/ext/pg_query/include/utils/probes.h +0 -114
  860. data/ext/pg_query/include/utils/ps_status.h +0 -25
  861. data/ext/pg_query/include/utils/queryenvironment.h +0 -74
  862. data/ext/pg_query/include/utils/regproc.h +0 -28
  863. data/ext/pg_query/include/utils/rel.h +0 -643
  864. data/ext/pg_query/include/utils/relcache.h +0 -150
  865. data/ext/pg_query/include/utils/reltrigger.h +0 -81
  866. data/ext/pg_query/include/utils/resowner.h +0 -86
  867. data/ext/pg_query/include/utils/rls.h +0 -50
  868. data/ext/pg_query/include/utils/ruleutils.h +0 -44
  869. data/ext/pg_query/include/utils/sharedtuplestore.h +0 -61
  870. data/ext/pg_query/include/utils/snapmgr.h +0 -159
  871. data/ext/pg_query/include/utils/snapshot.h +0 -206
  872. data/ext/pg_query/include/utils/sortsupport.h +0 -276
  873. data/ext/pg_query/include/utils/syscache.h +0 -219
  874. data/ext/pg_query/include/utils/timeout.h +0 -88
  875. data/ext/pg_query/include/utils/timestamp.h +0 -116
  876. data/ext/pg_query/include/utils/tuplesort.h +0 -277
  877. data/ext/pg_query/include/utils/tuplestore.h +0 -91
  878. data/ext/pg_query/include/utils/typcache.h +0 -202
  879. data/ext/pg_query/include/utils/tzparser.h +0 -39
  880. data/ext/pg_query/include/utils/varlena.h +0 -39
  881. data/ext/pg_query/include/utils/xml.h +0 -84
  882. data/ext/pg_query/pg_query_ruby_freebsd.sym +0 -2
  883. data/ext/pg_query/src_backend_libpq_pqcomm.c +0 -659
  884. data/ext/pg_query/src_backend_parser_parse_expr.c +0 -313
  885. data/ext/pg_query/src_backend_postmaster_postmaster.c +0 -2230
  886. data/ext/pg_query/src_backend_storage_lmgr_s_lock.c +0 -370
  887. data/ext/pg_query/src_backend_utils_hash_dynahash.c +0 -1086
  888. data/ext/pg_query/src_backend_utils_misc_guc.c +0 -1832
  889. data/ext/pg_query/src_common_string.c +0 -86
  890. data/ext/pg_query/src_port_erand48.c +0 -127
  891. data/ext/pg_query/src_port_pgsleep.c +0 -69
  892. data/ext/pg_query/src_port_random.c +0 -31
  893. data/ext/pg_query/src_port_strnlen.c +0 -39
  894. /data/ext/pg_query/{pg_query_ruby.sym → ext_symbols.sym} +0 -0
  895. /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-2020, 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
  *
@@ -59,11 +73,116 @@
59
73
  #include "miscadmin.h"
60
74
  #include "utils/memdebug.h"
61
75
  #include "utils/memutils.h"
76
+ #include "utils/memutils_internal.h"
77
+ #include "utils/memutils_memorychunk.h"
62
78
 
63
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
+
64
85
  /*****************************************************************************
65
86
  * GLOBAL MEMORY *
66
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
67
186
 
68
187
  /*
69
188
  * CurrentMemoryContext
@@ -89,12 +208,15 @@ __thread MemoryContext ErrorContext = NULL;
89
208
  /* This is a transient link to the active portal's memory context: */
90
209
 
91
210
 
211
+ static void MemoryContextDeleteOnly(MemoryContext context);
92
212
  static void MemoryContextCallResetCallbacks(MemoryContext context);
93
213
  static void MemoryContextStatsInternal(MemoryContext context, int level,
94
- bool print, int max_children,
95
- MemoryContextCounters *totals);
214
+ int max_level, int max_children,
215
+ MemoryContextCounters *totals,
216
+ bool print_to_stderr);
96
217
  static void MemoryContextStatsPrint(MemoryContext context, void *passthru,
97
- const char *stats_string);
218
+ const char *stats_string,
219
+ bool print_to_stderr);
98
220
 
99
221
  /*
100
222
  * You should not do memory allocations within a critical section, because
@@ -104,6 +226,145 @@ static void MemoryContextStatsPrint(MemoryContext context, void *passthru,
104
226
  #define AssertNotInCriticalSection(context) \
105
227
  Assert(CritSectionCount == 0 || (context)->allowInCritSection)
106
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
+
367
+
107
368
  /*****************************************************************************
108
369
  * EXPORTED ROUTINES *
109
370
  *****************************************************************************/
@@ -128,7 +389,7 @@ static void MemoryContextStatsPrint(MemoryContext context, void *passthru,
128
389
  void
129
390
  MemoryContextInit(void)
130
391
  {
131
- AssertState(TopMemoryContext == NULL);
392
+ Assert(TopMemoryContext == NULL);
132
393
 
133
394
  /*
134
395
  * First, initialize TopMemoryContext, which is the parent of all others.
@@ -172,7 +433,7 @@ MemoryContextInit(void)
172
433
  void
173
434
  MemoryContextReset(MemoryContext context)
174
435
  {
175
- AssertArg(MemoryContextIsValid(context));
436
+ Assert(MemoryContextIsValid(context));
176
437
 
177
438
  /* save a function call in common case where there are no children */
178
439
  if (context->firstchild != NULL)
@@ -191,7 +452,7 @@ MemoryContextReset(MemoryContext context)
191
452
  void
192
453
  MemoryContextResetOnly(MemoryContext context)
193
454
  {
194
- AssertArg(MemoryContextIsValid(context));
455
+ Assert(MemoryContextIsValid(context));
195
456
 
196
457
  /* Nothing to do if no pallocs since startup or last reset */
197
458
  if (!context->isReset)
@@ -202,10 +463,8 @@ MemoryContextResetOnly(MemoryContext context)
202
463
  * If context->ident points into the context's memory, it will become
203
464
  * a dangling pointer. We could prevent that by setting it to NULL
204
465
  * here, but that would break valid coding patterns that keep the
205
- * ident elsewhere, e.g. in a parent context. Another idea is to use
206
- * MemoryContextContains(), but we don't require ident strings to be
207
- * in separately-palloc'd chunks, so that risks false positives. So
208
- * for now we assume the programmer got it right.
466
+ * ident elsewhere, e.g. in a parent context. So for now we assume
467
+ * the programmer got it right.
209
468
  */
210
469
 
211
470
  context->methods->reset(context);
@@ -229,21 +488,60 @@ MemoryContextResetOnly(MemoryContext context)
229
488
  * allocated therein.
230
489
  *
231
490
  * The type-specific delete routine removes all storage for the context,
232
- * but we have to recurse to handle the children.
233
- * We must also delink the context from its parent, if it has one.
491
+ * but we have to deal with descendant nodes here.
234
492
  */
235
493
  void
236
494
  MemoryContextDelete(MemoryContext context)
237
495
  {
238
- 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));
239
539
  /* We had better not be deleting TopMemoryContext ... */
240
540
  Assert(context != TopMemoryContext);
241
541
  /* And not CurrentMemoryContext, either */
242
542
  Assert(context != CurrentMemoryContext);
243
-
244
- /* save a function call in common case where there are no children */
245
- if (context->firstchild != NULL)
246
- MemoryContextDeleteChildren(context);
543
+ /* All the children should've been deleted already */
544
+ Assert(context->firstchild == NULL);
247
545
 
248
546
  /*
249
547
  * It's not entirely clear whether 'tis better to do this before or after
@@ -280,7 +578,7 @@ MemoryContextDelete(MemoryContext context)
280
578
  void
281
579
  MemoryContextDeleteChildren(MemoryContext context)
282
580
  {
283
- AssertArg(MemoryContextIsValid(context));
581
+ Assert(MemoryContextIsValid(context));
284
582
 
285
583
  /*
286
584
  * MemoryContextDelete will delink the child from me, so just iterate as
@@ -362,8 +660,8 @@ MemoryContextCallResetCallbacks(MemoryContext context)
362
660
  void
363
661
  MemoryContextSetParent(MemoryContext context, MemoryContext new_parent)
364
662
  {
365
- AssertArg(MemoryContextIsValid(context));
366
- AssertArg(context != new_parent);
663
+ Assert(MemoryContextIsValid(context));
664
+ Assert(context != new_parent);
367
665
 
368
666
  /* Fast path if it's got correct parent already */
369
667
  if (new_parent == context->parent)
@@ -389,7 +687,7 @@ MemoryContextSetParent(MemoryContext context, MemoryContext new_parent)
389
687
  /* And relink */
390
688
  if (new_parent)
391
689
  {
392
- AssertArg(MemoryContextIsValid(new_parent));
690
+ Assert(MemoryContextIsValid(new_parent));
393
691
  context->parent = new_parent;
394
692
  context->prevchild = NULL;
395
693
  context->nextchild = new_parent->firstchild;
@@ -419,11 +717,22 @@ MemoryContextSetParent(MemoryContext context, MemoryContext new_parent)
419
717
  void
420
718
  MemoryContextAllowInCriticalSection(MemoryContext context, bool allow)
421
719
  {
422
- AssertArg(MemoryContextIsValid(context));
720
+ Assert(MemoryContextIsValid(context));
423
721
 
424
722
  context->allowInCritSection = allow;
425
723
  }
426
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
+
427
736
  /*
428
737
  * GetMemoryChunkSpace
429
738
  * Given a currently-allocated chunk, determine the total space
@@ -432,7 +741,11 @@ MemoryContextAllowInCriticalSection(MemoryContext context, bool allow)
432
741
  * This is useful for measuring the total space occupied by a set of
433
742
  * allocated chunks.
434
743
  */
435
-
744
+ Size
745
+ GetMemoryChunkSpace(void *pointer)
746
+ {
747
+ return MCXT_METHOD(pointer, get_chunk_space) (pointer);
748
+ }
436
749
 
437
750
  /*
438
751
  * MemoryContextGetParent
@@ -452,6 +765,12 @@ MemoryContextAllowInCriticalSection(MemoryContext context, bool allow)
452
765
  */
453
766
 
454
767
 
768
+ /*
769
+ * Return the memory consumption statistics about the given context and its
770
+ * children.
771
+ */
772
+
773
+
455
774
  /*
456
775
  * MemoryContextStats
457
776
  * Print statistics about the named context and all its descendants.
@@ -463,93 +782,144 @@ MemoryContextAllowInCriticalSection(MemoryContext context, bool allow)
463
782
  void
464
783
  MemoryContextStats(MemoryContext context)
465
784
  {
466
- /* A hard-wired limit on the number of children is usually good enough */
467
- MemoryContextStatsDetail(context, 100);
785
+ /* Hard-wired limits are usually good enough */
786
+ MemoryContextStatsDetail(context, 100, 100, true);
468
787
  }
469
788
 
470
789
  /*
471
790
  * MemoryContextStatsDetail
472
791
  *
473
792
  * Entry point for use if you want to vary the number of child contexts shown.
793
+ *
794
+ * If print_to_stderr is true, print statistics about the memory contexts
795
+ * with fprintf(stderr), otherwise use ereport().
474
796
  */
475
797
  void
476
- MemoryContextStatsDetail(MemoryContext context, int max_children)
798
+ MemoryContextStatsDetail(MemoryContext context,
799
+ int max_level, int max_children,
800
+ bool print_to_stderr)
477
801
  {
478
802
  MemoryContextCounters grand_totals;
479
803
 
480
804
  memset(&grand_totals, 0, sizeof(grand_totals));
481
805
 
482
- MemoryContextStatsInternal(context, 0, true, max_children, &grand_totals);
806
+ MemoryContextStatsInternal(context, 0, max_level, max_children,
807
+ &grand_totals, print_to_stderr);
483
808
 
484
- fprintf(stderr,
485
- "Grand total: %zu bytes in %zd blocks; %zu free (%zd chunks); %zu used\n",
486
- grand_totals.totalspace, grand_totals.nblocks,
487
- grand_totals.freespace, grand_totals.freechunks,
488
- grand_totals.totalspace - grand_totals.freespace);
809
+ if (print_to_stderr)
810
+ fprintf(stderr,
811
+ "Grand total: %zu bytes in %zu blocks; %zu free (%zu chunks); %zu used\n",
812
+ grand_totals.totalspace, grand_totals.nblocks,
813
+ grand_totals.freespace, grand_totals.freechunks,
814
+ grand_totals.totalspace - grand_totals.freespace);
815
+ else
816
+ {
817
+ /*
818
+ * Use LOG_SERVER_ONLY to prevent the memory contexts from being sent
819
+ * to the connected client.
820
+ *
821
+ * We don't buffer the information about all memory contexts in a
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.
826
+ */
827
+ ereport(LOG_SERVER_ONLY,
828
+ (errhidestmt(true),
829
+ errhidecontext(true),
830
+ errmsg_internal("Grand total: %zu bytes in %zu blocks; %zu free (%zu chunks); %zu used",
831
+ grand_totals.totalspace, grand_totals.nblocks,
832
+ grand_totals.freespace, grand_totals.freechunks,
833
+ grand_totals.totalspace - grand_totals.freespace)));
834
+ }
489
835
  }
490
836
 
491
837
  /*
492
838
  * MemoryContextStatsInternal
493
839
  * One recursion level for MemoryContextStats
494
840
  *
495
- * Print this context if print is true, but in any case accumulate counts into
496
- * *totals (if given).
841
+ * Print stats for this context if possible, but in any case accumulate counts
842
+ * into *totals (if not NULL).
497
843
  */
498
844
  static void
499
845
  MemoryContextStatsInternal(MemoryContext context, int level,
500
- bool print, int max_children,
501
- MemoryContextCounters *totals)
846
+ int max_level, int max_children,
847
+ MemoryContextCounters *totals,
848
+ bool print_to_stderr)
502
849
  {
503
- MemoryContextCounters local_totals;
504
850
  MemoryContext child;
505
851
  int ichild;
506
852
 
507
- AssertArg(MemoryContextIsValid(context));
853
+ Assert(MemoryContextIsValid(context));
508
854
 
509
855
  /* Examine the context itself */
510
856
  context->methods->stats(context,
511
- print ? MemoryContextStatsPrint : NULL,
857
+ MemoryContextStatsPrint,
512
858
  (void *) &level,
513
- totals);
859
+ totals, print_to_stderr);
514
860
 
515
861
  /*
516
- * Examine children. If there are more than max_children of them, we do
517
- * 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.
518
868
  */
519
- memset(&local_totals, 0, sizeof(local_totals));
520
-
521
- for (child = context->firstchild, ichild = 0;
522
- child != NULL;
523
- child = child->nextchild, ichild++)
869
+ child = context->firstchild;
870
+ ichild = 0;
871
+ if (level < max_level && !stack_is_too_deep())
524
872
  {
525
- if (ichild < max_children)
526
- MemoryContextStatsInternal(child, level + 1,
527
- print, max_children,
528
- totals);
529
- else
873
+ for (; child != NULL && ichild < max_children;
874
+ child = child->nextchild, ichild++)
875
+ {
530
876
  MemoryContextStatsInternal(child, level + 1,
531
- false, max_children,
532
- &local_totals);
877
+ max_level, max_children,
878
+ totals,
879
+ print_to_stderr);
880
+ }
533
881
  }
534
882
 
535
- /* Deal with excess children */
536
- if (ichild > max_children)
883
+ if (child != NULL)
537
884
  {
538
- 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)
539
892
  {
540
- int i;
893
+ child->methods->stats(child, NULL, NULL, &local_totals, false);
894
+ ichild++;
895
+ child = MemoryContextTraverseNext(child, context);
896
+ }
541
897
 
542
- for (i = 0; i <= level; i++)
898
+ if (print_to_stderr)
899
+ {
900
+ for (int i = 0; i <= level; i++)
543
901
  fprintf(stderr, " ");
544
902
  fprintf(stderr,
545
- "%d more child contexts containing %zu total in %zd blocks; %zu free (%zd chunks); %zu used\n",
546
- ichild - max_children,
903
+ "%d more child contexts containing %zu total in %zu blocks; %zu free (%zu chunks); %zu used\n",
904
+ ichild,
547
905
  local_totals.totalspace,
548
906
  local_totals.nblocks,
549
907
  local_totals.freespace,
550
908
  local_totals.freechunks,
551
909
  local_totals.totalspace - local_totals.freespace);
552
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)));
553
923
 
554
924
  if (totals)
555
925
  {
@@ -570,11 +940,13 @@ MemoryContextStatsInternal(MemoryContext context, int level,
570
940
  */
571
941
  static void
572
942
  MemoryContextStatsPrint(MemoryContext context, void *passthru,
573
- const char *stats_string)
943
+ const char *stats_string,
944
+ bool print_to_stderr)
574
945
  {
575
946
  int level = *(int *) passthru;
576
947
  const char *name = context->name;
577
948
  const char *ident = context->ident;
949
+ char truncated_ident[110];
578
950
  int i;
579
951
 
580
952
  /*
@@ -588,9 +960,8 @@ MemoryContextStatsPrint(MemoryContext context, void *passthru,
588
960
  ident = NULL;
589
961
  }
590
962
 
591
- for (i = 0; i < level; i++)
592
- fprintf(stderr, " ");
593
- fprintf(stderr, "%s: %s", name, stats_string);
963
+ truncated_ident[0] = '\0';
964
+
594
965
  if (ident)
595
966
  {
596
967
  /*
@@ -602,29 +973,46 @@ MemoryContextStatsPrint(MemoryContext context, void *passthru,
602
973
  int idlen = strlen(ident);
603
974
  bool truncated = false;
604
975
 
976
+ strcpy(truncated_ident, ": ");
977
+ i = strlen(truncated_ident);
978
+
605
979
  if (idlen > 100)
606
980
  {
607
981
  idlen = pg_mbcliplen(ident, idlen, 100);
608
982
  truncated = true;
609
983
  }
610
- fprintf(stderr, ": ");
984
+
611
985
  while (idlen-- > 0)
612
986
  {
613
987
  unsigned char c = *ident++;
614
988
 
615
989
  if (c < ' ')
616
990
  c = ' ';
617
- fputc(c, stderr);
991
+ truncated_ident[i++] = c;
618
992
  }
993
+ truncated_ident[i] = '\0';
994
+
619
995
  if (truncated)
620
- fprintf(stderr, "...");
996
+ strcat(truncated_ident, "...");
997
+ }
998
+
999
+ if (print_to_stderr)
1000
+ {
1001
+ for (i = 0; i < level; i++)
1002
+ fprintf(stderr, " ");
1003
+ fprintf(stderr, "%s: %s%s\n", name, stats_string, truncated_ident);
621
1004
  }
622
- fputc('\n', stderr);
1005
+ else
1006
+ ereport(LOG_SERVER_ONLY,
1007
+ (errhidestmt(true),
1008
+ errhidecontext(true),
1009
+ errmsg_internal("level: %d; %s: %s%s",
1010
+ level, name, stats_string, truncated_ident)));
623
1011
  }
624
1012
 
625
1013
  /*
626
1014
  * MemoryContextCheck
627
- * Check all chunks in the named context.
1015
+ * Check all chunks in the named context and its children.
628
1016
  *
629
1017
  * This is just a debugging utility, so it's not fancy.
630
1018
  */
@@ -632,19 +1020,6 @@ MemoryContextStatsPrint(MemoryContext context, void *passthru,
632
1020
 
633
1021
  #endif
634
1022
 
635
- /*
636
- * MemoryContextContains
637
- * Detect whether an allocated chunk of memory belongs to a given
638
- * context or not.
639
- *
640
- * Caution: this test is reliable as long as 'pointer' does point to
641
- * a chunk of memory allocated from *some* context. If 'pointer' points
642
- * at memory obtained in some other way, there is a small chance of a
643
- * false-positive result, since the bits right before it might look like
644
- * a valid chunk header by chance.
645
- */
646
-
647
-
648
1023
  /*
649
1024
  * MemoryContextCreate
650
1025
  * Context-type-independent part of context creation.
@@ -670,7 +1045,7 @@ MemoryContextStatsPrint(MemoryContext context, void *passthru,
670
1045
  *
671
1046
  * node: the as-yet-uninitialized common part of the context header node.
672
1047
  * tag: NodeTag code identifying the memory context type.
673
- * methods: context-type-specific methods (usually statically allocated).
1048
+ * method_id: MemoryContextMethodID of the context-type being created.
674
1049
  * parent: parent context, or NULL if this will be a top-level context.
675
1050
  * name: name of context (must be statically allocated).
676
1051
  *
@@ -680,7 +1055,7 @@ MemoryContextStatsPrint(MemoryContext context, void *passthru,
680
1055
  void
681
1056
  MemoryContextCreate(MemoryContext node,
682
1057
  NodeTag tag,
683
- const MemoryContextMethods *methods,
1058
+ MemoryContextMethodID method_id,
684
1059
  MemoryContext parent,
685
1060
  const char *name)
686
1061
  {
@@ -690,7 +1065,7 @@ MemoryContextCreate(MemoryContext node,
690
1065
  /* Initialize all standard fields of memory context header */
691
1066
  node->type = tag;
692
1067
  node->isReset = true;
693
- node->methods = methods;
1068
+ node->methods = &mcxt_methods[method_id];
694
1069
  node->parent = parent;
695
1070
  node->firstchild = NULL;
696
1071
  node->mem_allocated = 0;
@@ -719,120 +1094,93 @@ MemoryContextCreate(MemoryContext node,
719
1094
  }
720
1095
 
721
1096
  /*
722
- * MemoryContextAlloc
723
- * Allocate space within the specified context.
724
- *
725
- * This could be turned into a macro, but we'd have to import
726
- * nodes/memnodes.h into postgres.h which seems a bad idea.
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'.
727
1101
  */
728
1102
  void *
729
- MemoryContextAlloc(MemoryContext context, Size size)
1103
+ MemoryContextAllocationFailure(MemoryContext context, Size size, int flags)
730
1104
  {
731
- void *ret;
732
-
733
- AssertArg(MemoryContextIsValid(context));
734
- AssertNotInCriticalSection(context);
735
-
736
- if (!AllocSizeIsValid(size))
737
- elog(ERROR, "invalid memory alloc request size %zu", size);
738
-
739
- context->isReset = false;
740
-
741
- ret = context->methods->alloc(context, size);
742
- if (unlikely(ret == NULL))
1105
+ if ((flags & MCXT_ALLOC_NO_OOM) == 0)
743
1106
  {
744
1107
  MemoryContextStats(TopMemoryContext);
745
-
746
- /*
747
- * Here, and elsewhere in this module, we show the target context's
748
- * "name" but not its "ident" (if any) in user-visible error messages.
749
- * The "ident" string might contain security-sensitive data, such as
750
- * values in SQL commands.
751
- */
752
1108
  ereport(ERROR,
753
1109
  (errcode(ERRCODE_OUT_OF_MEMORY),
754
1110
  errmsg("out of memory"),
755
1111
  errdetail("Failed on request of size %zu in memory context \"%s\".",
756
1112
  size, context->name)));
757
1113
  }
1114
+ return NULL;
1115
+ }
758
1116
 
759
- VALGRIND_MEMPOOL_ALLOC(context, ret, size);
760
-
761
- 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);
762
1126
  }
763
1127
 
764
1128
  /*
765
- * MemoryContextAllocZero
766
- * Like MemoryContextAlloc, but clears allocated memory
1129
+ * MemoryContextAlloc
1130
+ * Allocate space within the specified context.
767
1131
  *
768
- * We could just call MemoryContextAlloc then clear the memory, but this
769
- * 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.
770
1134
  */
771
1135
  void *
772
- MemoryContextAllocZero(MemoryContext context, Size size)
1136
+ MemoryContextAlloc(MemoryContext context, Size size)
773
1137
  {
774
1138
  void *ret;
775
1139
 
776
- AssertArg(MemoryContextIsValid(context));
1140
+ Assert(MemoryContextIsValid(context));
777
1141
  AssertNotInCriticalSection(context);
778
1142
 
779
- if (!AllocSizeIsValid(size))
780
- elog(ERROR, "invalid memory alloc request size %zu", size);
781
-
782
1143
  context->isReset = false;
783
1144
 
784
- ret = context->methods->alloc(context, size);
785
- if (unlikely(ret == NULL))
786
- {
787
- MemoryContextStats(TopMemoryContext);
788
- ereport(ERROR,
789
- (errcode(ERRCODE_OUT_OF_MEMORY),
790
- errmsg("out of memory"),
791
- errdetail("Failed on request of size %zu in memory context \"%s\".",
792
- size, context->name)));
793
- }
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);
794
1156
 
795
1157
  VALGRIND_MEMPOOL_ALLOC(context, ret, size);
796
1158
 
797
- MemSetAligned(ret, 0, size);
798
-
799
1159
  return ret;
800
1160
  }
801
1161
 
802
1162
  /*
803
- * MemoryContextAllocZeroAligned
804
- * MemoryContextAllocZero where length is suitable for MemSetLoop
1163
+ * MemoryContextAllocZero
1164
+ * Like MemoryContextAlloc, but clears allocated memory
805
1165
  *
806
- * This might seem overly specialized, but it's not because newNode()
807
- * 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.
808
1168
  */
809
1169
  void *
810
- MemoryContextAllocZeroAligned(MemoryContext context, Size size)
1170
+ MemoryContextAllocZero(MemoryContext context, Size size)
811
1171
  {
812
1172
  void *ret;
813
1173
 
814
- AssertArg(MemoryContextIsValid(context));
1174
+ Assert(MemoryContextIsValid(context));
815
1175
  AssertNotInCriticalSection(context);
816
1176
 
817
- if (!AllocSizeIsValid(size))
818
- elog(ERROR, "invalid memory alloc request size %zu", size);
819
-
820
1177
  context->isReset = false;
821
1178
 
822
- ret = context->methods->alloc(context, size);
823
- if (unlikely(ret == NULL))
824
- {
825
- MemoryContextStats(TopMemoryContext);
826
- ereport(ERROR,
827
- (errcode(ERRCODE_OUT_OF_MEMORY),
828
- errmsg("out of memory"),
829
- errdetail("Failed on request of size %zu in memory context \"%s\".",
830
- size, context->name)));
831
- }
1179
+ ret = context->methods->alloc(context, size, 0);
832
1180
 
833
1181
  VALGRIND_MEMPOOL_ALLOC(context, ret, size);
834
1182
 
835
- MemSetLoop(ret, 0, size);
1183
+ MemSetAligned(ret, 0, size);
836
1184
 
837
1185
  return ret;
838
1186
  }
@@ -846,29 +1194,18 @@ MemoryContextAllocExtended(MemoryContext context, Size size, int flags)
846
1194
  {
847
1195
  void *ret;
848
1196
 
849
- AssertArg(MemoryContextIsValid(context));
1197
+ Assert(MemoryContextIsValid(context));
850
1198
  AssertNotInCriticalSection(context);
851
1199
 
852
- if (((flags & MCXT_ALLOC_HUGE) != 0 && !AllocHugeSizeIsValid(size)) ||
853
- ((flags & MCXT_ALLOC_HUGE) == 0 && !AllocSizeIsValid(size)))
1200
+ if (!((flags & MCXT_ALLOC_HUGE) != 0 ? AllocHugeSizeIsValid(size) :
1201
+ AllocSizeIsValid(size)))
854
1202
  elog(ERROR, "invalid memory alloc request size %zu", size);
855
1203
 
856
1204
  context->isReset = false;
857
1205
 
858
- ret = context->methods->alloc(context, size);
1206
+ ret = context->methods->alloc(context, size, flags);
859
1207
  if (unlikely(ret == NULL))
860
- {
861
- if ((flags & MCXT_ALLOC_NO_OOM) == 0)
862
- {
863
- MemoryContextStats(TopMemoryContext);
864
- ereport(ERROR,
865
- (errcode(ERRCODE_OUT_OF_MEMORY),
866
- errmsg("out of memory"),
867
- errdetail("Failed on request of size %zu in memory context \"%s\".",
868
- size, context->name)));
869
- }
870
1208
  return NULL;
871
- }
872
1209
 
873
1210
  VALGRIND_MEMPOOL_ALLOC(context, ret, size);
874
1211
 
@@ -878,6 +1215,27 @@ MemoryContextAllocExtended(MemoryContext context, Size size, int flags)
878
1215
  return ret;
879
1216
  }
880
1217
 
1218
+ /*
1219
+ * HandleLogMemoryContextInterrupt
1220
+ * Handle receipt of an interrupt indicating logging of memory
1221
+ * contexts.
1222
+ *
1223
+ * All the actual work is deferred to ProcessLogMemoryContextInterrupt(),
1224
+ * because we cannot safely emit a log message inside the signal handler.
1225
+ */
1226
+
1227
+
1228
+ /*
1229
+ * ProcessLogMemoryContextInterrupt
1230
+ * Perform logging of memory contexts of this backend process.
1231
+ *
1232
+ * Any backend that participates in ProcSignal signaling must arrange
1233
+ * to call this function if we see LogMemoryContextPending set.
1234
+ * It is called from CHECK_FOR_INTERRUPTS(), which is enough because
1235
+ * the target process for logging of memory contexts is a backend.
1236
+ */
1237
+
1238
+
881
1239
  void *
882
1240
  palloc(Size size)
883
1241
  {
@@ -885,25 +1243,24 @@ palloc(Size size)
885
1243
  void *ret;
886
1244
  MemoryContext context = CurrentMemoryContext;
887
1245
 
888
- AssertArg(MemoryContextIsValid(context));
1246
+ Assert(MemoryContextIsValid(context));
889
1247
  AssertNotInCriticalSection(context);
890
1248
 
891
- if (!AllocSizeIsValid(size))
892
- elog(ERROR, "invalid memory alloc request size %zu", size);
893
-
894
1249
  context->isReset = false;
895
1250
 
896
- ret = context->methods->alloc(context, size);
897
- if (unlikely(ret == NULL))
898
- {
899
- MemoryContextStats(TopMemoryContext);
900
- ereport(ERROR,
901
- (errcode(ERRCODE_OUT_OF_MEMORY),
902
- errmsg("out of memory"),
903
- errdetail("Failed on request of size %zu in memory context \"%s\".",
904
- size, context->name)));
905
- }
906
-
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);
907
1264
  VALGRIND_MEMPOOL_ALLOC(context, ret, size);
908
1265
 
909
1266
  return ret;
@@ -916,24 +1273,12 @@ palloc0(Size size)
916
1273
  void *ret;
917
1274
  MemoryContext context = CurrentMemoryContext;
918
1275
 
919
- AssertArg(MemoryContextIsValid(context));
1276
+ Assert(MemoryContextIsValid(context));
920
1277
  AssertNotInCriticalSection(context);
921
1278
 
922
- if (!AllocSizeIsValid(size))
923
- elog(ERROR, "invalid memory alloc request size %zu", size);
924
-
925
1279
  context->isReset = false;
926
1280
 
927
- ret = context->methods->alloc(context, size);
928
- if (unlikely(ret == NULL))
929
- {
930
- MemoryContextStats(TopMemoryContext);
931
- ereport(ERROR,
932
- (errcode(ERRCODE_OUT_OF_MEMORY),
933
- errmsg("out of memory"),
934
- errdetail("Failed on request of size %zu in memory context \"%s\".",
935
- size, context->name)));
936
- }
1281
+ ret = context->methods->alloc(context, size, 0);
937
1282
 
938
1283
  VALGRIND_MEMPOOL_ALLOC(context, ret, size);
939
1284
 
@@ -944,6 +1289,125 @@ palloc0(Size size)
944
1289
 
945
1290
 
946
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
+
947
1411
  /*
948
1412
  * pfree
949
1413
  * Release an allocated chunk.
@@ -951,10 +1415,17 @@ palloc0(Size size)
951
1415
  void
952
1416
  pfree(void *pointer)
953
1417
  {
1418
+ #ifdef USE_VALGRIND
1419
+ MemoryContextMethodID method = GetMemoryChunkMethodID(pointer);
954
1420
  MemoryContext context = GetMemoryChunkContext(pointer);
1421
+ #endif
955
1422
 
956
- context->methods->free_p(context, pointer);
957
- VALGRIND_MEMPOOL_FREE(context, pointer);
1423
+ MCXT_METHOD(pointer, free_p) (pointer);
1424
+
1425
+ #ifdef USE_VALGRIND
1426
+ if (method != MCTX_ALIGNED_REDIRECT_ID)
1427
+ VALGRIND_MEMPOOL_FREE(context, pointer);
1428
+ #endif
958
1429
  }
959
1430
 
960
1431
  /*
@@ -964,33 +1435,54 @@ pfree(void *pointer)
964
1435
  void *
965
1436
  repalloc(void *pointer, Size size)
966
1437
  {
1438
+ #ifdef USE_VALGRIND
1439
+ MemoryContextMethodID method = GetMemoryChunkMethodID(pointer);
1440
+ #endif
1441
+ #if defined(USE_ASSERT_CHECKING) || defined(USE_VALGRIND)
967
1442
  MemoryContext context = GetMemoryChunkContext(pointer);
1443
+ #endif
968
1444
  void *ret;
969
1445
 
970
- if (!AllocSizeIsValid(size))
971
- elog(ERROR, "invalid memory alloc request size %zu", size);
972
-
973
1446
  AssertNotInCriticalSection(context);
974
1447
 
975
1448
  /* isReset must be false already */
976
1449
  Assert(!context->isReset);
977
1450
 
978
- ret = context->methods->realloc(context, pointer, size);
979
- if (unlikely(ret == NULL))
980
- {
981
- MemoryContextStats(TopMemoryContext);
982
- ereport(ERROR,
983
- (errcode(ERRCODE_OUT_OF_MEMORY),
984
- errmsg("out of memory"),
985
- errdetail("Failed on request of size %zu in memory context \"%s\".",
986
- size, context->name)));
987
- }
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);
988
1462
 
989
- 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
990
1467
 
991
1468
  return ret;
992
1469
  }
993
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
+
994
1486
  /*
995
1487
  * MemoryContextAllocHuge
996
1488
  * Allocate (possibly-expansive) space within the specified context.