pg_query 5.1.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 (490) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +30 -0
  3. data/README.md +1 -1
  4. data/Rakefile +4 -4
  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 +20 -6
  11. data/ext/pg_query/include/pg_query.h +4 -3
  12. data/ext/pg_query/include/pg_query_enum_defs.c +424 -154
  13. data/ext/pg_query/include/pg_query_fingerprint_conds.c +68 -4
  14. data/ext/pg_query/include/pg_query_fingerprint_defs.c +2952 -1845
  15. data/ext/pg_query/include/pg_query_outfuncs_conds.c +51 -3
  16. data/ext/pg_query/include/pg_query_outfuncs_defs.c +210 -23
  17. data/ext/pg_query/include/pg_query_readfuncs_conds.c +17 -1
  18. data/ext/pg_query/include/pg_query_readfuncs_defs.c +271 -52
  19. data/ext/pg_query/include/postgres/access/amapi.h +14 -3
  20. data/ext/pg_query/include/postgres/access/attmap.h +1 -1
  21. data/ext/pg_query/include/postgres/access/attnum.h +1 -1
  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 +2 -3
  25. data/ext/pg_query/include/postgres/access/commit_ts.h +2 -3
  26. data/ext/pg_query/include/postgres/access/detoast.h +1 -1
  27. data/ext/pg_query/include/postgres/access/genam.h +17 -4
  28. data/ext/pg_query/include/postgres/access/gin.h +1 -1
  29. data/ext/pg_query/include/postgres/access/htup.h +1 -1
  30. data/ext/pg_query/include/postgres/access/htup_details.h +11 -11
  31. data/ext/pg_query/include/postgres/access/itup.h +3 -3
  32. data/ext/pg_query/include/postgres/access/parallel.h +1 -2
  33. data/ext/pg_query/include/postgres/access/printtup.h +1 -1
  34. data/ext/pg_query/include/postgres/access/relation.h +1 -1
  35. data/ext/pg_query/include/postgres/access/relscan.h +1 -1
  36. data/ext/pg_query/include/postgres/access/rmgrlist.h +1 -1
  37. data/ext/pg_query/include/postgres/access/sdir.h +1 -1
  38. data/ext/pg_query/include/postgres/access/skey.h +1 -1
  39. data/ext/pg_query/include/postgres/access/slru.h +218 -0
  40. data/ext/pg_query/include/postgres/access/stratnum.h +1 -1
  41. data/ext/pg_query/include/postgres/access/sysattr.h +1 -1
  42. data/ext/pg_query/include/postgres/access/table.h +1 -1
  43. data/ext/pg_query/include/postgres/access/tableam.h +35 -25
  44. data/ext/pg_query/include/postgres/access/tidstore.h +50 -0
  45. data/ext/pg_query/include/postgres/access/toast_compression.h +2 -2
  46. data/ext/pg_query/include/postgres/access/transam.h +50 -7
  47. data/ext/pg_query/include/postgres/access/tsmapi.h +1 -1
  48. data/ext/pg_query/include/postgres/access/tupconvert.h +1 -1
  49. data/ext/pg_query/include/postgres/access/tupdesc.h +5 -5
  50. data/ext/pg_query/include/postgres/access/tupmacs.h +1 -1
  51. data/ext/pg_query/include/postgres/access/twophase.h +2 -2
  52. data/ext/pg_query/include/postgres/access/xact.h +5 -5
  53. data/ext/pg_query/include/postgres/access/xlog.h +20 -12
  54. data/ext/pg_query/include/postgres/access/xlog_internal.h +4 -3
  55. data/ext/pg_query/include/postgres/access/xlogbackup.h +3 -1
  56. data/ext/pg_query/include/postgres/access/xlogdefs.h +5 -5
  57. data/ext/pg_query/include/postgres/access/xlogprefetcher.h +2 -2
  58. data/ext/pg_query/include/postgres/access/xlogreader.h +2 -2
  59. data/ext/pg_query/include/postgres/access/xlogrecord.h +3 -3
  60. data/ext/pg_query/include/postgres/access/xlogrecovery.h +4 -4
  61. data/ext/pg_query/include/postgres/archive/archive_module.h +9 -1
  62. data/ext/pg_query/include/postgres/c.h +32 -37
  63. data/ext/pg_query/include/postgres/catalog/catalog.h +3 -1
  64. data/ext/pg_query/include/postgres/catalog/catversion.h +2 -2
  65. data/ext/pg_query/include/postgres/catalog/dependency.h +17 -59
  66. data/ext/pg_query/include/postgres/catalog/genbki.h +12 -6
  67. data/ext/pg_query/include/postgres/catalog/index.h +22 -18
  68. data/ext/pg_query/include/postgres/catalog/indexing.h +1 -1
  69. data/ext/pg_query/include/postgres/catalog/namespace.h +18 -19
  70. data/ext/pg_query/include/postgres/catalog/objectaccess.h +2 -2
  71. data/ext/pg_query/include/postgres/catalog/objectaddress.h +5 -1
  72. data/ext/pg_query/include/postgres/catalog/pg_aggregate.h +4 -2
  73. data/ext/pg_query/include/postgres/catalog/pg_aggregate_d.h +1 -1
  74. data/ext/pg_query/include/postgres/catalog/pg_am.h +6 -3
  75. data/ext/pg_query/include/postgres/catalog/pg_am_d.h +1 -1
  76. data/ext/pg_query/include/postgres/catalog/pg_attribute.h +31 -14
  77. data/ext/pg_query/include/postgres/catalog/pg_attribute_d.h +3 -3
  78. data/ext/pg_query/include/postgres/catalog/pg_authid.h +6 -3
  79. data/ext/pg_query/include/postgres/catalog/pg_authid_d.h +2 -1
  80. data/ext/pg_query/include/postgres/catalog/pg_class.h +10 -5
  81. data/ext/pg_query/include/postgres/catalog/pg_class_d.h +4 -2
  82. data/ext/pg_query/include/postgres/catalog/pg_collation.h +11 -5
  83. data/ext/pg_query/include/postgres/catalog/pg_collation_d.h +5 -2
  84. data/ext/pg_query/include/postgres/catalog/pg_constraint.h +15 -10
  85. data/ext/pg_query/include/postgres/catalog/pg_constraint_d.h +2 -1
  86. data/ext/pg_query/include/postgres/catalog/pg_control.h +5 -3
  87. data/ext/pg_query/include/postgres/catalog/pg_conversion.h +8 -4
  88. data/ext/pg_query/include/postgres/catalog/pg_conversion_d.h +1 -1
  89. data/ext/pg_query/include/postgres/catalog/pg_database.h +9 -4
  90. data/ext/pg_query/include/postgres/catalog/pg_database_d.h +13 -12
  91. data/ext/pg_query/include/postgres/catalog/pg_depend.h +3 -3
  92. data/ext/pg_query/include/postgres/catalog/pg_depend_d.h +1 -1
  93. data/ext/pg_query/include/postgres/catalog/pg_event_trigger.h +6 -3
  94. data/ext/pg_query/include/postgres/catalog/pg_event_trigger_d.h +1 -1
  95. data/ext/pg_query/include/postgres/catalog/pg_index.h +5 -3
  96. data/ext/pg_query/include/postgres/catalog/pg_index_d.h +1 -1
  97. data/ext/pg_query/include/postgres/catalog/pg_language.h +6 -3
  98. data/ext/pg_query/include/postgres/catalog/pg_language_d.h +1 -1
  99. data/ext/pg_query/include/postgres/catalog/pg_namespace.h +6 -3
  100. data/ext/pg_query/include/postgres/catalog/pg_namespace_d.h +1 -1
  101. data/ext/pg_query/include/postgres/catalog/pg_opclass.h +6 -3
  102. data/ext/pg_query/include/postgres/catalog/pg_opclass_d.h +1 -1
  103. data/ext/pg_query/include/postgres/catalog/pg_operator.h +20 -3
  104. data/ext/pg_query/include/postgres/catalog/pg_operator_d.h +1 -1
  105. data/ext/pg_query/include/postgres/catalog/pg_opfamily.h +6 -3
  106. data/ext/pg_query/include/postgres/catalog/pg_opfamily_d.h +1 -1
  107. data/ext/pg_query/include/postgres/catalog/pg_partitioned_table.h +4 -2
  108. data/ext/pg_query/include/postgres/catalog/pg_partitioned_table_d.h +1 -1
  109. data/ext/pg_query/include/postgres/catalog/pg_proc.h +6 -3
  110. data/ext/pg_query/include/postgres/catalog/pg_proc_d.h +1 -1
  111. data/ext/pg_query/include/postgres/catalog/pg_publication.h +6 -3
  112. data/ext/pg_query/include/postgres/catalog/pg_publication_d.h +1 -1
  113. data/ext/pg_query/include/postgres/catalog/pg_replication_origin.h +6 -3
  114. data/ext/pg_query/include/postgres/catalog/pg_replication_origin_d.h +1 -1
  115. data/ext/pg_query/include/postgres/catalog/pg_statistic.h +10 -4
  116. data/ext/pg_query/include/postgres/catalog/pg_statistic_d.h +7 -3
  117. data/ext/pg_query/include/postgres/catalog/pg_statistic_ext.h +10 -7
  118. data/ext/pg_query/include/postgres/catalog/pg_statistic_ext_d.h +3 -3
  119. data/ext/pg_query/include/postgres/catalog/pg_transform.h +6 -3
  120. data/ext/pg_query/include/postgres/catalog/pg_transform_d.h +1 -1
  121. data/ext/pg_query/include/postgres/catalog/pg_trigger.h +4 -4
  122. data/ext/pg_query/include/postgres/catalog/pg_trigger_d.h +1 -1
  123. data/ext/pg_query/include/postgres/catalog/pg_ts_config.h +6 -3
  124. data/ext/pg_query/include/postgres/catalog/pg_ts_config_d.h +1 -1
  125. data/ext/pg_query/include/postgres/catalog/pg_ts_dict.h +6 -3
  126. data/ext/pg_query/include/postgres/catalog/pg_ts_dict_d.h +1 -1
  127. data/ext/pg_query/include/postgres/catalog/pg_ts_parser.h +6 -3
  128. data/ext/pg_query/include/postgres/catalog/pg_ts_parser_d.h +1 -1
  129. data/ext/pg_query/include/postgres/catalog/pg_ts_template.h +6 -3
  130. data/ext/pg_query/include/postgres/catalog/pg_ts_template_d.h +1 -1
  131. data/ext/pg_query/include/postgres/catalog/pg_type.h +6 -3
  132. data/ext/pg_query/include/postgres/catalog/pg_type_d.h +1 -1
  133. data/ext/pg_query/include/postgres/catalog/storage.h +1 -1
  134. data/ext/pg_query/include/postgres/catalog/syscache_ids.h +104 -0
  135. data/ext/pg_query/include/postgres/commands/async.h +2 -6
  136. data/ext/pg_query/include/postgres/commands/dbcommands.h +1 -1
  137. data/ext/pg_query/include/postgres/commands/defrem.h +6 -6
  138. data/ext/pg_query/include/postgres/commands/event_trigger.h +11 -2
  139. data/ext/pg_query/include/postgres/commands/explain.h +19 -3
  140. data/ext/pg_query/include/postgres/commands/prepare.h +1 -1
  141. data/ext/pg_query/include/postgres/commands/tablespace.h +1 -1
  142. data/ext/pg_query/include/postgres/commands/trigger.h +1 -1
  143. data/ext/pg_query/include/postgres/commands/vacuum.h +28 -26
  144. data/ext/pg_query/include/postgres/common/cryptohash.h +2 -2
  145. data/ext/pg_query/include/postgres/common/file_perm.h +1 -1
  146. data/ext/pg_query/include/postgres/common/file_utils.h +65 -0
  147. data/ext/pg_query/include/postgres/common/hashfn.h +16 -1
  148. data/ext/pg_query/include/postgres/common/hashfn_unstable.h +407 -0
  149. data/ext/pg_query/include/postgres/common/int.h +79 -4
  150. data/ext/pg_query/include/postgres/common/keywords.h +1 -1
  151. data/ext/pg_query/include/postgres/common/kwlookup.h +1 -1
  152. data/ext/pg_query/include/postgres/common/pg_prng.h +2 -1
  153. data/ext/pg_query/include/postgres/common/relpath.h +4 -4
  154. data/ext/pg_query/include/postgres/common/scram-common.h +1 -1
  155. data/ext/pg_query/include/postgres/common/sha2.h +1 -1
  156. data/ext/pg_query/include/postgres/common/string.h +1 -1
  157. data/ext/pg_query/include/postgres/common/unicode_east_asian_fw_table.h +2 -3
  158. data/ext/pg_query/include/postgres/copyfuncs.funcs.c +278 -30
  159. data/ext/pg_query/include/postgres/copyfuncs.switch.c +55 -4
  160. data/ext/pg_query/include/postgres/datatype/timestamp.h +29 -3
  161. data/ext/pg_query/include/postgres/equalfuncs.funcs.c +239 -26
  162. data/ext/pg_query/include/postgres/equalfuncs.switch.c +55 -4
  163. data/ext/pg_query/include/postgres/executor/execdesc.h +2 -2
  164. data/ext/pg_query/include/postgres/executor/executor.h +6 -5
  165. data/ext/pg_query/include/postgres/executor/functions.h +2 -1
  166. data/ext/pg_query/include/postgres/executor/instrument.h +5 -3
  167. data/ext/pg_query/include/postgres/executor/spi.h +2 -8
  168. data/ext/pg_query/include/postgres/executor/tablefunc.h +1 -1
  169. data/ext/pg_query/include/postgres/executor/tuptable.h +31 -2
  170. data/ext/pg_query/include/postgres/fmgr.h +2 -2
  171. data/ext/pg_query/include/postgres/foreign/fdwapi.h +1 -1
  172. data/ext/pg_query/include/postgres/funcapi.h +2 -2
  173. data/ext/pg_query/include/postgres/gram.h +871 -830
  174. data/ext/pg_query/include/postgres/gramparse.h +1 -1
  175. data/ext/pg_query/include/postgres/jit/jit.h +4 -3
  176. data/ext/pg_query/include/postgres/kwlist_d.h +511 -466
  177. data/ext/pg_query/include/postgres/lib/dshash.h +25 -10
  178. data/ext/pg_query/include/postgres/lib/ilist.h +1 -1
  179. data/ext/pg_query/include/postgres/lib/pairingheap.h +1 -1
  180. data/ext/pg_query/include/postgres/lib/simplehash.h +40 -18
  181. data/ext/pg_query/include/postgres/lib/sort_template.h +14 -1
  182. data/ext/pg_query/include/postgres/lib/stringinfo.h +93 -11
  183. data/ext/pg_query/include/postgres/libpq/auth.h +1 -1
  184. data/ext/pg_query/include/postgres/libpq/crypt.h +2 -2
  185. data/ext/pg_query/include/postgres/libpq/hba.h +4 -4
  186. data/ext/pg_query/include/postgres/libpq/libpq-be.h +35 -28
  187. data/ext/pg_query/include/postgres/libpq/libpq.h +6 -7
  188. data/ext/pg_query/include/postgres/libpq/pqcomm.h +26 -20
  189. data/ext/pg_query/include/postgres/libpq/pqformat.h +2 -3
  190. data/ext/pg_query/include/postgres/libpq/pqsignal.h +1 -1
  191. data/ext/pg_query/include/postgres/libpq/protocol.h +89 -0
  192. data/ext/pg_query/include/postgres/libpq/sasl.h +1 -1
  193. data/ext/pg_query/include/postgres/libpq/scram.h +1 -1
  194. data/ext/pg_query/include/postgres/mb/pg_wchar.h +103 -82
  195. data/ext/pg_query/include/postgres/mb/stringinfo_mb.h +1 -1
  196. data/ext/pg_query/include/postgres/miscadmin.h +72 -52
  197. data/ext/pg_query/include/postgres/nodes/bitmapset.h +17 -3
  198. data/ext/pg_query/include/postgres/nodes/execnodes.h +112 -25
  199. data/ext/pg_query/include/postgres/nodes/extensible.h +1 -1
  200. data/ext/pg_query/include/postgres/nodes/lockoptions.h +4 -4
  201. data/ext/pg_query/include/postgres/nodes/makefuncs.h +8 -2
  202. data/ext/pg_query/include/postgres/nodes/memnodes.h +43 -4
  203. data/ext/pg_query/include/postgres/nodes/miscnodes.h +1 -1
  204. data/ext/pg_query/include/postgres/nodes/nodeFuncs.h +1 -1
  205. data/ext/pg_query/include/postgres/nodes/nodes.h +30 -41
  206. data/ext/pg_query/include/postgres/nodes/nodetags.h +464 -444
  207. data/ext/pg_query/include/postgres/nodes/params.h +1 -1
  208. data/ext/pg_query/include/postgres/nodes/parsenodes.h +358 -175
  209. data/ext/pg_query/include/postgres/nodes/pathnodes.h +64 -10
  210. data/ext/pg_query/include/postgres/nodes/pg_list.h +62 -11
  211. data/ext/pg_query/include/postgres/nodes/plannodes.h +11 -10
  212. data/ext/pg_query/include/postgres/nodes/primnodes.h +352 -54
  213. data/ext/pg_query/include/postgres/nodes/print.h +1 -1
  214. data/ext/pg_query/include/postgres/nodes/queryjumble.h +2 -2
  215. data/ext/pg_query/include/postgres/nodes/replnodes.h +23 -2
  216. data/ext/pg_query/include/postgres/nodes/supportnodes.h +1 -1
  217. data/ext/pg_query/include/postgres/nodes/tidbitmap.h +1 -1
  218. data/ext/pg_query/include/postgres/nodes/value.h +1 -1
  219. data/ext/pg_query/include/postgres/optimizer/cost.h +5 -4
  220. data/ext/pg_query/include/postgres/optimizer/geqo.h +1 -1
  221. data/ext/pg_query/include/postgres/optimizer/geqo_gene.h +1 -1
  222. data/ext/pg_query/include/postgres/optimizer/optimizer.h +5 -2
  223. data/ext/pg_query/include/postgres/optimizer/paths.h +13 -8
  224. data/ext/pg_query/include/postgres/optimizer/planmain.h +7 -1
  225. data/ext/pg_query/include/postgres/parser/analyze.h +3 -1
  226. data/ext/pg_query/include/postgres/parser/kwlist.h +22 -2
  227. data/ext/pg_query/include/postgres/parser/parse_agg.h +1 -1
  228. data/ext/pg_query/include/postgres/parser/parse_coerce.h +5 -2
  229. data/ext/pg_query/include/postgres/parser/parse_expr.h +1 -1
  230. data/ext/pg_query/include/postgres/parser/parse_func.h +2 -2
  231. data/ext/pg_query/include/postgres/parser/parse_node.h +3 -2
  232. data/ext/pg_query/include/postgres/parser/parse_oper.h +4 -1
  233. data/ext/pg_query/include/postgres/parser/parse_relation.h +1 -1
  234. data/ext/pg_query/include/postgres/parser/parse_type.h +2 -2
  235. data/ext/pg_query/include/postgres/parser/parser.h +3 -3
  236. data/ext/pg_query/include/postgres/parser/parsetree.h +1 -1
  237. data/ext/pg_query/include/postgres/parser/scanner.h +1 -1
  238. data/ext/pg_query/include/postgres/parser/scansup.h +1 -1
  239. data/ext/pg_query/include/postgres/partitioning/partdefs.h +1 -1
  240. data/ext/pg_query/include/postgres/pg_config.h +53 -45
  241. data/ext/pg_query/include/postgres/pg_config_manual.h +21 -8
  242. data/ext/pg_query/include/postgres/pg_getopt.h +1 -1
  243. data/ext/pg_query/include/postgres/pg_trace.h +1 -1
  244. data/ext/pg_query/include/postgres/pgstat.h +13 -11
  245. data/ext/pg_query/include/postgres/pgtime.h +1 -1
  246. data/ext/pg_query/include/postgres/pl_reserved_kwlist.h +1 -1
  247. data/ext/pg_query/include/postgres/pl_reserved_kwlist_d.h +1 -1
  248. data/ext/pg_query/include/postgres/pl_unreserved_kwlist.h +1 -1
  249. data/ext/pg_query/include/postgres/pl_unreserved_kwlist_d.h +1 -1
  250. data/ext/pg_query/include/postgres/plerrcodes.h +4 -4
  251. data/ext/pg_query/include/postgres/plpgsql.h +15 -13
  252. data/ext/pg_query/include/postgres/port/atomics/arch-arm.h +1 -1
  253. data/ext/pg_query/include/postgres/port/atomics/arch-hppa.h +1 -1
  254. data/ext/pg_query/include/postgres/port/atomics/arch-ppc.h +3 -1
  255. data/ext/pg_query/include/postgres/port/atomics/arch-x86.h +3 -1
  256. data/ext/pg_query/include/postgres/port/atomics/fallback.h +1 -1
  257. data/ext/pg_query/include/postgres/port/atomics/generic-gcc.h +38 -1
  258. data/ext/pg_query/include/postgres/port/atomics/generic-msvc.h +19 -1
  259. data/ext/pg_query/include/postgres/port/atomics/generic-sunpro.h +16 -1
  260. data/ext/pg_query/include/postgres/port/atomics/generic.h +38 -2
  261. data/ext/pg_query/include/postgres/port/atomics.h +93 -6
  262. data/ext/pg_query/include/postgres/port/pg_bitutils.h +91 -9
  263. data/ext/pg_query/include/postgres/port/pg_bswap.h +1 -1
  264. data/ext/pg_query/include/postgres/port/pg_crc32c.h +10 -1
  265. data/ext/pg_query/include/postgres/port/pg_iovec.h +117 -0
  266. data/ext/pg_query/include/postgres/port/simd.h +48 -1
  267. data/ext/pg_query/include/postgres/port/win32/sys/socket.h +8 -0
  268. data/ext/pg_query/include/postgres/port/win32_port.h +1 -13
  269. data/ext/pg_query/include/postgres/port.h +39 -4
  270. data/ext/pg_query/include/postgres/portability/instr_time.h +1 -1
  271. data/ext/pg_query/include/postgres/postgres.h +1 -1
  272. data/ext/pg_query/include/postgres/postmaster/autovacuum.h +5 -16
  273. data/ext/pg_query/include/postgres/postmaster/bgworker.h +8 -6
  274. data/ext/pg_query/include/postgres/postmaster/bgworker_internals.h +3 -7
  275. data/ext/pg_query/include/postgres/postmaster/bgwriter.h +3 -3
  276. data/ext/pg_query/include/postgres/postmaster/interrupt.h +1 -1
  277. data/ext/pg_query/include/postgres/postmaster/pgarch.h +2 -2
  278. data/ext/pg_query/include/postgres/postmaster/postmaster.h +25 -5
  279. data/ext/pg_query/include/postgres/postmaster/startup.h +2 -2
  280. data/ext/pg_query/include/postgres/postmaster/syslogger.h +2 -4
  281. data/ext/pg_query/include/postgres/postmaster/walsummarizer.h +35 -0
  282. data/ext/pg_query/include/postgres/postmaster/walwriter.h +2 -2
  283. data/ext/pg_query/include/postgres/regex/regex.h +92 -9
  284. data/ext/pg_query/include/postgres/replication/logicallauncher.h +1 -1
  285. data/ext/pg_query/include/postgres/replication/logicalproto.h +2 -2
  286. data/ext/pg_query/include/postgres/replication/logicalworker.h +2 -1
  287. data/ext/pg_query/include/postgres/replication/origin.h +1 -1
  288. data/ext/pg_query/include/postgres/replication/reorderbuffer.h +27 -46
  289. data/ext/pg_query/include/postgres/replication/slot.h +45 -5
  290. data/ext/pg_query/include/postgres/replication/slotsync.h +38 -0
  291. data/ext/pg_query/include/postgres/replication/syncrep.h +1 -1
  292. data/ext/pg_query/include/postgres/replication/walreceiver.h +37 -11
  293. data/ext/pg_query/include/postgres/replication/walsender.h +5 -3
  294. data/ext/pg_query/include/postgres/rewrite/prs2lock.h +1 -1
  295. data/ext/pg_query/include/postgres/rewrite/rewriteHandler.h +7 -1
  296. data/ext/pg_query/include/postgres/rewrite/rewriteManip.h +2 -2
  297. data/ext/pg_query/include/postgres/rewrite/rewriteSupport.h +1 -1
  298. data/ext/pg_query/include/postgres/storage/block.h +1 -1
  299. data/ext/pg_query/include/postgres/storage/buf.h +1 -1
  300. data/ext/pg_query/include/postgres/storage/bufmgr.h +59 -41
  301. data/ext/pg_query/include/postgres/storage/bufpage.h +1 -1
  302. data/ext/pg_query/include/postgres/storage/condition_variable.h +1 -1
  303. data/ext/pg_query/include/postgres/storage/dsm.h +1 -1
  304. data/ext/pg_query/include/postgres/storage/dsm_impl.h +2 -2
  305. data/ext/pg_query/include/postgres/storage/fd.h +30 -13
  306. data/ext/pg_query/include/postgres/storage/fileset.h +1 -1
  307. data/ext/pg_query/include/postgres/storage/ipc.h +4 -1
  308. data/ext/pg_query/include/postgres/storage/item.h +1 -1
  309. data/ext/pg_query/include/postgres/storage/itemid.h +1 -1
  310. data/ext/pg_query/include/postgres/storage/itemptr.h +1 -1
  311. data/ext/pg_query/include/postgres/storage/large_object.h +1 -1
  312. data/ext/pg_query/include/postgres/storage/latch.h +4 -2
  313. data/ext/pg_query/include/postgres/storage/lmgr.h +8 -2
  314. data/ext/pg_query/include/postgres/storage/lock.h +19 -19
  315. data/ext/pg_query/include/postgres/storage/lockdefs.h +3 -1
  316. data/ext/pg_query/include/postgres/storage/lwlock.h +17 -9
  317. data/ext/pg_query/include/postgres/storage/lwlocknames.h +7 -10
  318. data/ext/pg_query/include/postgres/storage/off.h +1 -1
  319. data/ext/pg_query/include/postgres/storage/pg_sema.h +1 -1
  320. data/ext/pg_query/include/postgres/storage/pg_shmem.h +5 -4
  321. data/ext/pg_query/include/postgres/storage/pmsignal.h +2 -2
  322. data/ext/pg_query/include/postgres/storage/predicate.h +1 -5
  323. data/ext/pg_query/include/postgres/storage/proc.h +48 -26
  324. data/ext/pg_query/include/postgres/storage/procarray.h +5 -1
  325. data/ext/pg_query/include/postgres/storage/proclist_types.h +11 -9
  326. data/ext/pg_query/include/postgres/storage/procnumber.h +43 -0
  327. data/ext/pg_query/include/postgres/storage/procsignal.h +8 -6
  328. data/ext/pg_query/include/postgres/storage/read_stream.h +65 -0
  329. data/ext/pg_query/include/postgres/storage/relfilelocator.h +16 -15
  330. data/ext/pg_query/include/postgres/storage/s_lock.h +7 -27
  331. data/ext/pg_query/include/postgres/storage/sharedfileset.h +1 -1
  332. data/ext/pg_query/include/postgres/storage/shm_mq.h +2 -2
  333. data/ext/pg_query/include/postgres/storage/shm_toc.h +1 -1
  334. data/ext/pg_query/include/postgres/storage/shmem.h +1 -1
  335. data/ext/pg_query/include/postgres/storage/sinval.h +3 -3
  336. data/ext/pg_query/include/postgres/storage/smgr.h +46 -29
  337. data/ext/pg_query/include/postgres/storage/spin.h +1 -1
  338. data/ext/pg_query/include/postgres/storage/standby.h +13 -3
  339. data/ext/pg_query/include/postgres/storage/standbydefs.h +2 -2
  340. data/ext/pg_query/include/postgres/storage/sync.h +4 -4
  341. data/ext/pg_query/include/postgres/tcop/cmdtag.h +1 -2
  342. data/ext/pg_query/include/postgres/tcop/cmdtaglist.h +3 -2
  343. data/ext/pg_query/include/postgres/tcop/deparse_utility.h +2 -2
  344. data/ext/pg_query/include/postgres/tcop/dest.h +3 -2
  345. data/ext/pg_query/include/postgres/tcop/fastpath.h +1 -1
  346. data/ext/pg_query/include/postgres/tcop/pquery.h +1 -1
  347. data/ext/pg_query/include/postgres/tcop/tcopprot.h +9 -5
  348. data/ext/pg_query/include/postgres/tcop/utility.h +2 -2
  349. data/ext/pg_query/include/postgres/tsearch/ts_cache.h +1 -1
  350. data/ext/pg_query/include/postgres/utils/acl.h +19 -7
  351. data/ext/pg_query/include/postgres/utils/aclchk_internal.h +1 -1
  352. data/ext/pg_query/include/postgres/utils/array.h +1 -2
  353. data/ext/pg_query/include/postgres/utils/ascii.h +84 -0
  354. data/ext/pg_query/include/postgres/utils/backend_progress.h +3 -2
  355. data/ext/pg_query/include/postgres/utils/backend_status.h +8 -10
  356. data/ext/pg_query/include/postgres/utils/builtins.h +4 -1
  357. data/ext/pg_query/include/postgres/utils/bytea.h +2 -2
  358. data/ext/pg_query/include/postgres/utils/catcache.h +6 -6
  359. data/ext/pg_query/include/postgres/utils/date.h +1 -1
  360. data/ext/pg_query/include/postgres/utils/datetime.h +4 -1
  361. data/ext/pg_query/include/postgres/utils/datum.h +1 -1
  362. data/ext/pg_query/include/postgres/utils/dsa.h +44 -5
  363. data/ext/pg_query/include/postgres/utils/elog.h +3 -8
  364. data/ext/pg_query/include/postgres/utils/errcodes.h +1 -3
  365. data/ext/pg_query/include/postgres/utils/expandeddatum.h +1 -1
  366. data/ext/pg_query/include/postgres/utils/expandedrecord.h +1 -1
  367. data/ext/pg_query/include/postgres/utils/float.h +1 -1
  368. data/ext/pg_query/include/postgres/utils/fmgroids.h +49 -16
  369. data/ext/pg_query/include/postgres/utils/fmgrprotos.h +47 -14
  370. data/ext/pg_query/include/postgres/utils/fmgrtab.h +1 -1
  371. data/ext/pg_query/include/postgres/utils/guc.h +20 -6
  372. data/ext/pg_query/include/postgres/utils/guc_hooks.h +23 -2
  373. data/ext/pg_query/include/postgres/utils/guc_tables.h +6 -5
  374. data/ext/pg_query/include/postgres/utils/hsearch.h +2 -2
  375. data/ext/pg_query/include/postgres/utils/injection_point.h +44 -0
  376. data/ext/pg_query/include/postgres/utils/inval.h +1 -1
  377. data/ext/pg_query/include/postgres/utils/logtape.h +5 -5
  378. data/ext/pg_query/include/postgres/utils/lsyscache.h +6 -3
  379. data/ext/pg_query/include/postgres/utils/memdebug.h +1 -1
  380. data/ext/pg_query/include/postgres/utils/memutils.h +12 -5
  381. data/ext/pg_query/include/postgres/utils/memutils_internal.h +53 -13
  382. data/ext/pg_query/include/postgres/utils/memutils_memorychunk.h +25 -9
  383. data/ext/pg_query/include/postgres/utils/numeric.h +6 -1
  384. data/ext/pg_query/include/postgres/utils/palloc.h +1 -15
  385. data/ext/pg_query/include/postgres/utils/partcache.h +1 -1
  386. data/ext/pg_query/include/postgres/utils/pg_locale.h +8 -7
  387. data/ext/pg_query/include/postgres/utils/pgstat_internal.h +30 -17
  388. data/ext/pg_query/include/postgres/utils/plancache.h +5 -3
  389. data/ext/pg_query/include/postgres/utils/portal.h +10 -10
  390. data/ext/pg_query/include/postgres/utils/queryenvironment.h +2 -2
  391. data/ext/pg_query/include/postgres/utils/regproc.h +1 -1
  392. data/ext/pg_query/include/postgres/utils/rel.h +14 -15
  393. data/ext/pg_query/include/postgres/utils/relcache.h +2 -5
  394. data/ext/pg_query/include/postgres/utils/reltrigger.h +1 -1
  395. data/ext/pg_query/include/postgres/utils/resowner.h +90 -9
  396. data/ext/pg_query/include/postgres/utils/ruleutils.h +1 -1
  397. data/ext/pg_query/include/postgres/utils/sharedtuplestore.h +1 -1
  398. data/ext/pg_query/include/postgres/utils/snapmgr.h +1 -52
  399. data/ext/pg_query/include/postgres/utils/snapshot.h +2 -2
  400. data/ext/pg_query/include/postgres/utils/sortsupport.h +1 -1
  401. data/ext/pg_query/include/postgres/utils/syscache.h +7 -98
  402. data/ext/pg_query/include/postgres/utils/timeout.h +3 -2
  403. data/ext/pg_query/include/postgres/utils/timestamp.h +1 -1
  404. data/ext/pg_query/include/postgres/utils/tuplesort.h +36 -9
  405. data/ext/pg_query/include/postgres/utils/tuplestore.h +2 -5
  406. data/ext/pg_query/include/postgres/utils/typcache.h +2 -1
  407. data/ext/pg_query/include/postgres/utils/varlena.h +1 -1
  408. data/ext/pg_query/include/postgres/utils/wait_event.h +28 -214
  409. data/ext/pg_query/include/postgres/utils/wait_event_types.h +218 -0
  410. data/ext/pg_query/include/postgres/utils/xml.h +4 -4
  411. data/ext/pg_query/include/postgres/varatt.h +1 -1
  412. data/ext/pg_query/include/protobuf/pg_query.pb-c.h +1546 -792
  413. data/ext/pg_query/include/protobuf/pg_query.pb.h +58365 -46595
  414. data/ext/pg_query/pg_query.pb-c.c +6598 -3739
  415. data/ext/pg_query/pg_query_normalize.c +42 -1
  416. data/ext/pg_query/pg_query_outfuncs_json.c +3 -1
  417. data/ext/pg_query/pg_query_parse_plpgsql.c +12 -13
  418. data/ext/pg_query/pg_query_readfuncs_protobuf.c +2 -2
  419. data/ext/pg_query/pg_query_scan.c +1 -1
  420. data/ext/pg_query/postgres_deparse.c +601 -172
  421. data/ext/pg_query/src_backend_catalog_namespace.c +241 -66
  422. data/ext/pg_query/src_backend_catalog_pg_proc.c +1 -3
  423. data/ext/pg_query/src_backend_commands_define.c +2 -3
  424. data/ext/pg_query/src_backend_nodes_bitmapset.c +137 -94
  425. data/ext/pg_query/src_backend_nodes_copyfuncs.c +1 -1
  426. data/ext/pg_query/src_backend_nodes_equalfuncs.c +1 -1
  427. data/ext/pg_query/src_backend_nodes_extensible.c +1 -1
  428. data/ext/pg_query/src_backend_nodes_list.c +3 -7
  429. data/ext/pg_query/src_backend_nodes_makefuncs.c +59 -20
  430. data/ext/pg_query/src_backend_nodes_nodeFuncs.c +109 -2
  431. data/ext/pg_query/src_backend_nodes_value.c +1 -1
  432. data/ext/pg_query/src_backend_parser_gram.c +34491 -32136
  433. data/ext/pg_query/src_backend_parser_parser.c +8 -8
  434. data/ext/pg_query/src_backend_parser_scan.c +5637 -3028
  435. data/ext/pg_query/src_backend_parser_scansup.c +2 -1
  436. data/ext/pg_query/src_backend_storage_ipc_ipc.c +1 -1
  437. data/ext/pg_query/src_backend_tcop_postgres.c +34 -10
  438. data/ext/pg_query/src_backend_utils_activity_pgstat_database.c +2 -2
  439. data/ext/pg_query/src_backend_utils_adt_datum.c +8 -6
  440. data/ext/pg_query/src_backend_utils_adt_expandeddatum.c +1 -1
  441. data/ext/pg_query/src_backend_utils_adt_format_type.c +1 -1
  442. data/ext/pg_query/src_backend_utils_adt_numutils.c +4 -5
  443. data/ext/pg_query/src_backend_utils_adt_ruleutils.c +101 -28
  444. data/ext/pg_query/src_backend_utils_error_assert.c +1 -1
  445. data/ext/pg_query/src_backend_utils_error_elog.c +47 -42
  446. data/ext/pg_query/src_backend_utils_fmgr_fmgr.c +4 -2
  447. data/ext/pg_query/src_backend_utils_init_globals.c +15 -3
  448. data/ext/pg_query/src_backend_utils_mb_mbutils.c +11 -18
  449. data/ext/pg_query/src_backend_utils_misc_guc_tables.c +16 -6
  450. data/ext/pg_query/src_backend_utils_mmgr_alignedalloc.c +8 -5
  451. data/ext/pg_query/src_backend_utils_mmgr_aset.c +308 -238
  452. data/ext/pg_query/src_backend_utils_mmgr_bump.c +728 -0
  453. data/ext/pg_query/src_backend_utils_mmgr_generation.c +273 -197
  454. data/ext/pg_query/src_backend_utils_mmgr_mcxt.c +270 -215
  455. data/ext/pg_query/src_backend_utils_mmgr_slab.c +154 -96
  456. data/ext/pg_query/src_common_encnames.c +43 -44
  457. data/ext/pg_query/src_common_hashfn.c +1 -1
  458. data/ext/pg_query/src_common_keywords.c +1 -1
  459. data/ext/pg_query/src_common_kwlist_d.h +511 -466
  460. data/ext/pg_query/src_common_kwlookup.c +1 -1
  461. data/ext/pg_query/src_common_psprintf.c +3 -3
  462. data/ext/pg_query/src_common_stringinfo.c +18 -1
  463. data/ext/pg_query/src_common_wchar.c +92 -109
  464. data/ext/pg_query/src_pl_plpgsql_src_pl_comp.c +99 -5
  465. data/ext/pg_query/src_pl_plpgsql_src_pl_funcs.c +1 -1
  466. data/ext/pg_query/src_pl_plpgsql_src_pl_gram.c +242 -143
  467. data/ext/pg_query/src_pl_plpgsql_src_pl_handler.c +1 -1
  468. data/ext/pg_query/src_pl_plpgsql_src_pl_reserved_kwlist_d.h +1 -1
  469. data/ext/pg_query/src_pl_plpgsql_src_pl_scanner.c +19 -1
  470. data/ext/pg_query/src_pl_plpgsql_src_pl_unreserved_kwlist_d.h +1 -1
  471. data/ext/pg_query/src_port_pg_bitutils.c +173 -28
  472. data/ext/pg_query/src_port_pgstrcasecmp.c +29 -1
  473. data/ext/pg_query/src_port_snprintf.c +15 -18
  474. data/ext/pg_query/src_port_strerror.c +1 -3
  475. data/ext/pg_query/src_port_strlcpy.c +1 -1
  476. data/lib/pg_query/fingerprint.rb +3 -5
  477. data/lib/pg_query/param_refs.rb +2 -2
  478. data/lib/pg_query/parse.rb +5 -7
  479. data/lib/pg_query/parse_error.rb +1 -0
  480. data/lib/pg_query/pg_query_pb.rb +27 -25
  481. data/lib/pg_query/scan.rb +1 -0
  482. data/lib/pg_query/treewalker.rb +38 -15
  483. data/lib/pg_query/truncate.rb +18 -20
  484. data/lib/pg_query/version.rb +1 -1
  485. metadata +31 -82
  486. data/ext/pg_query/include/postgres/storage/backendid.h +0 -37
  487. data/ext/pg_query/include/postgres/storage/sinvaladt.h +0 -45
  488. data/ext/pg_query/pg_query_ruby_freebsd.sym +0 -2
  489. data/ext/pg_query/src_backend_nodes_nodes.c +0 -38
  490. /data/ext/pg_query/{pg_query_ruby.sym → ext_symbols.sym} +0 -0
