pg_query 5.1.0 → 6.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (479) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +18 -0
  3. data/README.md +1 -1
  4. data/Rakefile +2 -2
  5. data/ext/pg_query/include/pg_query.h +4 -3
  6. data/ext/pg_query/include/pg_query_enum_defs.c +424 -154
  7. data/ext/pg_query/include/pg_query_fingerprint_conds.c +68 -4
  8. data/ext/pg_query/include/pg_query_fingerprint_defs.c +2952 -1845
  9. data/ext/pg_query/include/pg_query_outfuncs_conds.c +51 -3
  10. data/ext/pg_query/include/pg_query_outfuncs_defs.c +210 -23
  11. data/ext/pg_query/include/pg_query_readfuncs_conds.c +17 -1
  12. data/ext/pg_query/include/pg_query_readfuncs_defs.c +271 -52
  13. data/ext/pg_query/include/postgres/access/amapi.h +10 -3
  14. data/ext/pg_query/include/postgres/access/attmap.h +1 -1
  15. data/ext/pg_query/include/postgres/access/attnum.h +1 -1
  16. data/ext/pg_query/include/postgres/access/brin_internal.h +116 -0
  17. data/ext/pg_query/include/postgres/access/brin_tuple.h +112 -0
  18. data/ext/pg_query/include/postgres/access/clog.h +2 -3
  19. data/ext/pg_query/include/postgres/access/commit_ts.h +2 -3
  20. data/ext/pg_query/include/postgres/access/detoast.h +1 -1
  21. data/ext/pg_query/include/postgres/access/genam.h +8 -4
  22. data/ext/pg_query/include/postgres/access/gin.h +1 -1
  23. data/ext/pg_query/include/postgres/access/htup.h +1 -1
  24. data/ext/pg_query/include/postgres/access/htup_details.h +11 -11
  25. data/ext/pg_query/include/postgres/access/itup.h +3 -3
  26. data/ext/pg_query/include/postgres/access/parallel.h +1 -2
  27. data/ext/pg_query/include/postgres/access/printtup.h +1 -1
  28. data/ext/pg_query/include/postgres/access/relation.h +1 -1
  29. data/ext/pg_query/include/postgres/access/relscan.h +1 -1
  30. data/ext/pg_query/include/postgres/access/rmgrlist.h +1 -1
  31. data/ext/pg_query/include/postgres/access/sdir.h +1 -1
  32. data/ext/pg_query/include/postgres/access/skey.h +1 -1
  33. data/ext/pg_query/include/postgres/access/slru.h +221 -0
  34. data/ext/pg_query/include/postgres/access/stratnum.h +1 -1
  35. data/ext/pg_query/include/postgres/access/sysattr.h +1 -1
  36. data/ext/pg_query/include/postgres/access/table.h +1 -1
  37. data/ext/pg_query/include/postgres/access/tableam.h +33 -24
  38. data/ext/pg_query/include/postgres/access/tidstore.h +50 -0
  39. data/ext/pg_query/include/postgres/access/toast_compression.h +2 -2
  40. data/ext/pg_query/include/postgres/access/transam.h +7 -7
  41. data/ext/pg_query/include/postgres/access/tsmapi.h +1 -1
  42. data/ext/pg_query/include/postgres/access/tupconvert.h +1 -1
  43. data/ext/pg_query/include/postgres/access/tupdesc.h +5 -5
  44. data/ext/pg_query/include/postgres/access/tupmacs.h +1 -1
  45. data/ext/pg_query/include/postgres/access/twophase.h +2 -2
  46. data/ext/pg_query/include/postgres/access/xact.h +5 -5
  47. data/ext/pg_query/include/postgres/access/xlog.h +20 -12
  48. data/ext/pg_query/include/postgres/access/xlog_internal.h +4 -3
  49. data/ext/pg_query/include/postgres/access/xlogbackup.h +3 -1
  50. data/ext/pg_query/include/postgres/access/xlogdefs.h +5 -5
  51. data/ext/pg_query/include/postgres/access/xlogprefetcher.h +2 -2
  52. data/ext/pg_query/include/postgres/access/xlogreader.h +2 -2
  53. data/ext/pg_query/include/postgres/access/xlogrecord.h +3 -3
  54. data/ext/pg_query/include/postgres/access/xlogrecovery.h +4 -4
  55. data/ext/pg_query/include/postgres/archive/archive_module.h +9 -1
  56. data/ext/pg_query/include/postgres/c.h +31 -36
  57. data/ext/pg_query/include/postgres/catalog/catalog.h +3 -1
  58. data/ext/pg_query/include/postgres/catalog/catversion.h +2 -2
  59. data/ext/pg_query/include/postgres/catalog/dependency.h +17 -59
  60. data/ext/pg_query/include/postgres/catalog/genbki.h +12 -6
  61. data/ext/pg_query/include/postgres/catalog/index.h +22 -18
  62. data/ext/pg_query/include/postgres/catalog/indexing.h +1 -1
  63. data/ext/pg_query/include/postgres/catalog/namespace.h +18 -19
  64. data/ext/pg_query/include/postgres/catalog/objectaccess.h +2 -2
  65. data/ext/pg_query/include/postgres/catalog/objectaddress.h +1 -1
  66. data/ext/pg_query/include/postgres/catalog/pg_aggregate.h +4 -2
  67. data/ext/pg_query/include/postgres/catalog/pg_aggregate_d.h +1 -1
  68. data/ext/pg_query/include/postgres/catalog/pg_am.h +6 -3
  69. data/ext/pg_query/include/postgres/catalog/pg_am_d.h +1 -1
  70. data/ext/pg_query/include/postgres/catalog/pg_attribute.h +31 -14
  71. data/ext/pg_query/include/postgres/catalog/pg_attribute_d.h +3 -3
  72. data/ext/pg_query/include/postgres/catalog/pg_authid.h +6 -3
  73. data/ext/pg_query/include/postgres/catalog/pg_authid_d.h +2 -1
  74. data/ext/pg_query/include/postgres/catalog/pg_class.h +10 -5
  75. data/ext/pg_query/include/postgres/catalog/pg_class_d.h +4 -2
  76. data/ext/pg_query/include/postgres/catalog/pg_collation.h +11 -5
  77. data/ext/pg_query/include/postgres/catalog/pg_collation_d.h +5 -2
  78. data/ext/pg_query/include/postgres/catalog/pg_constraint.h +15 -10
  79. data/ext/pg_query/include/postgres/catalog/pg_constraint_d.h +2 -1
  80. data/ext/pg_query/include/postgres/catalog/pg_control.h +5 -3
  81. data/ext/pg_query/include/postgres/catalog/pg_conversion.h +8 -4
  82. data/ext/pg_query/include/postgres/catalog/pg_conversion_d.h +1 -1
  83. data/ext/pg_query/include/postgres/catalog/pg_database.h +9 -4
  84. data/ext/pg_query/include/postgres/catalog/pg_database_d.h +13 -12
  85. data/ext/pg_query/include/postgres/catalog/pg_depend.h +3 -3
  86. data/ext/pg_query/include/postgres/catalog/pg_depend_d.h +1 -1
  87. data/ext/pg_query/include/postgres/catalog/pg_event_trigger.h +6 -3
  88. data/ext/pg_query/include/postgres/catalog/pg_event_trigger_d.h +1 -1
  89. data/ext/pg_query/include/postgres/catalog/pg_index.h +5 -3
  90. data/ext/pg_query/include/postgres/catalog/pg_index_d.h +1 -1
  91. data/ext/pg_query/include/postgres/catalog/pg_language.h +6 -3
  92. data/ext/pg_query/include/postgres/catalog/pg_language_d.h +1 -1
  93. data/ext/pg_query/include/postgres/catalog/pg_namespace.h +6 -3
  94. data/ext/pg_query/include/postgres/catalog/pg_namespace_d.h +1 -1
  95. data/ext/pg_query/include/postgres/catalog/pg_opclass.h +6 -3
  96. data/ext/pg_query/include/postgres/catalog/pg_opclass_d.h +1 -1
  97. data/ext/pg_query/include/postgres/catalog/pg_operator.h +20 -3
  98. data/ext/pg_query/include/postgres/catalog/pg_operator_d.h +1 -1
  99. data/ext/pg_query/include/postgres/catalog/pg_opfamily.h +6 -3
  100. data/ext/pg_query/include/postgres/catalog/pg_opfamily_d.h +1 -1
  101. data/ext/pg_query/include/postgres/catalog/pg_partitioned_table.h +4 -2
  102. data/ext/pg_query/include/postgres/catalog/pg_partitioned_table_d.h +1 -1
  103. data/ext/pg_query/include/postgres/catalog/pg_proc.h +6 -3
  104. data/ext/pg_query/include/postgres/catalog/pg_proc_d.h +1 -1
  105. data/ext/pg_query/include/postgres/catalog/pg_publication.h +6 -3
  106. data/ext/pg_query/include/postgres/catalog/pg_publication_d.h +1 -1
  107. data/ext/pg_query/include/postgres/catalog/pg_replication_origin.h +6 -3
  108. data/ext/pg_query/include/postgres/catalog/pg_replication_origin_d.h +1 -1
  109. data/ext/pg_query/include/postgres/catalog/pg_statistic.h +10 -4
  110. data/ext/pg_query/include/postgres/catalog/pg_statistic_d.h +7 -3
  111. data/ext/pg_query/include/postgres/catalog/pg_statistic_ext.h +10 -7
  112. data/ext/pg_query/include/postgres/catalog/pg_statistic_ext_d.h +3 -3
  113. data/ext/pg_query/include/postgres/catalog/pg_transform.h +6 -3
  114. data/ext/pg_query/include/postgres/catalog/pg_transform_d.h +1 -1
  115. data/ext/pg_query/include/postgres/catalog/pg_trigger.h +4 -4
  116. data/ext/pg_query/include/postgres/catalog/pg_trigger_d.h +1 -1
  117. data/ext/pg_query/include/postgres/catalog/pg_ts_config.h +6 -3
  118. data/ext/pg_query/include/postgres/catalog/pg_ts_config_d.h +1 -1
  119. data/ext/pg_query/include/postgres/catalog/pg_ts_dict.h +6 -3
  120. data/ext/pg_query/include/postgres/catalog/pg_ts_dict_d.h +1 -1
  121. data/ext/pg_query/include/postgres/catalog/pg_ts_parser.h +6 -3
  122. data/ext/pg_query/include/postgres/catalog/pg_ts_parser_d.h +1 -1
  123. data/ext/pg_query/include/postgres/catalog/pg_ts_template.h +6 -3
  124. data/ext/pg_query/include/postgres/catalog/pg_ts_template_d.h +1 -1
  125. data/ext/pg_query/include/postgres/catalog/pg_type.h +6 -3
  126. data/ext/pg_query/include/postgres/catalog/pg_type_d.h +1 -1
  127. data/ext/pg_query/include/postgres/catalog/storage.h +1 -1
  128. data/ext/pg_query/include/postgres/catalog/syscache_ids.h +104 -0
  129. data/ext/pg_query/include/postgres/commands/async.h +2 -6
  130. data/ext/pg_query/include/postgres/commands/dbcommands.h +1 -1
  131. data/ext/pg_query/include/postgres/commands/defrem.h +6 -6
  132. data/ext/pg_query/include/postgres/commands/event_trigger.h +5 -2
  133. data/ext/pg_query/include/postgres/commands/explain.h +19 -3
  134. data/ext/pg_query/include/postgres/commands/prepare.h +1 -1
  135. data/ext/pg_query/include/postgres/commands/tablespace.h +1 -1
  136. data/ext/pg_query/include/postgres/commands/trigger.h +1 -1
  137. data/ext/pg_query/include/postgres/commands/vacuum.h +28 -26
  138. data/ext/pg_query/include/postgres/common/cryptohash.h +2 -2
  139. data/ext/pg_query/include/postgres/common/file_perm.h +1 -1
  140. data/ext/pg_query/include/postgres/common/file_utils.h +65 -0
  141. data/ext/pg_query/include/postgres/common/hashfn.h +16 -1
  142. data/ext/pg_query/include/postgres/common/hashfn_unstable.h +453 -0
  143. data/ext/pg_query/include/postgres/common/int.h +79 -4
  144. data/ext/pg_query/include/postgres/common/keywords.h +1 -1
  145. data/ext/pg_query/include/postgres/common/kwlookup.h +1 -1
  146. data/ext/pg_query/include/postgres/common/pg_prng.h +2 -1
  147. data/ext/pg_query/include/postgres/common/relpath.h +4 -4
  148. data/ext/pg_query/include/postgres/common/scram-common.h +1 -1
  149. data/ext/pg_query/include/postgres/common/sha2.h +1 -1
  150. data/ext/pg_query/include/postgres/common/string.h +1 -1
  151. data/ext/pg_query/include/postgres/common/unicode_east_asian_fw_table.h +2 -3
  152. data/ext/pg_query/include/postgres/copyfuncs.funcs.c +278 -30
  153. data/ext/pg_query/include/postgres/copyfuncs.switch.c +55 -4
  154. data/ext/pg_query/include/postgres/datatype/timestamp.h +28 -2
  155. data/ext/pg_query/include/postgres/equalfuncs.funcs.c +239 -26
  156. data/ext/pg_query/include/postgres/equalfuncs.switch.c +55 -4
  157. data/ext/pg_query/include/postgres/executor/execdesc.h +1 -1
  158. data/ext/pg_query/include/postgres/executor/executor.h +6 -5
  159. data/ext/pg_query/include/postgres/executor/functions.h +2 -1
  160. data/ext/pg_query/include/postgres/executor/instrument.h +5 -3
  161. data/ext/pg_query/include/postgres/executor/spi.h +2 -8
  162. data/ext/pg_query/include/postgres/executor/tablefunc.h +1 -1
  163. data/ext/pg_query/include/postgres/executor/tuptable.h +31 -2
  164. data/ext/pg_query/include/postgres/fmgr.h +2 -2
  165. data/ext/pg_query/include/postgres/foreign/fdwapi.h +1 -1
  166. data/ext/pg_query/include/postgres/funcapi.h +2 -2
  167. data/ext/pg_query/include/postgres/gram.h +871 -830
  168. data/ext/pg_query/include/postgres/gramparse.h +1 -1
  169. data/ext/pg_query/include/postgres/jit/jit.h +4 -3
  170. data/ext/pg_query/include/postgres/kwlist_d.h +511 -466
  171. data/ext/pg_query/include/postgres/lib/dshash.h +25 -10
  172. data/ext/pg_query/include/postgres/lib/ilist.h +1 -1
  173. data/ext/pg_query/include/postgres/lib/pairingheap.h +1 -1
  174. data/ext/pg_query/include/postgres/lib/simplehash.h +40 -18
  175. data/ext/pg_query/include/postgres/lib/sort_template.h +14 -1
  176. data/ext/pg_query/include/postgres/lib/stringinfo.h +93 -11
  177. data/ext/pg_query/include/postgres/libpq/auth.h +1 -1
  178. data/ext/pg_query/include/postgres/libpq/crypt.h +2 -2
  179. data/ext/pg_query/include/postgres/libpq/hba.h +4 -4
  180. data/ext/pg_query/include/postgres/libpq/libpq-be.h +29 -25
  181. data/ext/pg_query/include/postgres/libpq/libpq.h +6 -7
  182. data/ext/pg_query/include/postgres/libpq/pqcomm.h +26 -20
  183. data/ext/pg_query/include/postgres/libpq/pqformat.h +2 -3
  184. data/ext/pg_query/include/postgres/libpq/pqsignal.h +1 -1
  185. data/ext/pg_query/include/postgres/libpq/protocol.h +89 -0
  186. data/ext/pg_query/include/postgres/libpq/sasl.h +1 -1
  187. data/ext/pg_query/include/postgres/libpq/scram.h +1 -1
  188. data/ext/pg_query/include/postgres/mb/pg_wchar.h +102 -82
  189. data/ext/pg_query/include/postgres/mb/stringinfo_mb.h +1 -1
  190. data/ext/pg_query/include/postgres/miscadmin.h +64 -52
  191. data/ext/pg_query/include/postgres/nodes/bitmapset.h +17 -3
  192. data/ext/pg_query/include/postgres/nodes/execnodes.h +109 -25
  193. data/ext/pg_query/include/postgres/nodes/extensible.h +1 -1
  194. data/ext/pg_query/include/postgres/nodes/lockoptions.h +4 -4
  195. data/ext/pg_query/include/postgres/nodes/makefuncs.h +8 -2
  196. data/ext/pg_query/include/postgres/nodes/memnodes.h +43 -4
  197. data/ext/pg_query/include/postgres/nodes/miscnodes.h +1 -1
  198. data/ext/pg_query/include/postgres/nodes/nodeFuncs.h +1 -1
  199. data/ext/pg_query/include/postgres/nodes/nodes.h +30 -41
  200. data/ext/pg_query/include/postgres/nodes/nodetags.h +464 -444
  201. data/ext/pg_query/include/postgres/nodes/params.h +1 -1
  202. data/ext/pg_query/include/postgres/nodes/parsenodes.h +358 -175
  203. data/ext/pg_query/include/postgres/nodes/pathnodes.h +60 -9
  204. data/ext/pg_query/include/postgres/nodes/pg_list.h +62 -11
  205. data/ext/pg_query/include/postgres/nodes/plannodes.h +11 -10
  206. data/ext/pg_query/include/postgres/nodes/primnodes.h +344 -50
  207. data/ext/pg_query/include/postgres/nodes/print.h +1 -1
  208. data/ext/pg_query/include/postgres/nodes/queryjumble.h +2 -2
  209. data/ext/pg_query/include/postgres/nodes/replnodes.h +23 -2
  210. data/ext/pg_query/include/postgres/nodes/supportnodes.h +1 -1
  211. data/ext/pg_query/include/postgres/nodes/tidbitmap.h +1 -1
  212. data/ext/pg_query/include/postgres/nodes/value.h +1 -1
  213. data/ext/pg_query/include/postgres/optimizer/cost.h +5 -4
  214. data/ext/pg_query/include/postgres/optimizer/geqo.h +1 -1
  215. data/ext/pg_query/include/postgres/optimizer/geqo_gene.h +1 -1
  216. data/ext/pg_query/include/postgres/optimizer/optimizer.h +5 -2
  217. data/ext/pg_query/include/postgres/optimizer/paths.h +13 -8
  218. data/ext/pg_query/include/postgres/optimizer/planmain.h +7 -1
  219. data/ext/pg_query/include/postgres/parser/analyze.h +3 -1
  220. data/ext/pg_query/include/postgres/parser/kwlist.h +22 -2
  221. data/ext/pg_query/include/postgres/parser/parse_agg.h +1 -1
  222. data/ext/pg_query/include/postgres/parser/parse_coerce.h +2 -2
  223. data/ext/pg_query/include/postgres/parser/parse_expr.h +1 -1
  224. data/ext/pg_query/include/postgres/parser/parse_func.h +2 -2
  225. data/ext/pg_query/include/postgres/parser/parse_node.h +3 -2
  226. data/ext/pg_query/include/postgres/parser/parse_oper.h +4 -1
  227. data/ext/pg_query/include/postgres/parser/parse_relation.h +1 -1
  228. data/ext/pg_query/include/postgres/parser/parse_type.h +2 -2
  229. data/ext/pg_query/include/postgres/parser/parser.h +3 -3
  230. data/ext/pg_query/include/postgres/parser/parsetree.h +1 -1
  231. data/ext/pg_query/include/postgres/parser/scanner.h +1 -1
  232. data/ext/pg_query/include/postgres/parser/scansup.h +1 -1
  233. data/ext/pg_query/include/postgres/partitioning/partdefs.h +1 -1
  234. data/ext/pg_query/include/postgres/pg_config.h +34 -34
  235. data/ext/pg_query/include/postgres/pg_config_manual.h +21 -8
  236. data/ext/pg_query/include/postgres/pg_getopt.h +1 -1
  237. data/ext/pg_query/include/postgres/pg_trace.h +1 -1
  238. data/ext/pg_query/include/postgres/pgstat.h +13 -11
  239. data/ext/pg_query/include/postgres/pgtime.h +1 -1
  240. data/ext/pg_query/include/postgres/pl_reserved_kwlist.h +1 -1
  241. data/ext/pg_query/include/postgres/pl_reserved_kwlist_d.h +1 -1
  242. data/ext/pg_query/include/postgres/pl_unreserved_kwlist.h +1 -1
  243. data/ext/pg_query/include/postgres/pl_unreserved_kwlist_d.h +1 -1
  244. data/ext/pg_query/include/postgres/plerrcodes.h +4 -4
  245. data/ext/pg_query/include/postgres/plpgsql.h +15 -13
  246. data/ext/pg_query/include/postgres/port/atomics/arch-arm.h +1 -1
  247. data/ext/pg_query/include/postgres/port/atomics/arch-hppa.h +1 -1
  248. data/ext/pg_query/include/postgres/port/atomics/arch-ppc.h +3 -1
  249. data/ext/pg_query/include/postgres/port/atomics/arch-x86.h +3 -1
  250. data/ext/pg_query/include/postgres/port/atomics/fallback.h +1 -1
  251. data/ext/pg_query/include/postgres/port/atomics/generic-gcc.h +38 -1
  252. data/ext/pg_query/include/postgres/port/atomics/generic-msvc.h +19 -1
  253. data/ext/pg_query/include/postgres/port/atomics/generic-sunpro.h +16 -1
  254. data/ext/pg_query/include/postgres/port/atomics/generic.h +38 -2
  255. data/ext/pg_query/include/postgres/port/atomics.h +93 -6
  256. data/ext/pg_query/include/postgres/port/pg_bitutils.h +91 -9
  257. data/ext/pg_query/include/postgres/port/pg_bswap.h +1 -1
  258. data/ext/pg_query/include/postgres/port/pg_crc32c.h +10 -1
  259. data/ext/pg_query/include/postgres/port/pg_iovec.h +117 -0
  260. data/ext/pg_query/include/postgres/port/simd.h +48 -1
  261. data/ext/pg_query/include/postgres/port/win32/sys/socket.h +8 -0
  262. data/ext/pg_query/include/postgres/port/win32_port.h +1 -11
  263. data/ext/pg_query/include/postgres/port.h +7 -3
  264. data/ext/pg_query/include/postgres/portability/instr_time.h +1 -1
  265. data/ext/pg_query/include/postgres/postgres.h +1 -1
  266. data/ext/pg_query/include/postgres/postmaster/autovacuum.h +5 -16
  267. data/ext/pg_query/include/postgres/postmaster/bgworker.h +8 -6
  268. data/ext/pg_query/include/postgres/postmaster/bgworker_internals.h +3 -7
  269. data/ext/pg_query/include/postgres/postmaster/bgwriter.h +3 -3
  270. data/ext/pg_query/include/postgres/postmaster/interrupt.h +1 -1
  271. data/ext/pg_query/include/postgres/postmaster/pgarch.h +2 -2
  272. data/ext/pg_query/include/postgres/postmaster/postmaster.h +25 -5
  273. data/ext/pg_query/include/postgres/postmaster/startup.h +2 -2
  274. data/ext/pg_query/include/postgres/postmaster/syslogger.h +2 -4
  275. data/ext/pg_query/include/postgres/postmaster/walsummarizer.h +35 -0
  276. data/ext/pg_query/include/postgres/postmaster/walwriter.h +2 -2
  277. data/ext/pg_query/include/postgres/regex/regex.h +92 -9
  278. data/ext/pg_query/include/postgres/replication/logicallauncher.h +1 -1
  279. data/ext/pg_query/include/postgres/replication/logicalproto.h +2 -2
  280. data/ext/pg_query/include/postgres/replication/logicalworker.h +2 -1
  281. data/ext/pg_query/include/postgres/replication/origin.h +1 -1
  282. data/ext/pg_query/include/postgres/replication/reorderbuffer.h +18 -28
  283. data/ext/pg_query/include/postgres/replication/slot.h +41 -5
  284. data/ext/pg_query/include/postgres/replication/slotsync.h +38 -0
  285. data/ext/pg_query/include/postgres/replication/syncrep.h +1 -1
  286. data/ext/pg_query/include/postgres/replication/walreceiver.h +37 -11
  287. data/ext/pg_query/include/postgres/replication/walsender.h +5 -3
  288. data/ext/pg_query/include/postgres/rewrite/prs2lock.h +1 -1
  289. data/ext/pg_query/include/postgres/rewrite/rewriteHandler.h +7 -1
  290. data/ext/pg_query/include/postgres/rewrite/rewriteManip.h +2 -2
  291. data/ext/pg_query/include/postgres/rewrite/rewriteSupport.h +1 -1
  292. data/ext/pg_query/include/postgres/storage/block.h +1 -1
  293. data/ext/pg_query/include/postgres/storage/buf.h +1 -1
  294. data/ext/pg_query/include/postgres/storage/bufmgr.h +59 -41
  295. data/ext/pg_query/include/postgres/storage/bufpage.h +1 -1
  296. data/ext/pg_query/include/postgres/storage/condition_variable.h +1 -1
  297. data/ext/pg_query/include/postgres/storage/dsm.h +1 -1
  298. data/ext/pg_query/include/postgres/storage/dsm_impl.h +2 -2
  299. data/ext/pg_query/include/postgres/storage/fd.h +30 -13
  300. data/ext/pg_query/include/postgres/storage/fileset.h +1 -1
  301. data/ext/pg_query/include/postgres/storage/ipc.h +4 -1
  302. data/ext/pg_query/include/postgres/storage/item.h +1 -1
  303. data/ext/pg_query/include/postgres/storage/itemid.h +1 -1
  304. data/ext/pg_query/include/postgres/storage/itemptr.h +1 -1
  305. data/ext/pg_query/include/postgres/storage/large_object.h +1 -1
  306. data/ext/pg_query/include/postgres/storage/latch.h +4 -2
  307. data/ext/pg_query/include/postgres/storage/lmgr.h +8 -2
  308. data/ext/pg_query/include/postgres/storage/lock.h +19 -19
  309. data/ext/pg_query/include/postgres/storage/lockdefs.h +1 -1
  310. data/ext/pg_query/include/postgres/storage/lwlock.h +17 -9
  311. data/ext/pg_query/include/postgres/storage/lwlocknames.h +7 -10
  312. data/ext/pg_query/include/postgres/storage/off.h +1 -1
  313. data/ext/pg_query/include/postgres/storage/pg_sema.h +1 -1
  314. data/ext/pg_query/include/postgres/storage/pg_shmem.h +5 -4
  315. data/ext/pg_query/include/postgres/storage/pmsignal.h +2 -2
  316. data/ext/pg_query/include/postgres/storage/predicate.h +1 -5
  317. data/ext/pg_query/include/postgres/storage/proc.h +48 -23
  318. data/ext/pg_query/include/postgres/storage/procarray.h +5 -1
  319. data/ext/pg_query/include/postgres/storage/proclist_types.h +11 -9
  320. data/ext/pg_query/include/postgres/storage/procnumber.h +43 -0
  321. data/ext/pg_query/include/postgres/storage/procsignal.h +8 -6
  322. data/ext/pg_query/include/postgres/storage/read_stream.h +65 -0
  323. data/ext/pg_query/include/postgres/storage/relfilelocator.h +16 -15
  324. data/ext/pg_query/include/postgres/storage/s_lock.h +7 -27
  325. data/ext/pg_query/include/postgres/storage/sharedfileset.h +1 -1
  326. data/ext/pg_query/include/postgres/storage/shm_mq.h +2 -2
  327. data/ext/pg_query/include/postgres/storage/shm_toc.h +1 -1
  328. data/ext/pg_query/include/postgres/storage/shmem.h +1 -1
  329. data/ext/pg_query/include/postgres/storage/sinval.h +3 -3
  330. data/ext/pg_query/include/postgres/storage/smgr.h +41 -27
  331. data/ext/pg_query/include/postgres/storage/spin.h +1 -1
  332. data/ext/pg_query/include/postgres/storage/standby.h +13 -3
  333. data/ext/pg_query/include/postgres/storage/standbydefs.h +2 -2
  334. data/ext/pg_query/include/postgres/storage/sync.h +4 -4
  335. data/ext/pg_query/include/postgres/tcop/cmdtag.h +1 -2
  336. data/ext/pg_query/include/postgres/tcop/cmdtaglist.h +3 -2
  337. data/ext/pg_query/include/postgres/tcop/deparse_utility.h +2 -2
  338. data/ext/pg_query/include/postgres/tcop/dest.h +3 -2
  339. data/ext/pg_query/include/postgres/tcop/fastpath.h +1 -1
  340. data/ext/pg_query/include/postgres/tcop/pquery.h +1 -1
  341. data/ext/pg_query/include/postgres/tcop/tcopprot.h +9 -5
  342. data/ext/pg_query/include/postgres/tcop/utility.h +2 -2
  343. data/ext/pg_query/include/postgres/tsearch/ts_cache.h +1 -1
  344. data/ext/pg_query/include/postgres/utils/acl.h +19 -7
  345. data/ext/pg_query/include/postgres/utils/aclchk_internal.h +1 -1
  346. data/ext/pg_query/include/postgres/utils/array.h +1 -2
  347. data/ext/pg_query/include/postgres/utils/ascii.h +84 -0
  348. data/ext/pg_query/include/postgres/utils/backend_progress.h +3 -2
  349. data/ext/pg_query/include/postgres/utils/backend_status.h +8 -10
  350. data/ext/pg_query/include/postgres/utils/builtins.h +4 -1
  351. data/ext/pg_query/include/postgres/utils/bytea.h +2 -2
  352. data/ext/pg_query/include/postgres/utils/catcache.h +5 -6
  353. data/ext/pg_query/include/postgres/utils/date.h +1 -1
  354. data/ext/pg_query/include/postgres/utils/datetime.h +4 -1
  355. data/ext/pg_query/include/postgres/utils/datum.h +1 -1
  356. data/ext/pg_query/include/postgres/utils/dsa.h +44 -5
  357. data/ext/pg_query/include/postgres/utils/elog.h +3 -8
  358. data/ext/pg_query/include/postgres/utils/errcodes.h +1 -3
  359. data/ext/pg_query/include/postgres/utils/expandeddatum.h +1 -1
  360. data/ext/pg_query/include/postgres/utils/expandedrecord.h +1 -1
  361. data/ext/pg_query/include/postgres/utils/float.h +1 -1
  362. data/ext/pg_query/include/postgres/utils/fmgroids.h +49 -16
  363. data/ext/pg_query/include/postgres/utils/fmgrprotos.h +47 -14
  364. data/ext/pg_query/include/postgres/utils/fmgrtab.h +1 -1
  365. data/ext/pg_query/include/postgres/utils/guc.h +20 -6
  366. data/ext/pg_query/include/postgres/utils/guc_hooks.h +23 -2
  367. data/ext/pg_query/include/postgres/utils/guc_tables.h +6 -5
  368. data/ext/pg_query/include/postgres/utils/hsearch.h +2 -2
  369. data/ext/pg_query/include/postgres/utils/injection_point.h +44 -0
  370. data/ext/pg_query/include/postgres/utils/inval.h +1 -1
  371. data/ext/pg_query/include/postgres/utils/logtape.h +5 -5
  372. data/ext/pg_query/include/postgres/utils/lsyscache.h +6 -3
  373. data/ext/pg_query/include/postgres/utils/memdebug.h +1 -1
  374. data/ext/pg_query/include/postgres/utils/memutils.h +12 -5
  375. data/ext/pg_query/include/postgres/utils/memutils_internal.h +53 -13
  376. data/ext/pg_query/include/postgres/utils/memutils_memorychunk.h +25 -9
  377. data/ext/pg_query/include/postgres/utils/numeric.h +6 -1
  378. data/ext/pg_query/include/postgres/utils/palloc.h +1 -15
  379. data/ext/pg_query/include/postgres/utils/partcache.h +1 -1
  380. data/ext/pg_query/include/postgres/utils/pg_locale.h +8 -7
  381. data/ext/pg_query/include/postgres/utils/pgstat_internal.h +11 -17
  382. data/ext/pg_query/include/postgres/utils/plancache.h +5 -3
  383. data/ext/pg_query/include/postgres/utils/portal.h +9 -9
  384. data/ext/pg_query/include/postgres/utils/queryenvironment.h +2 -2
  385. data/ext/pg_query/include/postgres/utils/regproc.h +1 -1
  386. data/ext/pg_query/include/postgres/utils/rel.h +14 -15
  387. data/ext/pg_query/include/postgres/utils/relcache.h +2 -5
  388. data/ext/pg_query/include/postgres/utils/reltrigger.h +1 -1
  389. data/ext/pg_query/include/postgres/utils/resowner.h +90 -9
  390. data/ext/pg_query/include/postgres/utils/ruleutils.h +1 -1
  391. data/ext/pg_query/include/postgres/utils/sharedtuplestore.h +1 -1
  392. data/ext/pg_query/include/postgres/utils/snapmgr.h +1 -52
  393. data/ext/pg_query/include/postgres/utils/snapshot.h +2 -2
  394. data/ext/pg_query/include/postgres/utils/sortsupport.h +1 -1
  395. data/ext/pg_query/include/postgres/utils/syscache.h +2 -98
  396. data/ext/pg_query/include/postgres/utils/timeout.h +3 -2
  397. data/ext/pg_query/include/postgres/utils/timestamp.h +1 -1
  398. data/ext/pg_query/include/postgres/utils/tuplesort.h +36 -9
  399. data/ext/pg_query/include/postgres/utils/tuplestore.h +2 -5
  400. data/ext/pg_query/include/postgres/utils/typcache.h +2 -1
  401. data/ext/pg_query/include/postgres/utils/varlena.h +1 -1
  402. data/ext/pg_query/include/postgres/utils/wait_event.h +28 -214
  403. data/ext/pg_query/include/postgres/utils/wait_event_types.h +218 -0
  404. data/ext/pg_query/include/postgres/utils/xml.h +4 -4
  405. data/ext/pg_query/include/postgres/varatt.h +1 -1
  406. data/ext/pg_query/include/protobuf/pg_query.pb-c.h +1546 -792
  407. data/ext/pg_query/include/protobuf/pg_query.pb.h +58365 -46595
  408. data/ext/pg_query/pg_query.pb-c.c +6598 -3739
  409. data/ext/pg_query/pg_query_normalize.c +42 -1
  410. data/ext/pg_query/pg_query_outfuncs_json.c +3 -1
  411. data/ext/pg_query/pg_query_parse_plpgsql.c +12 -13
  412. data/ext/pg_query/pg_query_readfuncs_protobuf.c +2 -2
  413. data/ext/pg_query/pg_query_ruby_freebsd.sym +0 -1
  414. data/ext/pg_query/pg_query_scan.c +1 -1
  415. data/ext/pg_query/postgres_deparse.c +409 -21
  416. data/ext/pg_query/src_backend_catalog_namespace.c +241 -66
  417. data/ext/pg_query/src_backend_catalog_pg_proc.c +1 -3
  418. data/ext/pg_query/src_backend_commands_define.c +2 -3
  419. data/ext/pg_query/src_backend_nodes_bitmapset.c +137 -94
  420. data/ext/pg_query/src_backend_nodes_copyfuncs.c +1 -1
  421. data/ext/pg_query/src_backend_nodes_equalfuncs.c +1 -1
  422. data/ext/pg_query/src_backend_nodes_extensible.c +1 -1
  423. data/ext/pg_query/src_backend_nodes_list.c +3 -7
  424. data/ext/pg_query/src_backend_nodes_makefuncs.c +59 -20
  425. data/ext/pg_query/src_backend_nodes_nodeFuncs.c +109 -2
  426. data/ext/pg_query/src_backend_nodes_value.c +1 -1
  427. data/ext/pg_query/src_backend_parser_gram.c +34490 -32135
  428. data/ext/pg_query/src_backend_parser_parser.c +8 -8
  429. data/ext/pg_query/src_backend_parser_scan.c +5637 -3028
  430. data/ext/pg_query/src_backend_parser_scansup.c +2 -1
  431. data/ext/pg_query/src_backend_storage_ipc_ipc.c +1 -1
  432. data/ext/pg_query/src_backend_tcop_postgres.c +34 -10
  433. data/ext/pg_query/src_backend_utils_activity_pgstat_database.c +2 -2
  434. data/ext/pg_query/src_backend_utils_adt_datum.c +8 -6
  435. data/ext/pg_query/src_backend_utils_adt_expandeddatum.c +1 -1
  436. data/ext/pg_query/src_backend_utils_adt_format_type.c +1 -1
  437. data/ext/pg_query/src_backend_utils_adt_numutils.c +4 -5
  438. data/ext/pg_query/src_backend_utils_adt_ruleutils.c +101 -28
  439. data/ext/pg_query/src_backend_utils_error_assert.c +1 -1
  440. data/ext/pg_query/src_backend_utils_error_elog.c +47 -42
  441. data/ext/pg_query/src_backend_utils_fmgr_fmgr.c +4 -2
  442. data/ext/pg_query/src_backend_utils_init_globals.c +15 -3
  443. data/ext/pg_query/src_backend_utils_mb_mbutils.c +11 -18
  444. data/ext/pg_query/src_backend_utils_misc_guc_tables.c +16 -6
  445. data/ext/pg_query/src_backend_utils_mmgr_alignedalloc.c +8 -5
  446. data/ext/pg_query/src_backend_utils_mmgr_aset.c +308 -238
  447. data/ext/pg_query/src_backend_utils_mmgr_bump.c +728 -0
  448. data/ext/pg_query/src_backend_utils_mmgr_generation.c +273 -197
  449. data/ext/pg_query/src_backend_utils_mmgr_mcxt.c +270 -215
  450. data/ext/pg_query/src_backend_utils_mmgr_slab.c +154 -96
  451. data/ext/pg_query/src_common_encnames.c +43 -44
  452. data/ext/pg_query/src_common_hashfn.c +1 -1
  453. data/ext/pg_query/src_common_keywords.c +1 -1
  454. data/ext/pg_query/src_common_kwlist_d.h +511 -466
  455. data/ext/pg_query/src_common_kwlookup.c +1 -1
  456. data/ext/pg_query/src_common_psprintf.c +3 -3
  457. data/ext/pg_query/src_common_stringinfo.c +18 -1
  458. data/ext/pg_query/src_common_wchar.c +45 -108
  459. data/ext/pg_query/src_pl_plpgsql_src_pl_comp.c +99 -5
  460. data/ext/pg_query/src_pl_plpgsql_src_pl_funcs.c +1 -1
  461. data/ext/pg_query/src_pl_plpgsql_src_pl_gram.c +242 -143
  462. data/ext/pg_query/src_pl_plpgsql_src_pl_handler.c +1 -1
  463. data/ext/pg_query/src_pl_plpgsql_src_pl_reserved_kwlist_d.h +1 -1
  464. data/ext/pg_query/src_pl_plpgsql_src_pl_scanner.c +19 -1
  465. data/ext/pg_query/src_pl_plpgsql_src_pl_unreserved_kwlist_d.h +1 -1
  466. data/ext/pg_query/src_port_pg_bitutils.c +173 -28
  467. data/ext/pg_query/src_port_pgstrcasecmp.c +29 -1
  468. data/ext/pg_query/src_port_snprintf.c +1 -1
  469. data/ext/pg_query/src_port_strerror.c +1 -3
  470. data/ext/pg_query/src_port_strlcpy.c +1 -1
  471. data/lib/pg_query/param_refs.rb +1 -1
  472. data/lib/pg_query/pg_query_pb.rb +26 -3
  473. data/lib/pg_query/treewalker.rb +38 -11
  474. data/lib/pg_query/truncate.rb +1 -1
  475. data/lib/pg_query/version.rb +1 -1
  476. metadata +25 -11
  477. data/ext/pg_query/include/postgres/storage/backendid.h +0 -37
  478. data/ext/pg_query/include/postgres/storage/sinvaladt.h +0 -45
  479. data/ext/pg_query/src_backend_nodes_nodes.c +0 -38
@@ -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)