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
@@ -1,7 +1,10 @@
1
1
  /*--------------------------------------------------------------------
2
2
  * Symbols referenced in this file:
3
3
  * - AllocSetAlloc
4
+ * - AllocSetAllocLarge
4
5
  * - AllocSetFreeIndex
6
+ * - AllocSetAllocFromNewBlock
7
+ * - AllocSetAllocChunkFromBlock
5
8
  * - AllocSetFree
6
9
  * - AllocSetRealloc
7
10
  * - AllocSetReset
@@ -26,7 +29,7 @@
26
29
  * type.
27
30
  *
28
31
  *
29
- * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group
32
+ * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group
30
33
  * Portions Copyright (c) 1994, Regents of the University of California
31
34
  *
32
35
  * IDENTIFICATION
@@ -68,8 +71,8 @@
68
71
  #include "port/pg_bitutils.h"
69
72
  #include "utils/memdebug.h"
70
73
  #include "utils/memutils.h"
71
- #include "utils/memutils_memorychunk.h"
72
74
  #include "utils/memutils_internal.h"
75
+ #include "utils/memutils_memorychunk.h"
73
76
 
74
77
  /*--------------------
75
78
  * Chunk freelist k holds chunks of size 1 << (k + ALLOC_MINBITS),
@@ -175,11 +178,10 @@ typedef struct AllocSetContext
175
178
  AllocBlock blocks; /* head of list of blocks in this set */
176
179
  MemoryChunk *freelist[ALLOCSET_NUM_FREELISTS]; /* free chunk lists */
177
180
  /* Allocation parameters for this context: */
178
- Size initBlockSize; /* initial block size */
179
- Size maxBlockSize; /* maximum block size */
180
- Size nextBlockSize; /* next block size to allocate */
181
- Size allocChunkLimit; /* effective chunk size limit */
182
- AllocBlock keeper; /* keep this block over resets */
181
+ uint32 initBlockSize; /* initial block size */
182
+ uint32 maxBlockSize; /* maximum block size */
183
+ uint32 nextBlockSize; /* next block size to allocate */
184
+ uint32 allocChunkLimit; /* effective chunk size limit */
183
185
  /* freelist this context could be put in, or -1 if not a candidate: */
184
186
  int freeListIndex; /* index in context_freelists[], or -1 */
185
187
  } AllocSetContext;
@@ -260,6 +262,13 @@ typedef struct AllocBlockData
260
262
  */
261
263
  #define MAX_FREE_CONTEXTS 100 /* arbitrary limit on freelist length */
262
264
 
265
+ /* Obtain the keeper block for an allocation set */
266
+ #define KeeperBlock(set) \
267
+ ((AllocBlock) (((char *) set) + MAXALIGN(sizeof(AllocSetContext))))
268
+
269
+ /* Check if the block is the keeper block of the given allocation set */
270
+ #define IsKeeperBlock(set, block) ((block) == (KeeperBlock(set)))
271
+
263
272
  typedef struct AllocSetFreeList
264
273
  {
265
274
  int num_free; /* current list length */
@@ -437,7 +446,7 @@ AllocSetContextCreateInternal(MemoryContext parent,
437
446
  name);
438
447
 
439
448
  ((MemoryContext) set)->mem_allocated =
440
- set->keeper->endptr - ((char *) set);
449
+ KeeperBlock(set)->endptr - ((char *) set);
441
450
 
442
451
  return (MemoryContext) set;
443
452
  }