@@ -4,6 +4,7 @@
4
4
  * - MemoryContextReset
5
5
  * - MemoryContextDeleteChildren
6
6
  * - MemoryContextDelete
7
+ * - MemoryContextDeleteOnly
7
8
  * - TopMemoryContext
8
9
  * - CurrentMemoryContext
9
10
  * - MemoryContextSetParent
@@ -11,11 +12,13 @@
11
12
  * - MemoryContextResetOnly
12
13
  * - repalloc
13
14
  * - GetMemoryChunkContext
15
+ * - mcxt_methods
16
+ * - MemoryContextAllocationFailure
14
17
  * - MemoryContextStats
15
18
  * - MemoryContextStatsDetail
16
19
  * - MemoryContextStatsInternal
17
20
  * - MemoryContextStatsPrint
18
- * - mcxt_methods
21
+ * - MemoryContextTraverseNext
19
22
  * - GetMemoryChunkSpace
20
23
  * - MemoryContextAllocAligned
21
24
  * - MemoryContextAllocExtended
@@ -30,14 +33,14 @@
30
33
  * - MemoryContextStrdup
31
34
  * - MemoryContextAlloc
32
35
  * - palloc
33
- * - MemoryContextAllocZeroAligned
34
- * - MemoryContextAllocZero
35
36
  * - palloc0
36
37
  * - MemoryContextCreate
37
38
  * - MemoryContextInit
38
39
  * - MemoryContextAllowInCriticalSection
39
40
  * - CurrentMemoryContext
40
41
  * - MemoryContextDelete
42
+ * - MemoryContextAllocZero
43
+ * - MemoryContextSizeFailure
41
44
  * - palloc0
42
45
  * - MemoryContextAllocExtended
43
46
  *--------------------------------------------------------------------
@@ -54,7 +57,7 @@
54
57
  * context's MemoryContextMethods struct.
55
58
  *
56
59
  *
57
- * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group
60
+ * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group
58
61
  * Portions Copyright (c) 1994, Regents of the University of California
59
62
  *
60
63
  *
@@ -68,10 +71,6 @@
68
71
 
69
72
  #include "mb/pg_wchar.h"
70
73
  #include "miscadmin.h"
71
- #include "storage/proc.h"
72
- #include "storage/procarray.h"
73
- #include "storage/procsignal.h"
74
- #include "utils/fmgrprotos.h"
75
74
  #include "utils/memdebug.h"
76
75
  #include "utils/memutils.h"
77
76
  #include "utils/memutils_internal.h"
@@ -79,13 +78,18 @@
79
78
 
80
79
 
81
80
  static void BogusFree(void *pointer);