@@ -473,7 +482,7 @@ AllocSetContextCreateInternal(MemoryContext parent,
473
482
  */
474
483
 
475
484
  /* Fill in the initial block's block header */
476
- block = (AllocBlock) (((char *) set) + MAXALIGN(sizeof(AllocSetContext)));
485
+ block = KeeperBlock(set);
477
486
  block->aset = set;
478
487
  block->freeptr = ((char *) block) + ALLOC_BLOCKHDRSZ;
479
488
  block->endptr = ((char *) set) + firstBlockSize;
@@ -485,15 +494,13 @@ AllocSetContextCreateInternal(MemoryContext parent,
485
494
 
486
495
  /* Remember block as part of block list */
487
496
  set->blocks = block;
488
- /* Mark block as not to be released at reset time */
489
- set->keeper = block;
490
497
 
491
498
  /* Finish filling in aset-specific parts of the context header */
492
499
  MemSetAligned(set->freelist, 0, sizeof(set->freelist));
493
500
 
494
- set->initBlockSize = initBlockSize;
495
- set->maxBlockSize = maxBlockSize;
496
- set->nextBlockSize = initBlockSize;
501
+ set->initBlockSize = (uint32) initBlockSize;
502
+ set->maxBlockSize = (uint32) maxBlockSize;
503
+ set->nextBlockSize = (uint32) initBlockSize;
497
504
  set->freeListIndex = freeListIndex;
498
505
 
499
506
  /*
@@ -564,7 +571,7 @@ AllocSetReset(MemoryContext context)
564
571
  #endif
565
572
 
566
573
  /* Remember keeper block size for Assert below */
567
- keepersize = set->keeper->endptr - ((char *) set);
574
+ keepersize = KeeperBlock(set)->endptr - ((char *) set);
568
575
 
569
576
  /* Clear chunk freelists */
570
577
  MemSetAligned(set->freelist, 0, sizeof(set->freelist));
@@ -572,13 +579,13 @@ AllocSetReset(MemoryContext context)
572
579
  block = set->blocks;
573
580
 
574
581
  /* New blocks list will be just the keeper block */
575
- set->blocks = set->keeper;
582
+ set->blocks = KeeperBlock(set);
576
583
 
577
584
  while (block != NULL)
578
585
  {
579
586
  AllocBlock next = block->next;
580
587
 
581
- if (block == set->keeper)
588
+ if (IsKeeperBlock(set, block))
582
589
  {
583
590
  /* Reset the block, but don't return it to malloc */
584
591
  char *datastart = ((char *) block) + ALLOC_BLOCKHDRSZ;
@@ -634,7 +641,7 @@ AllocSetDelete(MemoryContext context)
634
641
  #endif
635
642
 
636
643
  /* Remember keeper block size for Assert below */
637
- keepersize = set->keeper->endptr - ((char *) set);
644
+ keepersize = KeeperBlock(set)->endptr - ((char *) set);
638
645
 
639
646
  /*
640
647
  * If the context is a candidate for a freelist, put it into that freelist
@@ -683,14 +690,14 @@ AllocSetDelete(MemoryContext context)
683
690
  {
684
691
  AllocBlock next = block->next;
685
692
 
686
- if (block != set->keeper)
693
+ if (!IsKeeperBlock(set, block))
687
694
  context->mem_allocated -= block->endptr - ((char *) block);
688
695
 
689
696
  #ifdef CLOBBER_FREED_MEMORY
690
697
  wipe_mem(block, block->freeptr - ((char *) block));
691
698
  #endif
692
699
 
693
- if (block != set->keeper)
700
+ if (!IsKeeperBlock(set, block))
694
701
  free(block);
695
702
 
696
703
  block = next;
@@ -703,98 +710,304 @@ AllocSetDelete(MemoryContext context)
703
710
  }
704
711
 
705
712
  /*
706
- * AllocSetAlloc
707
- * Returns pointer to allocated memory of given size or NULL if
708
- * request could not be completed; memory is added to the set.
709
- *
710
- * No request may exceed:
711
- * MAXALIGN_DOWN(SIZE_MAX) - ALLOC_BLOCKHDRSZ - ALLOC_CHUNKHDRSZ
712
- * All callers use a much-lower limit.
713
+ * Helper for AllocSetAlloc() that allocates an entire block for the chunk.
713
714
  *
714
- * Note: when using valgrind, it doesn't matter how the returned allocation
715
- * is marked, as mcxt.c will set it to UNDEFINED. In some paths we will
716
- * return space that is marked NOACCESS - AllocSetRealloc has to beware!
715
+ * AllocSetAlloc()'s comment explains why this is separate.
717
716
  */
718
- void *
719
- AllocSetAlloc(MemoryContext context, Size size)
717
+ pg_noinline
718
+ static void *
719
+ AllocSetAllocLarge(MemoryContext context, Size size, int flags)
720
720
  {
721
721
  AllocSet set = (AllocSet) context;
722
722
  AllocBlock block;
723
723
  MemoryChunk *chunk;
724
- int fidx;
725
724
  Size chunk_size;
726
725
  Size blksize;
727
726
 
728
- Assert(AllocSetIsValid(set));
727
+ /* validate 'size' is within the limits for the given 'flags' */
728
+ MemoryContextCheckSize(context, size, flags);
729
729
 
730
- /*
731
- * If requested size exceeds maximum for chunks, allocate an entire block
732
- * for this request.
733
- */
734
- if (size > set->allocChunkLimit)
735
- {
736
730
  #ifdef MEMORY_CONTEXT_CHECKING
737
- /* ensure there's always space for the sentinel byte */
738
- chunk_size = MAXALIGN(size + 1);
731
+ /* ensure there's always space for the sentinel byte */
732
+ chunk_size = MAXALIGN(size + 1);
739
733
  #else
740
- chunk_size = MAXALIGN(size);
734
+ chunk_size = MAXALIGN(size);
741
735
  #endif
742
736
 
743
- blksize = chunk_size + ALLOC_BLOCKHDRSZ + ALLOC_CHUNKHDRSZ;
744
- block = (AllocBlock) malloc(blksize);
745
- if (block == NULL)
746
- return NULL;
737
+ blksize = chunk_size + ALLOC_BLOCKHDRSZ + ALLOC_CHUNKHDRSZ;
738
+ block = (AllocBlock) malloc(blksize);
739
+ if (block == NULL)
740
+ return MemoryContextAllocationFailure(context, size, flags);
747
741
 
748
- context->mem_allocated += blksize;
742
+ context->mem_allocated += blksize;
749
743
 
750
- block->aset = set;
751
- block->freeptr = block->endptr = ((char *) block) + blksize;
744
+ block->aset = set;
745
+ block->freeptr = block->endptr = ((char *) block) + blksize;
752
746
 
753
- chunk = (MemoryChunk *) (((char *) block) + ALLOC_BLOCKHDRSZ);
747
+ chunk = (MemoryChunk *) (((char *) block) + ALLOC_BLOCKHDRSZ);
754
748
 
755
- /* mark the MemoryChunk as externally managed */
756
- MemoryChunkSetHdrMaskExternal(chunk, MCTX_ASET_ID);
749
+ /* mark the MemoryChunk as externally managed */
750
+ MemoryChunkSetHdrMaskExternal(chunk, MCTX_ASET_ID);
757
751
 
758
752
  #ifdef MEMORY_CONTEXT_CHECKING
759
- chunk->requested_size = size;
760
- /* set mark to catch clobber of "unused" space */
761
- Assert(size < chunk_size);
753
+ chunk->requested_size = size;
754
+ /* set mark to catch clobber of "unused" space */
755
+ Assert(size < chunk_size);
756
+ set_sentinel(MemoryChunkGetPointer(chunk), size);
757
+ #endif
758
+ #ifdef RANDOMIZE_ALLOCATED_MEMORY
759
+ /* fill the allocated space with junk */
760
+ randomize_mem((char *) MemoryChunkGetPointer(chunk), size);
761
+ #endif
762
+
763
+ /*
764
+ * Stick the new block underneath the active allocation block, if any, so
765
+ * that we don't lose the use of the space remaining therein.
766
+ */
767
+ if (set->blocks != NULL)
768
+ {
769
+ block->prev = set->blocks;
770
+ block->next = set->blocks->next;
771
+ if (block->next)
772
+ block->next->prev = block;
773
+ set->blocks->next = block;
774
+ }
775
+ else
776
+ {
777
+ block->prev = NULL;
778
+ block->next = NULL;
779
+ set->blocks = block;
780
+ }
781
+
782
+ /* Ensure any padding bytes are marked NOACCESS. */
783
+ VALGRIND_MAKE_MEM_NOACCESS((char *) MemoryChunkGetPointer(chunk) + size,
784
+ chunk_size - size);
785
+
786
+ /* Disallow access to the chunk header. */
787
+ VALGRIND_MAKE_MEM_NOACCESS(chunk, ALLOC_CHUNKHDRSZ);
788
+
789
+ return MemoryChunkGetPointer(chunk);
790
+ }
791
+
792
+ /*
793
+ * Small helper for allocating a new chunk from a chunk, to avoid duplicating
794
+ * the code between AllocSetAlloc() and AllocSetAllocFromNewBlock().
795
+ */
796
+ static inline void *
797
+ AllocSetAllocChunkFromBlock(MemoryContext context, AllocBlock block,
798
+ Size size, Size chunk_size, int fidx)
799
+ {
800
+ MemoryChunk *chunk;
801
+
802
+ chunk = (MemoryChunk *) (block->freeptr);
803
+
804
+ /* Prepare to initialize the chunk header. */
805
+ VALGRIND_MAKE_MEM_UNDEFINED(chunk, ALLOC_CHUNKHDRSZ);
806
+
807
+ block->freeptr += (chunk_size + ALLOC_CHUNKHDRSZ);
808
+ Assert(block->freeptr <= block->endptr);
809
+
810
+ /* store the free list index in the value field */
811
+ MemoryChunkSetHdrMask(chunk, block, fidx, MCTX_ASET_ID);
812
+
813
+ #ifdef MEMORY_CONTEXT_CHECKING
814
+ chunk->requested_size = size;
815
+ /* set mark to catch clobber of "unused" space */
816
+ if (size < chunk_size)
762
817
  set_sentinel(MemoryChunkGetPointer(chunk), size);
763
818
  #endif
764
819
  #ifdef RANDOMIZE_ALLOCATED_MEMORY
765
- /* fill the allocated space with junk */
766
- randomize_mem((char *) MemoryChunkGetPointer(chunk), size);
820
+ /* fill the allocated space with junk */
821
+ randomize_mem((char *) MemoryChunkGetPointer(chunk), size);
767
822
  #endif
768
823
 
824
+ /* Ensure any padding bytes are marked NOACCESS. */
825
+ VALGRIND_MAKE_MEM_NOACCESS((char *) MemoryChunkGetPointer(chunk) + size,
826
+ chunk_size - size);
827
+
828
+ /* Disallow access to the chunk header. */
829
+ VALGRIND_MAKE_MEM_NOACCESS(chunk, ALLOC_CHUNKHDRSZ);
830
+
831
+ return MemoryChunkGetPointer(chunk);
832
+ }
833
+
834
+ /*
835
+ * Helper for AllocSetAlloc() that allocates a new block and returns a chunk
836
+ * allocated from it.
837
+ *
838
+ * AllocSetAlloc()'s comment explains why this is separate.
839
+ */
840
+ pg_noinline
841
+ static void *
842
+ AllocSetAllocFromNewBlock(MemoryContext context, Size size, int flags,
843
+ int fidx)
844
+ {
845
+ AllocSet set = (AllocSet) context;
846
+ AllocBlock block;
847
+ Size availspace;
848
+ Size blksize;
849
+ Size required_size;
850
+ Size chunk_size;
851
+
852
+ /* due to the keeper block set->blocks should always be valid */
853
+ Assert(set->blocks != NULL);
854
+ block = set->blocks;
855
+ availspace = block->endptr - block->freeptr;
856
+
857
+ /*
858
+ * The existing active (top) block does not have enough room for the
859
+ * requested allocation, but it might still have a useful amount of space
860
+ * in it. Once we push it down in the block list, we'll never try to
861
+ * allocate more space from it. So, before we do that, carve up its free
862
+ * space into chunks that we can put on the set's freelists.
863
+ *
864
+ * Because we can only get here when there's less than ALLOC_CHUNK_LIMIT
865
+ * left in the block, this loop cannot iterate more than
866
+ * ALLOCSET_NUM_FREELISTS-1 times.
867
+ */
868
+ while (availspace >= ((1 << ALLOC_MINBITS) + ALLOC_CHUNKHDRSZ))
869
+ {
870
+ AllocFreeListLink *link;
871
+ MemoryChunk *chunk;
872
+ Size availchunk = availspace - ALLOC_CHUNKHDRSZ;
873
+ int a_fidx = AllocSetFreeIndex(availchunk);
874
+
769
875
  /*
770
- * Stick the new block underneath the active allocation block, if any,
771
- * so that we don't lose the use of the space remaining therein.
876
+ * In most cases, we'll get back the index of the next larger freelist
877
+ * than the one we need to put this chunk on. The exception is when
878
+ * availchunk is exactly a power of 2.
772
879
  */
773
- if (set->blocks != NULL)
774
- {
775
- block->prev = set->blocks;
776
- block->next = set->blocks->next;
777
- if (block->next)
778
- block->next->prev = block;
779
- set->blocks->next = block;
780
- }
781
- else
880
+ if (availchunk != GetChunkSizeFromFreeListIdx(a_fidx))
782
881
  {
783
- block->prev = NULL;
784
- block->next = NULL;
785
- set->blocks = block;
882
+ a_fidx--;
883
+ Assert(a_fidx >= 0);
884
+ availchunk = GetChunkSizeFromFreeListIdx(a_fidx);
786
885
  }
787
886
 
788
- /* Ensure any padding bytes are marked NOACCESS. */
789
- VALGRIND_MAKE_MEM_NOACCESS((char *) MemoryChunkGetPointer(chunk) + size,
790
- chunk_size - size);
887
+ chunk = (MemoryChunk *) (block->freeptr);
791
888
 
792
- /* Disallow access to the chunk header. */
793
- VALGRIND_MAKE_MEM_NOACCESS(chunk, ALLOC_CHUNKHDRSZ);
889
+ /* Prepare to initialize the chunk header. */
890
+ VALGRIND_MAKE_MEM_UNDEFINED(chunk, ALLOC_CHUNKHDRSZ);
891
+ block->freeptr += (availchunk + ALLOC_CHUNKHDRSZ);
892
+ availspace -= (availchunk + ALLOC_CHUNKHDRSZ);
794
893
 
795
- return MemoryChunkGetPointer(chunk);
894
+ /* store the freelist index in the value field */
895
+ MemoryChunkSetHdrMask(chunk, block, a_fidx, MCTX_ASET_ID);
896
+ #ifdef MEMORY_CONTEXT_CHECKING
897
+ chunk->requested_size = InvalidAllocSize; /* mark it free */
898
+ #endif
899
+ /* push this chunk onto the free list */
900
+ link = GetFreeListLink(chunk);
901
+
902
+ VALGRIND_MAKE_MEM_DEFINED(link, sizeof(AllocFreeListLink));
903
+ link->next = set->freelist[a_fidx];
904
+ VALGRIND_MAKE_MEM_NOACCESS(link, sizeof(AllocFreeListLink));
905
+
906
+ set->freelist[a_fidx] = chunk;
907
+ }
908
+
909
+ /*
910
+ * The first such block has size initBlockSize, and we double the space in
911
+ * each succeeding block, but not more than maxBlockSize.
912
+ */
913
+ blksize = set->nextBlockSize;
914
+ set->nextBlockSize <<= 1;
915
+ if (set->nextBlockSize > set->maxBlockSize)
916
+ set->nextBlockSize = set->maxBlockSize;
917
+
918
+ /* Choose the actual chunk size to allocate */
919
+ chunk_size = GetChunkSizeFromFreeListIdx(fidx);
920
+ Assert(chunk_size >= size);
921
+
922
+ /*
923
+ * If initBlockSize is less than ALLOC_CHUNK_LIMIT, we could need more
924
+ * space... but try to keep it a power of 2.
925
+ */
926
+ required_size = chunk_size + ALLOC_BLOCKHDRSZ + ALLOC_CHUNKHDRSZ;
927
+ while (blksize < required_size)
928
+ blksize <<= 1;
929
+
930
+ /* Try to allocate it */
931
+ block = (AllocBlock) malloc(blksize);
932
+
933
+ /*
934
+ * We could be asking for pretty big blocks here, so cope if malloc fails.
935
+ * But give up if there's less than 1 MB or so available...
936
+ */
937
+ while (block == NULL && blksize > 1024 * 1024)
938
+ {
939
+ blksize >>= 1;
940
+ if (blksize < required_size)
941
+ break;
942
+ block = (AllocBlock) malloc(blksize);
796
943
  }
797
944
 
945
+ if (block == NULL)
946
+ return MemoryContextAllocationFailure(context, size, flags);
947
+
948
+ context->mem_allocated += blksize;
949
+
950
+ block->aset = set;
951
+ block->freeptr = ((char *) block) + ALLOC_BLOCKHDRSZ;
952
+ block->endptr = ((char *) block) + blksize;
953
+
954
+ /* Mark unallocated space NOACCESS. */
955
+ VALGRIND_MAKE_MEM_NOACCESS(block->freeptr,
956
+ blksize - ALLOC_BLOCKHDRSZ);
957
+
958
+ block->prev = NULL;
959
+ block->next = set->blocks;
960
+ if (block->next)
961
+ block->next->prev = block;
962
+ set->blocks = block;
963
+
964
+ return AllocSetAllocChunkFromBlock(context, block, size, chunk_size, fidx);
965
+ }
966
+
967
+ /*
968
+ * AllocSetAlloc
969
+ * Returns a pointer to allocated memory of given size or raises an ERROR
970
+ * on allocation failure, or returns NULL when flags contains
971
+ * MCXT_ALLOC_NO_OOM.
972
+ *
973
+ * No request may exceed:
974
+ * MAXALIGN_DOWN(SIZE_MAX) - ALLOC_BLOCKHDRSZ - ALLOC_CHUNKHDRSZ
975
+ * All callers use a much-lower limit.
976
+ *
977
+ * Note: when using valgrind, it doesn't matter how the returned allocation
978
+ * is marked, as mcxt.c will set it to UNDEFINED. In some paths we will
979
+ * return space that is marked NOACCESS - AllocSetRealloc has to beware!
980
+ *
981
+ * This function should only contain the most common code paths. Everything
982
+ * else should be in pg_noinline helper functions, thus avoiding the overhead
983
+ * of creating a stack frame for the common cases. Allocating memory is often
984
+ * a bottleneck in many workloads, so avoiding stack frame setup is
985
+ * worthwhile. Helper functions should always directly return the newly
986
+ * allocated memory so that we can just return that address directly as a tail
987
+ * call.
988
+ */
989
+ void *
990
+ AllocSetAlloc(MemoryContext context, Size size, int flags)
991
+ {
992
+ AllocSet set = (AllocSet) context;
993
+ AllocBlock block;
994
+ MemoryChunk *chunk;
995
+ int fidx;
996
+ Size chunk_size;
997
+ Size availspace;
998
+
999
+ Assert(AllocSetIsValid(set));
1000
+
1001
+ /* due to the keeper block set->blocks should never be NULL */
1002
+ Assert(set->blocks != NULL);
1003
+
1004
+ /*
1005
+ * If requested size exceeds maximum for chunks we hand the request off to
1006
+ * AllocSetAllocLarge().
1007
+ */
1008
+ if (size > set->allocChunkLimit)
1009
+ return AllocSetAllocLarge(context, size, flags);
1010
+
798
1011
  /*
799
1012
  * Request is small enough to be treated as a chunk. Look in the
800
1013
  * corresponding free list to see if there is a free chunk we could reuse.
@@ -850,164 +1063,18 @@ AllocSetAlloc(MemoryContext context, Size size)
850
1063
  chunk_size = GetChunkSizeFromFreeListIdx(fidx);
851
1064
  Assert(chunk_size >= size);
852
1065
 
1066
+ block = set->blocks;
1067
+ availspace = block->endptr - block->freeptr;
1068
+
853
1069
  /*
854
1070
  * If there is enough room in the active allocation block, we will put the
855
1071
  * chunk into that block. Else must start a new one.
856
1072
  */
857
- if ((block = set->blocks) != NULL)
858
- {
859
- Size availspace = block->endptr - block->freeptr;
860
-
861
- if (availspace < (chunk_size + ALLOC_CHUNKHDRSZ))
862
- {
863
- /*
864
- * The existing active (top) block does not have enough room for
865
- * the requested allocation, but it might still have a useful
866
- * amount of space in it. Once we push it down in the block list,
867
- * we'll never try to allocate more space from it. So, before we
868
- * do that, carve up its free space into chunks that we can put on
869
- * the set's freelists.
870
- *
871
- * Because we can only get here when there's less than
872
- * ALLOC_CHUNK_LIMIT left in the block, this loop cannot iterate
873
- * more than ALLOCSET_NUM_FREELISTS-1 times.
874
- */
875
- while (availspace >= ((1 << ALLOC_MINBITS) + ALLOC_CHUNKHDRSZ))
876
- {
877
- AllocFreeListLink *link;
878
- Size availchunk = availspace - ALLOC_CHUNKHDRSZ;
879
- int a_fidx = AllocSetFreeIndex(availchunk);
880
-
881
- /*
882
- * In most cases, we'll get back the index of the next larger
883
- * freelist than the one we need to put this chunk on. The
884
- * exception is when availchunk is exactly a power of 2.
885
- */
886
- if (availchunk != GetChunkSizeFromFreeListIdx(a_fidx))
887
- {
888
- a_fidx--;
889
- Assert(a_fidx >= 0);
890
- availchunk = GetChunkSizeFromFreeListIdx(a_fidx);
891
- }
892
-
893
- chunk = (MemoryChunk *) (block->freeptr);
894
-
895
- /* Prepare to initialize the chunk header. */
896
- VALGRIND_MAKE_MEM_UNDEFINED(chunk, ALLOC_CHUNKHDRSZ);
897
- block->freeptr += (availchunk + ALLOC_CHUNKHDRSZ);
898
- availspace -= (availchunk + ALLOC_CHUNKHDRSZ);
899
-
900
- /* store the freelist index in the value field */
901
- MemoryChunkSetHdrMask(chunk, block, a_fidx, MCTX_ASET_ID);
902
- #ifdef MEMORY_CONTEXT_CHECKING
903
- chunk->requested_size = InvalidAllocSize; /* mark it free */
904
- #endif
905
- /* push this chunk onto the free list */
906
- link = GetFreeListLink(chunk);
1073
+ if (unlikely(availspace < (chunk_size + ALLOC_CHUNKHDRSZ)))
1074
+ return AllocSetAllocFromNewBlock(context, size, flags, fidx);
907
1075
 
908
- VALGRIND_MAKE_MEM_DEFINED(link, sizeof(AllocFreeListLink));
909
- link->next = set->freelist[a_fidx];
910
- VALGRIND_MAKE_MEM_NOACCESS(link, sizeof(AllocFreeListLink));
911
-
912
- set->freelist[a_fidx] = chunk;
913
- }
914
- /* Mark that we need to create a new block */
915
- block = NULL;
916
- }
917
- }
918
-
919
- /*
920
- * Time to create a new regular (multi-chunk) block?
921
- */
922
- if (block == NULL)
923
- {
924
- Size required_size;
925
-
926
- /*
927
- * The first such block has size initBlockSize, and we double the
928
- * space in each succeeding block, but not more than maxBlockSize.
929
- */
930
- blksize = set->nextBlockSize;
931
- set->nextBlockSize <<= 1;
932
- if (set->nextBlockSize > set->maxBlockSize)
933
- set->nextBlockSize = set->maxBlockSize;
934
-
935
- /*
936
- * If initBlockSize is less than ALLOC_CHUNK_LIMIT, we could need more
937
- * space... but try to keep it a power of 2.
938
- */
939
- required_size = chunk_size + ALLOC_BLOCKHDRSZ + ALLOC_CHUNKHDRSZ;
940
- while (blksize < required_size)
941
- blksize <<= 1;
942
-
943
- /* Try to allocate it */
944
- block = (AllocBlock) malloc(blksize);
945
-
946
- /*
947
- * We could be asking for pretty big blocks here, so cope if malloc
948
- * fails. But give up if there's less than 1 MB or so available...
949
- */
950
- while (block == NULL && blksize > 1024 * 1024)
951
- {
952
- blksize >>= 1;
953
- if (blksize < required_size)
954
- break;
955
- block = (AllocBlock) malloc(blksize);
956
- }
957
-
958
- if (block == NULL)
959
- return NULL;
960
-
961
- context->mem_allocated += blksize;
962
-
963
- block->aset = set;
964
- block->freeptr = ((char *) block) + ALLOC_BLOCKHDRSZ;
965
- block->endptr = ((char *) block) + blksize;
966
-
967
- /* Mark unallocated space NOACCESS. */
968
- VALGRIND_MAKE_MEM_NOACCESS(block->freeptr,
969
- blksize - ALLOC_BLOCKHDRSZ);
970
-
971
- block->prev = NULL;
972
- block->next = set->blocks;
973
- if (block->next)
974
- block->next->prev = block;
975
- set->blocks = block;
976
- }
977
-
978
- /*
979
- * OK, do the allocation
980
- */
981
- chunk = (MemoryChunk *) (block->freeptr);
982
-
983
- /* Prepare to initialize the chunk header. */
984
- VALGRIND_MAKE_MEM_UNDEFINED(chunk, ALLOC_CHUNKHDRSZ);
985
-
986
- block->freeptr += (chunk_size + ALLOC_CHUNKHDRSZ);
987
- Assert(block->freeptr <= block->endptr);
988
-
989
- /* store the free list index in the value field */
990
- MemoryChunkSetHdrMask(chunk, block, fidx, MCTX_ASET_ID);
991
-
992
- #ifdef MEMORY_CONTEXT_CHECKING
993
- chunk->requested_size = size;
994
- /* set mark to catch clobber of "unused" space */
995
- if (size < chunk_size)
996
- set_sentinel(MemoryChunkGetPointer(chunk), size);
997
- #endif
998
- #ifdef RANDOMIZE_ALLOCATED_MEMORY
999
- /* fill the allocated space with junk */
1000
- randomize_mem((char *) MemoryChunkGetPointer(chunk), size);
1001
- #endif
1002
-
1003
- /* Ensure any padding bytes are marked NOACCESS. */
1004
- VALGRIND_MAKE_MEM_NOACCESS((char *) MemoryChunkGetPointer(chunk) + size,
1005
- chunk_size - size);
1006
-
1007
- /* Disallow access to the chunk header. */
1008
- VALGRIND_MAKE_MEM_NOACCESS(chunk, ALLOC_CHUNKHDRSZ);
1009
-
1010
- return MemoryChunkGetPointer(chunk);
1076
+ /* There's enough space on the current block, so allocate from that */
1077
+ return AllocSetAllocChunkFromBlock(context, block, size, chunk_size, fidx);
1011
1078
  }
1012
1079
 
1013
1080
  /*
@@ -1122,7 +1189,7 @@ AllocSetFree(void *pointer)
1122
1189
  * request size.)
1123
1190
  */
1124
1191
  void *
1125
- AllocSetRealloc(void *pointer, Size size)
1192
+ AllocSetRealloc(void *pointer, Size size, int flags)
1126
1193
  {
1127
1194
  AllocBlock block;
1128
1195
  AllocSet set;
@@ -1155,6 +1222,9 @@ AllocSetRealloc(void *pointer, Size size)
1155
1222
 
1156
1223
  set = block->aset;
1157
1224
 
1225
+ /* only check size in paths where the limits could be hit */
1226
+ MemoryContextCheckSize((MemoryContext) set, size, flags);
1227
+
1158
1228
  oldchksize = block->endptr - (char *) pointer;
1159
1229
 
1160
1230
  #ifdef MEMORY_CONTEXT_CHECKING
@@ -1181,7 +1251,7 @@ AllocSetRealloc(void *pointer, Size size)
1181
1251
  {
1182
1252
  /* Disallow access to the chunk header. */
1183
1253
  VALGRIND_MAKE_MEM_NOACCESS(chunk, ALLOC_CHUNKHDRSZ);
1184
- return NULL;
1254
+ return MemoryContextAllocationFailure(&set->header, size, flags);
1185
1255
  }
1186
1256
 
1187
1257
  /* updated separately, not to underflow when (oldblksize > blksize) */
@@ -1341,15 +1411,15 @@ AllocSetRealloc(void *pointer, Size size)
1341
1411
  AllocPointer newPointer;
1342
1412
  Size oldsize;
1343
1413
 
1344
- /* allocate new chunk */
1345
- newPointer = AllocSetAlloc((MemoryContext) set, size);
1414
+ /* allocate new chunk (this also checks size is valid) */
1415
+ newPointer = AllocSetAlloc((MemoryContext) set, size, flags);
1346
1416
 
1347
1417
  /* leave immediately if request was not completed */
1348
1418
  if (newPointer == NULL)
1349
1419
  {
1350
1420
  /* Disallow access to the chunk header. */
1351
1421
  VALGRIND_MAKE_MEM_NOACCESS(chunk, ALLOC_CHUNKHDRSZ);
1352
- return NULL;
1422
+ return MemoryContextAllocationFailure((MemoryContext) set, size, flags);
1353
1423
  }
1354
1424
 
1355
1425
  /*
@@ -1567,7 +1637,7 @@ AllocSetCheck(MemoryContext context)
1567
1637
  long nchunks = 0;
1568
1638
  bool has_external_chunk = false;
1569
1639
 
1570
- if (set->keeper == block)
1640
+ if (IsKeeperBlock(set, block))
1571
1641
  total_allocated += block->endptr - ((char *) set);
1572
1642
  else
1573
1643
  total_allocated += block->endptr - ((char *) block);
@@ -1577,7 +1647,7 @@ AllocSetCheck(MemoryContext context)
1577
1647
  */
1578
1648
  if (!blk_used)
1579
1649
  {
1580
- if (set->keeper != block)
1650
+ if (!IsKeeperBlock(set, block))
1581
1651
  elog(WARNING, "problem in alloc set %s: empty block %p",
1582
1652
  name, block);
1583
1653
  }