82
- static void *BogusRealloc(void *pointer, Size size);
81
+ static void *BogusRealloc(void *pointer, Size size, int flags);
83
82
  static MemoryContext BogusGetChunkContext(void *pointer);
84
83
  static Size BogusGetChunkSpace(void *pointer);
85
84
 
86
85
  /*****************************************************************************
87
86
  * GLOBAL MEMORY *
88
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
89
93
 
90
94
  static const MemoryContextMethods mcxt_methods[] = {
91
95
  /* aset.c */
@@ -144,35 +148,42 @@ static const MemoryContextMethods mcxt_methods[] = {
144
148
  [MCTX_ALIGNED_REDIRECT_ID].check = NULL, /* not required */
145
149
  #endif
146
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
+
147
165
 
148
166
  /*
149
- * Unused (as yet) IDs should have dummy entries here. This allows us to
150
- * fail cleanly if a bogus pointer is passed to pfree or the like. It
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
151
169
  * seems sufficient to provide routines for the methods that might get
152
170
  * invoked from inspection of a chunk (see MCXT_METHOD calls below).
153
171
  */
154
-
155
- [MCTX_UNUSED1_ID].free_p = BogusFree,
156
- [MCTX_UNUSED1_ID].realloc = BogusRealloc,
157
- [MCTX_UNUSED1_ID].get_chunk_context = BogusGetChunkContext,
158
- [MCTX_UNUSED1_ID].get_chunk_space = BogusGetChunkSpace,
159
-
160
- [MCTX_UNUSED2_ID].free_p = BogusFree,
161
- [MCTX_UNUSED2_ID].realloc = BogusRealloc,
162
- [MCTX_UNUSED2_ID].get_chunk_context = BogusGetChunkContext,
163
- [MCTX_UNUSED2_ID].get_chunk_space = BogusGetChunkSpace,
164
-
165
- [MCTX_UNUSED3_ID].free_p = BogusFree,
166
- [MCTX_UNUSED3_ID].realloc = BogusRealloc,
167
- [MCTX_UNUSED3_ID].get_chunk_context = BogusGetChunkContext,
168
- [MCTX_UNUSED3_ID].get_chunk_space = BogusGetChunkSpace,
169
-
170
- [MCTX_UNUSED4_ID].free_p = BogusFree,
171
- [MCTX_UNUSED4_ID].realloc = BogusRealloc,
172
- [MCTX_UNUSED4_ID].get_chunk_context = BogusGetChunkContext,
173
- [MCTX_UNUSED4_ID].get_chunk_space = BogusGetChunkSpace,
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)
174
183
  };
175
184
 
185
+ #undef BOGUS_MCTX
186
+
176
187
  /*
177
188
  * CurrentMemoryContext
178
189
  * Default memory context for allocations.
@@ -197,9 +208,10 @@ __thread MemoryContext ErrorContext = NULL;
197
208
  /* This is a transient link to the active portal's memory context: */
198
209
 
199
210
 
211
+ static void MemoryContextDeleteOnly(MemoryContext context);
200
212
  static void MemoryContextCallResetCallbacks(MemoryContext context);
201
213
  static void MemoryContextStatsInternal(MemoryContext context, int level,
202
- bool print, int max_children,
214
+ int max_level, int max_children,
203
215
  MemoryContextCounters *totals,
204
216
  bool print_to_stderr);
205
217
  static void MemoryContextStatsPrint(MemoryContext context, void *passthru,
@@ -271,6 +283,50 @@ GetMemoryChunkHeader(const void *pointer)
271
283
  return header;
272
284
  }
273
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
+
274
330
  /*
275
331
  * Support routines to trap use of invalid memory context method IDs
276
332
  * (from calling pfree or the like on a bogus pointer). As a possible
@@ -285,7 +341,7 @@ BogusFree(void *pointer)
285
341
  }
286
342
 
287
343
  static void *
288
- BogusRealloc(void *pointer, Size size)
344
+ BogusRealloc(void *pointer, Size size, int flags)
289
345
  {
290
346
  elog(ERROR, "repalloc called with invalid pointer %p (header 0x%016llx)",
291
347
  pointer, (unsigned long long) GetMemoryChunkHeader(pointer));
@@ -432,21 +488,60 @@ MemoryContextResetOnly(MemoryContext context)
432
488
  * allocated therein.
433
489
  *
434
490
  * The type-specific delete routine removes all storage for the context,
435
- * but we have to recurse to handle the children.
436
- * We must also delink the context from its parent, if it has one.
491
+ * but we have to deal with descendant nodes here.
437
492
  */
438
493
  void
439
494
  MemoryContextDelete(MemoryContext context)
495
+ {
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)
440
537
  {
441
538
  Assert(MemoryContextIsValid(context));
442
539
  /* We had better not be deleting TopMemoryContext ... */
443
540
  Assert(context != TopMemoryContext);
444
541
  /* And not CurrentMemoryContext, either */
445
542
  Assert(context != CurrentMemoryContext);
446
-
447
- /* save a function call in common case where there are no children */
448
- if (context->firstchild != NULL)
449
- MemoryContextDeleteChildren(context);
543
+ /* All the children should've been deleted already */
544
+ Assert(context->firstchild == NULL);
450
545
 
451
546
  /*
452
547
  * It's not entirely clear whether 'tis better to do this before or after
@@ -670,6 +765,12 @@ GetMemoryChunkSpace(void *pointer)
670
765
  */
671
766
 
672
767
 
768
+ /*
769
+ * Return the memory consumption statistics about the given context and its
770
+ * children.
771
+ */
772
+
773
+
673
774
  /*
674
775
  * MemoryContextStats
675
776
  * Print statistics about the named context and all its descendants.
@@ -681,8 +782,8 @@ GetMemoryChunkSpace(void *pointer)
681
782
  void
682
783
  MemoryContextStats(MemoryContext context)
683
784
  {
684
- /* A hard-wired limit on the number of children is usually good enough */
685
- MemoryContextStatsDetail(context, 100, true);
785
+ /* Hard-wired limits are usually good enough */
786
+ MemoryContextStatsDetail(context, 100, 100, true);
686
787
  }
687
788
 
688
789
  /*
@@ -694,14 +795,16 @@ MemoryContextStats(MemoryContext context)
694
795
  * with fprintf(stderr), otherwise use ereport().
695
796
  */
696
797
  void
697
- MemoryContextStatsDetail(MemoryContext context, int max_children,
798
+ MemoryContextStatsDetail(MemoryContext context,
799
+ int max_level, int max_children,
698
800
  bool print_to_stderr)
699
801
  {
700
802
  MemoryContextCounters grand_totals;
701
803
 
702
804
  memset(&grand_totals, 0, sizeof(grand_totals));
703
805
 
704
- MemoryContextStatsInternal(context, 0, true, max_children, &grand_totals, print_to_stderr);
806
+ MemoryContextStatsInternal(context, 0, max_level, max_children,
807
+ &grand_totals, print_to_stderr);
705
808
 
706
809
  if (print_to_stderr)
707
810
  fprintf(stderr,
@@ -710,7 +813,7 @@ MemoryContextStatsDetail(MemoryContext context, int max_children,
710
813
  grand_totals.freespace, grand_totals.freechunks,
711
814
  grand_totals.totalspace - grand_totals.freespace);
712
815
  else
713
-
816
+ {
714
817
  /*
715
818
  * Use LOG_SERVER_ONLY to prevent the memory contexts from being sent
716
819
  * to the connected client.
@@ -728,22 +831,22 @@ MemoryContextStatsDetail(MemoryContext context, int max_children,
728
831
  grand_totals.totalspace, grand_totals.nblocks,
729
832
  grand_totals.freespace, grand_totals.freechunks,
730
833
  grand_totals.totalspace - grand_totals.freespace)));
834
+ }
731
835
  }
732
836
 
733
837
  /*
734
838
  * MemoryContextStatsInternal
735
839
  * One recursion level for MemoryContextStats
736
840
  *
737
- * Print this context if print is true, but in any case accumulate counts into
738
- * *totals (if given).
841
+ * Print stats for this context if possible, but in any case accumulate counts
842
+ * into *totals (if not NULL).
739
843
  */
740
844
  static void
741
845
  MemoryContextStatsInternal(MemoryContext context, int level,
742
- bool print, int max_children,
846
+ int max_level, int max_children,
743
847
  MemoryContextCounters *totals,
744
848
  bool print_to_stderr)
745
849
  {
746
- MemoryContextCounters local_totals;
747
850
  MemoryContext child;
748
851
  int ichild;
749
852
 
@@ -751,66 +854,73 @@ MemoryContextStatsInternal(MemoryContext context, int level,
751
854
 
752
855
  /* Examine the context itself */
753
856
  context->methods->stats(context,
754
- print ? MemoryContextStatsPrint : NULL,
857
+ MemoryContextStatsPrint,
755
858
  (void *) &level,
756
859
  totals, print_to_stderr);
757
860
 
758
861
  /*
759
- * Examine children. If there are more than max_children of them, we do
760
- * 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.
761
868
  */
762
- memset(&local_totals, 0, sizeof(local_totals));
763
-
764
- for (child = context->firstchild, ichild = 0;
765
- child != NULL;
766
- child = child->nextchild, ichild++)
869
+ child = context->firstchild;
870
+ ichild = 0;
871
+ if (level < max_level && !stack_is_too_deep())
767
872
  {
768
- if (ichild < max_children)
873
+ for (; child != NULL && ichild < max_children;
874
+ child = child->nextchild, ichild++)
875
+ {
769
876
  MemoryContextStatsInternal(child, level + 1,
770
- print, max_children,
877
+ max_level, max_children,
771
878
  totals,
772
879
  print_to_stderr);
773
- else
774
- MemoryContextStatsInternal(child, level + 1,
775
- false, max_children,
776
- &local_totals,
777
- print_to_stderr);
880
+ }
778
881
  }
779
882
 
780
- /* Deal with excess children */
781
- if (ichild > max_children)
883
+ if (child != NULL)
782
884
  {
783
- 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)
784
892
  {
785
- if (print_to_stderr)
786
- {
787
- int i;
788
-
789
- for (i = 0; i <= level; i++)
790
- fprintf(stderr, " ");
791
- fprintf(stderr,
792
- "%d more child contexts containing %zu total in %zu blocks; %zu free (%zu chunks); %zu used\n",
793
- ichild - max_children,
794
- local_totals.totalspace,
795
- local_totals.nblocks,
796
- local_totals.freespace,
797
- local_totals.freechunks,
798
- local_totals.totalspace - local_totals.freespace);
799
- }
800
- else
801
- ereport(LOG_SERVER_ONLY,
802
- (errhidestmt(true),
803
- errhidecontext(true),
804
- errmsg_internal("level: %d; %d more child contexts containing %zu total in %zu blocks; %zu free (%zu chunks); %zu used",
805
- level,
806
- ichild - max_children,
807
- local_totals.totalspace,
808
- local_totals.nblocks,
809
- local_totals.freespace,
810
- local_totals.freechunks,
811
- local_totals.totalspace - local_totals.freespace)));
893
+ child->methods->stats(child, NULL, NULL, &local_totals, false);
894
+ ichild++;
895
+ child = MemoryContextTraverseNext(child, context);
812
896
  }
813
897
 
898
+ if (print_to_stderr)
899
+ {
900
+ for (int i = 0; i <= level; i++)
901
+ fprintf(stderr, " ");
902
+ fprintf(stderr,
903
+ "%d more child contexts containing %zu total in %zu blocks; %zu free (%zu chunks); %zu used\n",
904
+ ichild,
905
+ local_totals.totalspace,
906
+ local_totals.nblocks,
907
+ local_totals.freespace,
908
+ local_totals.freechunks,
909
+ local_totals.totalspace - local_totals.freespace);
910
+ }
911
+ else
912
+ ereport(LOG_SERVER_ONLY,
913
+ (errhidestmt(true),
914
+ errhidecontext(true),
915
+ errmsg_internal("level: %d; %d more child contexts containing %zu total in %zu blocks; %zu free (%zu chunks); %zu used",
916
+ level,
917
+ ichild,
918
+ local_totals.totalspace,
919
+ local_totals.nblocks,
920
+ local_totals.freespace,
921
+ local_totals.freechunks,
922
+ local_totals.totalspace - local_totals.freespace)));
923
+
814
924
  if (totals)
815
925
  {
816
926
  totals->nblocks += local_totals.nblocks;
@@ -902,7 +1012,7 @@ MemoryContextStatsPrint(MemoryContext context, void *passthru,
902
1012
 
903
1013
  /*
904
1014
  * MemoryContextCheck
905
- * Check all chunks in the named context.
1015
+ * Check all chunks in the named context and its children.
906
1016
  *
907
1017
  * This is just a debugging utility, so it's not fancy.
908
1018
  */
@@ -984,120 +1094,93 @@ MemoryContextCreate(MemoryContext node,
984
1094
  }
985
1095
 
986
1096
  /*
987
- * MemoryContextAlloc
988
- * Allocate space within the specified context.
989
- *
990
- * This could be turned into a macro, but we'd have to import
991
- * 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'.
992
1101
  */
993
1102
  void *
994
- MemoryContextAlloc(MemoryContext context, Size size)
1103
+ MemoryContextAllocationFailure(MemoryContext context, Size size, int flags)
995
1104
  {
996
- void *ret;
997
-
998
- Assert(MemoryContextIsValid(context));
999
- AssertNotInCriticalSection(context);
1000
-
1001
- if (!AllocSizeIsValid(size))
1002
- elog(ERROR, "invalid memory alloc request size %zu", size);
1003
-
1004
- context->isReset = false;
1005
-
1006
- ret = context->methods->alloc(context, size);
1007
- if (unlikely(ret == NULL))
1105
+ if ((flags & MCXT_ALLOC_NO_OOM) == 0)
1008
1106
  {
1009
1107
  MemoryContextStats(TopMemoryContext);
1010
-
1011
- /*
1012
- * Here, and elsewhere in this module, we show the target context's
1013
- * "name" but not its "ident" (if any) in user-visible error messages.
1014
- * The "ident" string might contain security-sensitive data, such as
1015
- * values in SQL commands.
1016
- */
1017
1108
  ereport(ERROR,
1018
1109
  (errcode(ERRCODE_OUT_OF_MEMORY),
1019
1110
  errmsg("out of memory"),
1020
1111
  errdetail("Failed on request of size %zu in memory context \"%s\".",
1021
1112
  size, context->name)));
1022
1113
  }
1114
+ return NULL;
1115
+ }
1023
1116
 
1024
- VALGRIND_MEMPOOL_ALLOC(context, ret, size);
1025
-
1026
- 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);
1027
1126
  }
1028
1127
 
1029
1128
  /*
1030
- * MemoryContextAllocZero
1031
- * Like MemoryContextAlloc, but clears allocated memory
1129
+ * MemoryContextAlloc
1130
+ * Allocate space within the specified context.
1032
1131
  *
1033
- * We could just call MemoryContextAlloc then clear the memory, but this
1034
- * 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.
1035
1134
  */
1036
1135
  void *
1037
- MemoryContextAllocZero(MemoryContext context, Size size)
1136
+ MemoryContextAlloc(MemoryContext context, Size size)
1038
1137
  {
1039
1138
  void *ret;
1040
1139
 
1041
1140
  Assert(MemoryContextIsValid(context));
1042
1141
  AssertNotInCriticalSection(context);
1043
1142
 
1044
- if (!AllocSizeIsValid(size))
1045
- elog(ERROR, "invalid memory alloc request size %zu", size);
1046
-
1047
1143
  context->isReset = false;
1048
1144
 
1049
- ret = context->methods->alloc(context, size);
1050
- if (unlikely(ret == NULL))
1051
- {
1052
- MemoryContextStats(TopMemoryContext);
1053
- ereport(ERROR,
1054
- (errcode(ERRCODE_OUT_OF_MEMORY),
1055
- errmsg("out of memory"),
1056
- errdetail("Failed on request of size %zu in memory context \"%s\".",
1057
- size, context->name)));
1058
- }
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);
1059
1156
 
1060
1157
  VALGRIND_MEMPOOL_ALLOC(context, ret, size);
1061
1158
 
1062
- MemSetAligned(ret, 0, size);
1063
-
1064
1159
  return ret;
1065
1160
  }
1066
1161
 
1067
1162
  /*
1068
- * MemoryContextAllocZeroAligned
1069
- * MemoryContextAllocZero where length is suitable for MemSetLoop
1163
+ * MemoryContextAllocZero
1164
+ * Like MemoryContextAlloc, but clears allocated memory
1070
1165
  *
1071
- * This might seem overly specialized, but it's not because newNode()
1072
- * 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.
1073
1168
  */
1074
1169
  void *
1075
- MemoryContextAllocZeroAligned(MemoryContext context, Size size)
1170
+ MemoryContextAllocZero(MemoryContext context, Size size)
1076
1171
  {
1077
1172
  void *ret;
1078
1173
 
1079
1174
  Assert(MemoryContextIsValid(context));
1080
1175
  AssertNotInCriticalSection(context);
1081
1176
 
1082
- if (!AllocSizeIsValid(size))
1083
- elog(ERROR, "invalid memory alloc request size %zu", size);
1084
-
1085
1177
  context->isReset = false;
1086
1178
 
1087
- ret = context->methods->alloc(context, size);
1088
- if (unlikely(ret == NULL))
1089
- {
1090
- MemoryContextStats(TopMemoryContext);
1091
- ereport(ERROR,
1092
- (errcode(ERRCODE_OUT_OF_MEMORY),
1093
- errmsg("out of memory"),
1094
- errdetail("Failed on request of size %zu in memory context \"%s\".",
1095
- size, context->name)));
1096
- }
1179
+ ret = context->methods->alloc(context, size, 0);
1097
1180
 
1098
1181
  VALGRIND_MEMPOOL_ALLOC(context, ret, size);
1099
1182
 
1100
- MemSetLoop(ret, 0, size);
1183
+ MemSetAligned(ret, 0, size);
1101
1184
 
1102
1185
  return ret;
1103
1186
  }
@@ -1120,20 +1203,9 @@ MemoryContextAllocExtended(MemoryContext context, Size size, int flags)
1120
1203
 
1121
1204
  context->isReset = false;
1122
1205
 
1123
- ret = context->methods->alloc(context, size);
1206
+ ret = context->methods->alloc(context, size, flags);
1124
1207
  if (unlikely(ret == NULL))
1125
- {
1126
- if ((flags & MCXT_ALLOC_NO_OOM) == 0)
1127
- {
1128
- MemoryContextStats(TopMemoryContext);
1129
- ereport(ERROR,
1130
- (errcode(ERRCODE_OUT_OF_MEMORY),
1131
- errmsg("out of memory"),
1132
- errdetail("Failed on request of size %zu in memory context \"%s\".",
1133
- size, context->name)));
1134
- }
1135
1208
  return NULL;
1136
- }
1137
1209
 
1138
1210
  VALGRIND_MEMPOOL_ALLOC(context, ret, size);
1139
1211
 
@@ -1174,22 +1246,21 @@ palloc(Size size)
1174
1246
  Assert(MemoryContextIsValid(context));
1175
1247
  AssertNotInCriticalSection(context);
1176
1248
 
1177
- if (!AllocSizeIsValid(size))
1178
- elog(ERROR, "invalid memory alloc request size %zu", size);
1179
-
1180
1249
  context->isReset = false;
1181
1250
 
1182
- ret = context->methods->alloc(context, size);
1183
- if (unlikely(ret == NULL))
1184
- {
1185
- MemoryContextStats(TopMemoryContext);
1186
- ereport(ERROR,
1187
- (errcode(ERRCODE_OUT_OF_MEMORY),
1188
- errmsg("out of memory"),
1189
- errdetail("Failed on request of size %zu in memory context \"%s\".",
1190
- size, context->name)));
1191
- }
1192
-
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);
1193
1264
  VALGRIND_MEMPOOL_ALLOC(context, ret, size);
1194
1265
 
1195
1266
  return ret;
@@ -1205,21 +1276,9 @@ palloc0(Size size)
1205
1276
  Assert(MemoryContextIsValid(context));
1206
1277
  AssertNotInCriticalSection(context);
1207
1278
 
1208
- if (!AllocSizeIsValid(size))
1209
- elog(ERROR, "invalid memory alloc request size %zu", size);
1210
-
1211
1279
  context->isReset = false;
1212
1280
 
1213
- ret = context->methods->alloc(context, size);
1214
- if (unlikely(ret == NULL))
1215
- {
1216
- MemoryContextStats(TopMemoryContext);
1217
- ereport(ERROR,
1218
- (errcode(ERRCODE_OUT_OF_MEMORY),
1219
- errmsg("out of memory"),
1220
- errdetail("Failed on request of size %zu in memory context \"%s\".",
1221
- size, context->name)));
1222
- }
1281
+ ret = context->methods->alloc(context, size, 0);
1223
1282
 
1224
1283
  VALGRIND_MEMPOOL_ALLOC(context, ret, size);
1225
1284
 
@@ -1384,26 +1443,22 @@ repalloc(void *pointer, Size size)
1384
1443
  #endif
1385
1444
  void *ret;
1386
1445
 
1387
- if (!AllocSizeIsValid(size))
1388
- elog(ERROR, "invalid memory alloc request size %zu", size);
1389
-
1390
1446
  AssertNotInCriticalSection(context);
1391
1447
 
1392
1448
  /* isReset must be false already */
1393
1449
  Assert(!context->isReset);
1394
1450
 
1395
- ret = MCXT_METHOD(pointer, realloc) (pointer, size);
1396
- if (unlikely(ret == NULL))
1397
- {
1398
- MemoryContext cxt = GetMemoryChunkContext(pointer);
1399
-
1400
- MemoryContextStats(TopMemoryContext);
1401
- ereport(ERROR,
1402
- (errcode(ERRCODE_OUT_OF_MEMORY),
1403
- errmsg("out of memory"),
1404
- errdetail("Failed on request of size %zu in memory context \"%s\".",
1405
- size, cxt->name)));
1406
- }
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);
1407
1462
 
1408
1463
  #ifdef USE_VALGRIND
1409
1464
  if (method != MCTX_ALIGNED_REDIRECT_ID)