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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +30 -0
- data/README.md +1 -1
- data/Rakefile +4 -4
- data/ext/pg_query/ext_symbols_freebsd.sym +1 -0
- data/ext/pg_query/ext_symbols_freebsd_with_ruby_abi_version.sym +2 -0
- data/ext/pg_query/ext_symbols_openbsd.sym +1 -0
- data/ext/pg_query/ext_symbols_openbsd_with_ruby_abi_version.sym +2 -0
- data/ext/pg_query/ext_symbols_with_ruby_abi_version.sym +2 -0
- data/ext/pg_query/extconf.rb +20 -6
- data/ext/pg_query/include/pg_query.h +4 -3
- data/ext/pg_query/include/pg_query_enum_defs.c +424 -154
- data/ext/pg_query/include/pg_query_fingerprint_conds.c +68 -4
- data/ext/pg_query/include/pg_query_fingerprint_defs.c +2952 -1845
- data/ext/pg_query/include/pg_query_outfuncs_conds.c +51 -3
- data/ext/pg_query/include/pg_query_outfuncs_defs.c +210 -23
- data/ext/pg_query/include/pg_query_readfuncs_conds.c +17 -1
- data/ext/pg_query/include/pg_query_readfuncs_defs.c +271 -52
- data/ext/pg_query/include/postgres/access/amapi.h +14 -3
- data/ext/pg_query/include/postgres/access/attmap.h +1 -1
- data/ext/pg_query/include/postgres/access/attnum.h +1 -1
- data/ext/pg_query/include/postgres/access/brin_internal.h +116 -0
- data/ext/pg_query/include/postgres/access/brin_tuple.h +112 -0
- data/ext/pg_query/include/postgres/access/clog.h +2 -3
- data/ext/pg_query/include/postgres/access/commit_ts.h +2 -3
- data/ext/pg_query/include/postgres/access/detoast.h +1 -1
- data/ext/pg_query/include/postgres/access/genam.h +17 -4
- data/ext/pg_query/include/postgres/access/gin.h +1 -1
- data/ext/pg_query/include/postgres/access/htup.h +1 -1
- data/ext/pg_query/include/postgres/access/htup_details.h +11 -11
- data/ext/pg_query/include/postgres/access/itup.h +3 -3
- data/ext/pg_query/include/postgres/access/parallel.h +1 -2
- data/ext/pg_query/include/postgres/access/printtup.h +1 -1
- data/ext/pg_query/include/postgres/access/relation.h +1 -1
- data/ext/pg_query/include/postgres/access/relscan.h +1 -1
- data/ext/pg_query/include/postgres/access/rmgrlist.h +1 -1
- data/ext/pg_query/include/postgres/access/sdir.h +1 -1
- data/ext/pg_query/include/postgres/access/skey.h +1 -1
- data/ext/pg_query/include/postgres/access/slru.h +218 -0
- data/ext/pg_query/include/postgres/access/stratnum.h +1 -1
- data/ext/pg_query/include/postgres/access/sysattr.h +1 -1
- data/ext/pg_query/include/postgres/access/table.h +1 -1
- data/ext/pg_query/include/postgres/access/tableam.h +35 -25
- data/ext/pg_query/include/postgres/access/tidstore.h +50 -0
- data/ext/pg_query/include/postgres/access/toast_compression.h +2 -2
- data/ext/pg_query/include/postgres/access/transam.h +50 -7
- data/ext/pg_query/include/postgres/access/tsmapi.h +1 -1
- data/ext/pg_query/include/postgres/access/tupconvert.h +1 -1
- data/ext/pg_query/include/postgres/access/tupdesc.h +5 -5
- data/ext/pg_query/include/postgres/access/tupmacs.h +1 -1
- data/ext/pg_query/include/postgres/access/twophase.h +2 -2
- data/ext/pg_query/include/postgres/access/xact.h +5 -5
- data/ext/pg_query/include/postgres/access/xlog.h +20 -12
- data/ext/pg_query/include/postgres/access/xlog_internal.h +4 -3
- data/ext/pg_query/include/postgres/access/xlogbackup.h +3 -1
- data/ext/pg_query/include/postgres/access/xlogdefs.h +5 -5
- data/ext/pg_query/include/postgres/access/xlogprefetcher.h +2 -2
- data/ext/pg_query/include/postgres/access/xlogreader.h +2 -2
- data/ext/pg_query/include/postgres/access/xlogrecord.h +3 -3
- data/ext/pg_query/include/postgres/access/xlogrecovery.h +4 -4
- data/ext/pg_query/include/postgres/archive/archive_module.h +9 -1
- data/ext/pg_query/include/postgres/c.h +32 -37
- data/ext/pg_query/include/postgres/catalog/catalog.h +3 -1
- data/ext/pg_query/include/postgres/catalog/catversion.h +2 -2
- data/ext/pg_query/include/postgres/catalog/dependency.h +17 -59
- data/ext/pg_query/include/postgres/catalog/genbki.h +12 -6
- data/ext/pg_query/include/postgres/catalog/index.h +22 -18
- data/ext/pg_query/include/postgres/catalog/indexing.h +1 -1
- data/ext/pg_query/include/postgres/catalog/namespace.h +18 -19
- data/ext/pg_query/include/postgres/catalog/objectaccess.h +2 -2
- data/ext/pg_query/include/postgres/catalog/objectaddress.h +5 -1
- data/ext/pg_query/include/postgres/catalog/pg_aggregate.h +4 -2
- data/ext/pg_query/include/postgres/catalog/pg_aggregate_d.h +1 -1
- data/ext/pg_query/include/postgres/catalog/pg_am.h +6 -3
- data/ext/pg_query/include/postgres/catalog/pg_am_d.h +1 -1
- data/ext/pg_query/include/postgres/catalog/pg_attribute.h +31 -14
- data/ext/pg_query/include/postgres/catalog/pg_attribute_d.h +3 -3
- data/ext/pg_query/include/postgres/catalog/pg_authid.h +6 -3
- data/ext/pg_query/include/postgres/catalog/pg_authid_d.h +2 -1
- data/ext/pg_query/include/postgres/catalog/pg_class.h +10 -5
- data/ext/pg_query/include/postgres/catalog/pg_class_d.h +4 -2
- data/ext/pg_query/include/postgres/catalog/pg_collation.h +11 -5
- data/ext/pg_query/include/postgres/catalog/pg_collation_d.h +5 -2
- data/ext/pg_query/include/postgres/catalog/pg_constraint.h +15 -10
- data/ext/pg_query/include/postgres/catalog/pg_constraint_d.h +2 -1
- data/ext/pg_query/include/postgres/catalog/pg_control.h +5 -3
- data/ext/pg_query/include/postgres/catalog/pg_conversion.h +8 -4
- data/ext/pg_query/include/postgres/catalog/pg_conversion_d.h +1 -1
- data/ext/pg_query/include/postgres/catalog/pg_database.h +9 -4
- data/ext/pg_query/include/postgres/catalog/pg_database_d.h +13 -12
- data/ext/pg_query/include/postgres/catalog/pg_depend.h +3 -3
- data/ext/pg_query/include/postgres/catalog/pg_depend_d.h +1 -1
- data/ext/pg_query/include/postgres/catalog/pg_event_trigger.h +6 -3
- data/ext/pg_query/include/postgres/catalog/pg_event_trigger_d.h +1 -1
- data/ext/pg_query/include/postgres/catalog/pg_index.h +5 -3
- data/ext/pg_query/include/postgres/catalog/pg_index_d.h +1 -1
- data/ext/pg_query/include/postgres/catalog/pg_language.h +6 -3
- data/ext/pg_query/include/postgres/catalog/pg_language_d.h +1 -1
- data/ext/pg_query/include/postgres/catalog/pg_namespace.h +6 -3
- data/ext/pg_query/include/postgres/catalog/pg_namespace_d.h +1 -1
- data/ext/pg_query/include/postgres/catalog/pg_opclass.h +6 -3
- data/ext/pg_query/include/postgres/catalog/pg_opclass_d.h +1 -1
- data/ext/pg_query/include/postgres/catalog/pg_operator.h +20 -3
- data/ext/pg_query/include/postgres/catalog/pg_operator_d.h +1 -1
- data/ext/pg_query/include/postgres/catalog/pg_opfamily.h +6 -3
- data/ext/pg_query/include/postgres/catalog/pg_opfamily_d.h +1 -1
- data/ext/pg_query/include/postgres/catalog/pg_partitioned_table.h +4 -2
- data/ext/pg_query/include/postgres/catalog/pg_partitioned_table_d.h +1 -1
- data/ext/pg_query/include/postgres/catalog/pg_proc.h +6 -3
- data/ext/pg_query/include/postgres/catalog/pg_proc_d.h +1 -1
- data/ext/pg_query/include/postgres/catalog/pg_publication.h +6 -3
- data/ext/pg_query/include/postgres/catalog/pg_publication_d.h +1 -1
- data/ext/pg_query/include/postgres/catalog/pg_replication_origin.h +6 -3
- data/ext/pg_query/include/postgres/catalog/pg_replication_origin_d.h +1 -1
- data/ext/pg_query/include/postgres/catalog/pg_statistic.h +10 -4
- data/ext/pg_query/include/postgres/catalog/pg_statistic_d.h +7 -3
- data/ext/pg_query/include/postgres/catalog/pg_statistic_ext.h +10 -7
- data/ext/pg_query/include/postgres/catalog/pg_statistic_ext_d.h +3 -3
- data/ext/pg_query/include/postgres/catalog/pg_transform.h +6 -3
- data/ext/pg_query/include/postgres/catalog/pg_transform_d.h +1 -1
- data/ext/pg_query/include/postgres/catalog/pg_trigger.h +4 -4
- data/ext/pg_query/include/postgres/catalog/pg_trigger_d.h +1 -1
- data/ext/pg_query/include/postgres/catalog/pg_ts_config.h +6 -3
- data/ext/pg_query/include/postgres/catalog/pg_ts_config_d.h +1 -1
- data/ext/pg_query/include/postgres/catalog/pg_ts_dict.h +6 -3
- data/ext/pg_query/include/postgres/catalog/pg_ts_dict_d.h +1 -1
- data/ext/pg_query/include/postgres/catalog/pg_ts_parser.h +6 -3
- data/ext/pg_query/include/postgres/catalog/pg_ts_parser_d.h +1 -1
- data/ext/pg_query/include/postgres/catalog/pg_ts_template.h +6 -3
- data/ext/pg_query/include/postgres/catalog/pg_ts_template_d.h +1 -1
- data/ext/pg_query/include/postgres/catalog/pg_type.h +6 -3
- data/ext/pg_query/include/postgres/catalog/pg_type_d.h +1 -1
- data/ext/pg_query/include/postgres/catalog/storage.h +1 -1
- data/ext/pg_query/include/postgres/catalog/syscache_ids.h +104 -0
- data/ext/pg_query/include/postgres/commands/async.h +2 -6
- data/ext/pg_query/include/postgres/commands/dbcommands.h +1 -1
- data/ext/pg_query/include/postgres/commands/defrem.h +6 -6
- data/ext/pg_query/include/postgres/commands/event_trigger.h +11 -2
- data/ext/pg_query/include/postgres/commands/explain.h +19 -3
- data/ext/pg_query/include/postgres/commands/prepare.h +1 -1
- data/ext/pg_query/include/postgres/commands/tablespace.h +1 -1
- data/ext/pg_query/include/postgres/commands/trigger.h +1 -1
- data/ext/pg_query/include/postgres/commands/vacuum.h +28 -26
- data/ext/pg_query/include/postgres/common/cryptohash.h +2 -2
- data/ext/pg_query/include/postgres/common/file_perm.h +1 -1
- data/ext/pg_query/include/postgres/common/file_utils.h +65 -0
- data/ext/pg_query/include/postgres/common/hashfn.h +16 -1
- data/ext/pg_query/include/postgres/common/hashfn_unstable.h +407 -0
- data/ext/pg_query/include/postgres/common/int.h +79 -4
- data/ext/pg_query/include/postgres/common/keywords.h +1 -1
- data/ext/pg_query/include/postgres/common/kwlookup.h +1 -1
- data/ext/pg_query/include/postgres/common/pg_prng.h +2 -1
- data/ext/pg_query/include/postgres/common/relpath.h +4 -4
- data/ext/pg_query/include/postgres/common/scram-common.h +1 -1
- data/ext/pg_query/include/postgres/common/sha2.h +1 -1
- data/ext/pg_query/include/postgres/common/string.h +1 -1
- data/ext/pg_query/include/postgres/common/unicode_east_asian_fw_table.h +2 -3
- data/ext/pg_query/include/postgres/copyfuncs.funcs.c +278 -30
- data/ext/pg_query/include/postgres/copyfuncs.switch.c +55 -4
- data/ext/pg_query/include/postgres/datatype/timestamp.h +29 -3
- data/ext/pg_query/include/postgres/equalfuncs.funcs.c +239 -26
- data/ext/pg_query/include/postgres/equalfuncs.switch.c +55 -4
- data/ext/pg_query/include/postgres/executor/execdesc.h +2 -2
- data/ext/pg_query/include/postgres/executor/executor.h +6 -5
- data/ext/pg_query/include/postgres/executor/functions.h +2 -1
- data/ext/pg_query/include/postgres/executor/instrument.h +5 -3
- data/ext/pg_query/include/postgres/executor/spi.h +2 -8
- data/ext/pg_query/include/postgres/executor/tablefunc.h +1 -1
- data/ext/pg_query/include/postgres/executor/tuptable.h +31 -2
- data/ext/pg_query/include/postgres/fmgr.h +2 -2
- data/ext/pg_query/include/postgres/foreign/fdwapi.h +1 -1
- data/ext/pg_query/include/postgres/funcapi.h +2 -2
- data/ext/pg_query/include/postgres/gram.h +871 -830
- data/ext/pg_query/include/postgres/gramparse.h +1 -1
- data/ext/pg_query/include/postgres/jit/jit.h +4 -3
- data/ext/pg_query/include/postgres/kwlist_d.h +511 -466
- data/ext/pg_query/include/postgres/lib/dshash.h +25 -10
- data/ext/pg_query/include/postgres/lib/ilist.h +1 -1
- data/ext/pg_query/include/postgres/lib/pairingheap.h +1 -1
- data/ext/pg_query/include/postgres/lib/simplehash.h +40 -18
- data/ext/pg_query/include/postgres/lib/sort_template.h +14 -1
- data/ext/pg_query/include/postgres/lib/stringinfo.h +93 -11
- data/ext/pg_query/include/postgres/libpq/auth.h +1 -1
- data/ext/pg_query/include/postgres/libpq/crypt.h +2 -2
- data/ext/pg_query/include/postgres/libpq/hba.h +4 -4
- data/ext/pg_query/include/postgres/libpq/libpq-be.h +35 -28
- data/ext/pg_query/include/postgres/libpq/libpq.h +6 -7
- data/ext/pg_query/include/postgres/libpq/pqcomm.h +26 -20
- data/ext/pg_query/include/postgres/libpq/pqformat.h +2 -3
- data/ext/pg_query/include/postgres/libpq/pqsignal.h +1 -1
- data/ext/pg_query/include/postgres/libpq/protocol.h +89 -0
- data/ext/pg_query/include/postgres/libpq/sasl.h +1 -1
- data/ext/pg_query/include/postgres/libpq/scram.h +1 -1
- data/ext/pg_query/include/postgres/mb/pg_wchar.h +103 -82
- data/ext/pg_query/include/postgres/mb/stringinfo_mb.h +1 -1
- data/ext/pg_query/include/postgres/miscadmin.h +72 -52
- data/ext/pg_query/include/postgres/nodes/bitmapset.h +17 -3
- data/ext/pg_query/include/postgres/nodes/execnodes.h +112 -25
- data/ext/pg_query/include/postgres/nodes/extensible.h +1 -1
- data/ext/pg_query/include/postgres/nodes/lockoptions.h +4 -4
- data/ext/pg_query/include/postgres/nodes/makefuncs.h +8 -2
- data/ext/pg_query/include/postgres/nodes/memnodes.h +43 -4
- data/ext/pg_query/include/postgres/nodes/miscnodes.h +1 -1
- data/ext/pg_query/include/postgres/nodes/nodeFuncs.h +1 -1
- data/ext/pg_query/include/postgres/nodes/nodes.h +30 -41
- data/ext/pg_query/include/postgres/nodes/nodetags.h +464 -444
- data/ext/pg_query/include/postgres/nodes/params.h +1 -1
- data/ext/pg_query/include/postgres/nodes/parsenodes.h +358 -175
- data/ext/pg_query/include/postgres/nodes/pathnodes.h +64 -10
- data/ext/pg_query/include/postgres/nodes/pg_list.h +62 -11
- data/ext/pg_query/include/postgres/nodes/plannodes.h +11 -10
- data/ext/pg_query/include/postgres/nodes/primnodes.h +352 -54
- data/ext/pg_query/include/postgres/nodes/print.h +1 -1
- data/ext/pg_query/include/postgres/nodes/queryjumble.h +2 -2
- data/ext/pg_query/include/postgres/nodes/replnodes.h +23 -2
- data/ext/pg_query/include/postgres/nodes/supportnodes.h +1 -1
- data/ext/pg_query/include/postgres/nodes/tidbitmap.h +1 -1
- data/ext/pg_query/include/postgres/nodes/value.h +1 -1
- data/ext/pg_query/include/postgres/optimizer/cost.h +5 -4
- data/ext/pg_query/include/postgres/optimizer/geqo.h +1 -1
- data/ext/pg_query/include/postgres/optimizer/geqo_gene.h +1 -1
- data/ext/pg_query/include/postgres/optimizer/optimizer.h +5 -2
- data/ext/pg_query/include/postgres/optimizer/paths.h +13 -8
- data/ext/pg_query/include/postgres/optimizer/planmain.h +7 -1
- data/ext/pg_query/include/postgres/parser/analyze.h +3 -1
- data/ext/pg_query/include/postgres/parser/kwlist.h +22 -2
- data/ext/pg_query/include/postgres/parser/parse_agg.h +1 -1
- data/ext/pg_query/include/postgres/parser/parse_coerce.h +5 -2
- data/ext/pg_query/include/postgres/parser/parse_expr.h +1 -1
- data/ext/pg_query/include/postgres/parser/parse_func.h +2 -2
- data/ext/pg_query/include/postgres/parser/parse_node.h +3 -2
- data/ext/pg_query/include/postgres/parser/parse_oper.h +4 -1
- data/ext/pg_query/include/postgres/parser/parse_relation.h +1 -1
- data/ext/pg_query/include/postgres/parser/parse_type.h +2 -2
- data/ext/pg_query/include/postgres/parser/parser.h +3 -3
- data/ext/pg_query/include/postgres/parser/parsetree.h +1 -1
- data/ext/pg_query/include/postgres/parser/scanner.h +1 -1
- data/ext/pg_query/include/postgres/parser/scansup.h +1 -1
- data/ext/pg_query/include/postgres/partitioning/partdefs.h +1 -1
- data/ext/pg_query/include/postgres/pg_config.h +53 -45
- data/ext/pg_query/include/postgres/pg_config_manual.h +21 -8
- data/ext/pg_query/include/postgres/pg_getopt.h +1 -1
- data/ext/pg_query/include/postgres/pg_trace.h +1 -1
- data/ext/pg_query/include/postgres/pgstat.h +13 -11
- data/ext/pg_query/include/postgres/pgtime.h +1 -1
- data/ext/pg_query/include/postgres/pl_reserved_kwlist.h +1 -1
- data/ext/pg_query/include/postgres/pl_reserved_kwlist_d.h +1 -1
- data/ext/pg_query/include/postgres/pl_unreserved_kwlist.h +1 -1
- data/ext/pg_query/include/postgres/pl_unreserved_kwlist_d.h +1 -1
- data/ext/pg_query/include/postgres/plerrcodes.h +4 -4
- data/ext/pg_query/include/postgres/plpgsql.h +15 -13
- data/ext/pg_query/include/postgres/port/atomics/arch-arm.h +1 -1
- data/ext/pg_query/include/postgres/port/atomics/arch-hppa.h +1 -1
- data/ext/pg_query/include/postgres/port/atomics/arch-ppc.h +3 -1
- data/ext/pg_query/include/postgres/port/atomics/arch-x86.h +3 -1
- data/ext/pg_query/include/postgres/port/atomics/fallback.h +1 -1
- data/ext/pg_query/include/postgres/port/atomics/generic-gcc.h +38 -1
- data/ext/pg_query/include/postgres/port/atomics/generic-msvc.h +19 -1
- data/ext/pg_query/include/postgres/port/atomics/generic-sunpro.h +16 -1
- data/ext/pg_query/include/postgres/port/atomics/generic.h +38 -2
- data/ext/pg_query/include/postgres/port/atomics.h +93 -6
- data/ext/pg_query/include/postgres/port/pg_bitutils.h +91 -9
- data/ext/pg_query/include/postgres/port/pg_bswap.h +1 -1
- data/ext/pg_query/include/postgres/port/pg_crc32c.h +10 -1
- data/ext/pg_query/include/postgres/port/pg_iovec.h +117 -0
- data/ext/pg_query/include/postgres/port/simd.h +48 -1
- data/ext/pg_query/include/postgres/port/win32/sys/socket.h +8 -0
- data/ext/pg_query/include/postgres/port/win32_port.h +1 -13
- data/ext/pg_query/include/postgres/port.h +39 -4
- data/ext/pg_query/include/postgres/portability/instr_time.h +1 -1
- data/ext/pg_query/include/postgres/postgres.h +1 -1
- data/ext/pg_query/include/postgres/postmaster/autovacuum.h +5 -16
- data/ext/pg_query/include/postgres/postmaster/bgworker.h +8 -6
- data/ext/pg_query/include/postgres/postmaster/bgworker_internals.h +3 -7
- data/ext/pg_query/include/postgres/postmaster/bgwriter.h +3 -3
- data/ext/pg_query/include/postgres/postmaster/interrupt.h +1 -1
- data/ext/pg_query/include/postgres/postmaster/pgarch.h +2 -2
- data/ext/pg_query/include/postgres/postmaster/postmaster.h +25 -5
- data/ext/pg_query/include/postgres/postmaster/startup.h +2 -2
- data/ext/pg_query/include/postgres/postmaster/syslogger.h +2 -4
- data/ext/pg_query/include/postgres/postmaster/walsummarizer.h +35 -0
- data/ext/pg_query/include/postgres/postmaster/walwriter.h +2 -2
- data/ext/pg_query/include/postgres/regex/regex.h +92 -9
- data/ext/pg_query/include/postgres/replication/logicallauncher.h +1 -1
- data/ext/pg_query/include/postgres/replication/logicalproto.h +2 -2
- data/ext/pg_query/include/postgres/replication/logicalworker.h +2 -1
- data/ext/pg_query/include/postgres/replication/origin.h +1 -1
- data/ext/pg_query/include/postgres/replication/reorderbuffer.h +27 -46
- data/ext/pg_query/include/postgres/replication/slot.h +45 -5
- data/ext/pg_query/include/postgres/replication/slotsync.h +38 -0
- data/ext/pg_query/include/postgres/replication/syncrep.h +1 -1
- data/ext/pg_query/include/postgres/replication/walreceiver.h +37 -11
- data/ext/pg_query/include/postgres/replication/walsender.h +5 -3
- data/ext/pg_query/include/postgres/rewrite/prs2lock.h +1 -1
- data/ext/pg_query/include/postgres/rewrite/rewriteHandler.h +7 -1
- data/ext/pg_query/include/postgres/rewrite/rewriteManip.h +2 -2
- data/ext/pg_query/include/postgres/rewrite/rewriteSupport.h +1 -1
- data/ext/pg_query/include/postgres/storage/block.h +1 -1
- data/ext/pg_query/include/postgres/storage/buf.h +1 -1
- data/ext/pg_query/include/postgres/storage/bufmgr.h +59 -41
- data/ext/pg_query/include/postgres/storage/bufpage.h +1 -1
- data/ext/pg_query/include/postgres/storage/condition_variable.h +1 -1
- data/ext/pg_query/include/postgres/storage/dsm.h +1 -1
- data/ext/pg_query/include/postgres/storage/dsm_impl.h +2 -2
- data/ext/pg_query/include/postgres/storage/fd.h +30 -13
- data/ext/pg_query/include/postgres/storage/fileset.h +1 -1
- data/ext/pg_query/include/postgres/storage/ipc.h +4 -1
- data/ext/pg_query/include/postgres/storage/item.h +1 -1
- data/ext/pg_query/include/postgres/storage/itemid.h +1 -1
- data/ext/pg_query/include/postgres/storage/itemptr.h +1 -1
- data/ext/pg_query/include/postgres/storage/large_object.h +1 -1
- data/ext/pg_query/include/postgres/storage/latch.h +4 -2
- data/ext/pg_query/include/postgres/storage/lmgr.h +8 -2
- data/ext/pg_query/include/postgres/storage/lock.h +19 -19
- data/ext/pg_query/include/postgres/storage/lockdefs.h +3 -1
- data/ext/pg_query/include/postgres/storage/lwlock.h +17 -9
- data/ext/pg_query/include/postgres/storage/lwlocknames.h +7 -10
- data/ext/pg_query/include/postgres/storage/off.h +1 -1
- data/ext/pg_query/include/postgres/storage/pg_sema.h +1 -1
- data/ext/pg_query/include/postgres/storage/pg_shmem.h +5 -4
- data/ext/pg_query/include/postgres/storage/pmsignal.h +2 -2
- data/ext/pg_query/include/postgres/storage/predicate.h +1 -5
- data/ext/pg_query/include/postgres/storage/proc.h +48 -26
- data/ext/pg_query/include/postgres/storage/procarray.h +5 -1
- data/ext/pg_query/include/postgres/storage/proclist_types.h +11 -9
- data/ext/pg_query/include/postgres/storage/procnumber.h +43 -0
- data/ext/pg_query/include/postgres/storage/procsignal.h +8 -6
- data/ext/pg_query/include/postgres/storage/read_stream.h +65 -0
- data/ext/pg_query/include/postgres/storage/relfilelocator.h +16 -15
- data/ext/pg_query/include/postgres/storage/s_lock.h +7 -27
- data/ext/pg_query/include/postgres/storage/sharedfileset.h +1 -1
- data/ext/pg_query/include/postgres/storage/shm_mq.h +2 -2
- data/ext/pg_query/include/postgres/storage/shm_toc.h +1 -1
- data/ext/pg_query/include/postgres/storage/shmem.h +1 -1
- data/ext/pg_query/include/postgres/storage/sinval.h +3 -3
- data/ext/pg_query/include/postgres/storage/smgr.h +46 -29
- data/ext/pg_query/include/postgres/storage/spin.h +1 -1
- data/ext/pg_query/include/postgres/storage/standby.h +13 -3
- data/ext/pg_query/include/postgres/storage/standbydefs.h +2 -2
- data/ext/pg_query/include/postgres/storage/sync.h +4 -4
- data/ext/pg_query/include/postgres/tcop/cmdtag.h +1 -2
- data/ext/pg_query/include/postgres/tcop/cmdtaglist.h +3 -2
- data/ext/pg_query/include/postgres/tcop/deparse_utility.h +2 -2
- data/ext/pg_query/include/postgres/tcop/dest.h +3 -2
- data/ext/pg_query/include/postgres/tcop/fastpath.h +1 -1
- data/ext/pg_query/include/postgres/tcop/pquery.h +1 -1
- data/ext/pg_query/include/postgres/tcop/tcopprot.h +9 -5
- data/ext/pg_query/include/postgres/tcop/utility.h +2 -2
- data/ext/pg_query/include/postgres/tsearch/ts_cache.h +1 -1
- data/ext/pg_query/include/postgres/utils/acl.h +19 -7
- data/ext/pg_query/include/postgres/utils/aclchk_internal.h +1 -1
- data/ext/pg_query/include/postgres/utils/array.h +1 -2
- data/ext/pg_query/include/postgres/utils/ascii.h +84 -0
- data/ext/pg_query/include/postgres/utils/backend_progress.h +3 -2
- data/ext/pg_query/include/postgres/utils/backend_status.h +8 -10
- data/ext/pg_query/include/postgres/utils/builtins.h +4 -1
- data/ext/pg_query/include/postgres/utils/bytea.h +2 -2
- data/ext/pg_query/include/postgres/utils/catcache.h +6 -6
- data/ext/pg_query/include/postgres/utils/date.h +1 -1
- data/ext/pg_query/include/postgres/utils/datetime.h +4 -1
- data/ext/pg_query/include/postgres/utils/datum.h +1 -1
- data/ext/pg_query/include/postgres/utils/dsa.h +44 -5
- data/ext/pg_query/include/postgres/utils/elog.h +3 -8
- data/ext/pg_query/include/postgres/utils/errcodes.h +1 -3
- data/ext/pg_query/include/postgres/utils/expandeddatum.h +1 -1
- data/ext/pg_query/include/postgres/utils/expandedrecord.h +1 -1
- data/ext/pg_query/include/postgres/utils/float.h +1 -1
- data/ext/pg_query/include/postgres/utils/fmgroids.h +49 -16
- data/ext/pg_query/include/postgres/utils/fmgrprotos.h +47 -14
- data/ext/pg_query/include/postgres/utils/fmgrtab.h +1 -1
- data/ext/pg_query/include/postgres/utils/guc.h +20 -6
- data/ext/pg_query/include/postgres/utils/guc_hooks.h +23 -2
- data/ext/pg_query/include/postgres/utils/guc_tables.h +6 -5
- data/ext/pg_query/include/postgres/utils/hsearch.h +2 -2
- data/ext/pg_query/include/postgres/utils/injection_point.h +44 -0
- data/ext/pg_query/include/postgres/utils/inval.h +1 -1
- data/ext/pg_query/include/postgres/utils/logtape.h +5 -5
- data/ext/pg_query/include/postgres/utils/lsyscache.h +6 -3
- data/ext/pg_query/include/postgres/utils/memdebug.h +1 -1
- data/ext/pg_query/include/postgres/utils/memutils.h +12 -5
- data/ext/pg_query/include/postgres/utils/memutils_internal.h +53 -13
- data/ext/pg_query/include/postgres/utils/memutils_memorychunk.h +25 -9
- data/ext/pg_query/include/postgres/utils/numeric.h +6 -1
- data/ext/pg_query/include/postgres/utils/palloc.h +1 -15
- data/ext/pg_query/include/postgres/utils/partcache.h +1 -1
- data/ext/pg_query/include/postgres/utils/pg_locale.h +8 -7
- data/ext/pg_query/include/postgres/utils/pgstat_internal.h +30 -17
- data/ext/pg_query/include/postgres/utils/plancache.h +5 -3
- data/ext/pg_query/include/postgres/utils/portal.h +10 -10
- data/ext/pg_query/include/postgres/utils/queryenvironment.h +2 -2
- data/ext/pg_query/include/postgres/utils/regproc.h +1 -1
- data/ext/pg_query/include/postgres/utils/rel.h +14 -15
- data/ext/pg_query/include/postgres/utils/relcache.h +2 -5
- data/ext/pg_query/include/postgres/utils/reltrigger.h +1 -1
- data/ext/pg_query/include/postgres/utils/resowner.h +90 -9
- data/ext/pg_query/include/postgres/utils/ruleutils.h +1 -1
- data/ext/pg_query/include/postgres/utils/sharedtuplestore.h +1 -1
- data/ext/pg_query/include/postgres/utils/snapmgr.h +1 -52
- data/ext/pg_query/include/postgres/utils/snapshot.h +2 -2
- data/ext/pg_query/include/postgres/utils/sortsupport.h +1 -1
- data/ext/pg_query/include/postgres/utils/syscache.h +7 -98
- data/ext/pg_query/include/postgres/utils/timeout.h +3 -2
- data/ext/pg_query/include/postgres/utils/timestamp.h +1 -1
- data/ext/pg_query/include/postgres/utils/tuplesort.h +36 -9
- data/ext/pg_query/include/postgres/utils/tuplestore.h +2 -5
- data/ext/pg_query/include/postgres/utils/typcache.h +2 -1
- data/ext/pg_query/include/postgres/utils/varlena.h +1 -1
- data/ext/pg_query/include/postgres/utils/wait_event.h +28 -214
- data/ext/pg_query/include/postgres/utils/wait_event_types.h +218 -0
- data/ext/pg_query/include/postgres/utils/xml.h +4 -4
- data/ext/pg_query/include/postgres/varatt.h +1 -1
- data/ext/pg_query/include/protobuf/pg_query.pb-c.h +1546 -792
- data/ext/pg_query/include/protobuf/pg_query.pb.h +58365 -46595
- data/ext/pg_query/pg_query.pb-c.c +6598 -3739
- data/ext/pg_query/pg_query_normalize.c +42 -1
- data/ext/pg_query/pg_query_outfuncs_json.c +3 -1
- data/ext/pg_query/pg_query_parse_plpgsql.c +12 -13
- data/ext/pg_query/pg_query_readfuncs_protobuf.c +2 -2
- data/ext/pg_query/pg_query_scan.c +1 -1
- data/ext/pg_query/postgres_deparse.c +601 -172
- data/ext/pg_query/src_backend_catalog_namespace.c +241 -66
- data/ext/pg_query/src_backend_catalog_pg_proc.c +1 -3
- data/ext/pg_query/src_backend_commands_define.c +2 -3
- data/ext/pg_query/src_backend_nodes_bitmapset.c +137 -94
- data/ext/pg_query/src_backend_nodes_copyfuncs.c +1 -1
- data/ext/pg_query/src_backend_nodes_equalfuncs.c +1 -1
- data/ext/pg_query/src_backend_nodes_extensible.c +1 -1
- data/ext/pg_query/src_backend_nodes_list.c +3 -7
- data/ext/pg_query/src_backend_nodes_makefuncs.c +59 -20
- data/ext/pg_query/src_backend_nodes_nodeFuncs.c +109 -2
- data/ext/pg_query/src_backend_nodes_value.c +1 -1
- data/ext/pg_query/src_backend_parser_gram.c +34491 -32136
- data/ext/pg_query/src_backend_parser_parser.c +8 -8
- data/ext/pg_query/src_backend_parser_scan.c +5637 -3028
- data/ext/pg_query/src_backend_parser_scansup.c +2 -1
- data/ext/pg_query/src_backend_storage_ipc_ipc.c +1 -1
- data/ext/pg_query/src_backend_tcop_postgres.c +34 -10
- data/ext/pg_query/src_backend_utils_activity_pgstat_database.c +2 -2
- data/ext/pg_query/src_backend_utils_adt_datum.c +8 -6
- data/ext/pg_query/src_backend_utils_adt_expandeddatum.c +1 -1
- data/ext/pg_query/src_backend_utils_adt_format_type.c +1 -1
- data/ext/pg_query/src_backend_utils_adt_numutils.c +4 -5
- data/ext/pg_query/src_backend_utils_adt_ruleutils.c +101 -28
- data/ext/pg_query/src_backend_utils_error_assert.c +1 -1
- data/ext/pg_query/src_backend_utils_error_elog.c +47 -42
- data/ext/pg_query/src_backend_utils_fmgr_fmgr.c +4 -2
- data/ext/pg_query/src_backend_utils_init_globals.c +15 -3
- data/ext/pg_query/src_backend_utils_mb_mbutils.c +11 -18
- data/ext/pg_query/src_backend_utils_misc_guc_tables.c +16 -6
- data/ext/pg_query/src_backend_utils_mmgr_alignedalloc.c +8 -5
- data/ext/pg_query/src_backend_utils_mmgr_aset.c +308 -238
- data/ext/pg_query/src_backend_utils_mmgr_bump.c +728 -0
- data/ext/pg_query/src_backend_utils_mmgr_generation.c +273 -197
- data/ext/pg_query/src_backend_utils_mmgr_mcxt.c +270 -215
- data/ext/pg_query/src_backend_utils_mmgr_slab.c +154 -96
- data/ext/pg_query/src_common_encnames.c +43 -44
- data/ext/pg_query/src_common_hashfn.c +1 -1
- data/ext/pg_query/src_common_keywords.c +1 -1
- data/ext/pg_query/src_common_kwlist_d.h +511 -466
- data/ext/pg_query/src_common_kwlookup.c +1 -1
- data/ext/pg_query/src_common_psprintf.c +3 -3
- data/ext/pg_query/src_common_stringinfo.c +18 -1
- data/ext/pg_query/src_common_wchar.c +92 -109
- data/ext/pg_query/src_pl_plpgsql_src_pl_comp.c +99 -5
- data/ext/pg_query/src_pl_plpgsql_src_pl_funcs.c +1 -1
- data/ext/pg_query/src_pl_plpgsql_src_pl_gram.c +242 -143
- data/ext/pg_query/src_pl_plpgsql_src_pl_handler.c +1 -1
- data/ext/pg_query/src_pl_plpgsql_src_pl_reserved_kwlist_d.h +1 -1
- data/ext/pg_query/src_pl_plpgsql_src_pl_scanner.c +19 -1
- data/ext/pg_query/src_pl_plpgsql_src_pl_unreserved_kwlist_d.h +1 -1
- data/ext/pg_query/src_port_pg_bitutils.c +173 -28
- data/ext/pg_query/src_port_pgstrcasecmp.c +29 -1
- data/ext/pg_query/src_port_snprintf.c +15 -18
- data/ext/pg_query/src_port_strerror.c +1 -3
- data/ext/pg_query/src_port_strlcpy.c +1 -1
- data/lib/pg_query/fingerprint.rb +3 -5
- data/lib/pg_query/param_refs.rb +2 -2
- data/lib/pg_query/parse.rb +5 -7
- data/lib/pg_query/parse_error.rb +1 -0
- data/lib/pg_query/pg_query_pb.rb +27 -25
- data/lib/pg_query/scan.rb +1 -0
- data/lib/pg_query/treewalker.rb +38 -15
- data/lib/pg_query/truncate.rb +18 -20
- data/lib/pg_query/version.rb +1 -1
- metadata +31 -82
- data/ext/pg_query/include/postgres/storage/backendid.h +0 -37
- data/ext/pg_query/include/postgres/storage/sinvaladt.h +0 -45
- data/ext/pg_query/pg_query_ruby_freebsd.sym +0 -2
- data/ext/pg_query/src_backend_nodes_nodes.c +0 -38
- /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-
|
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
|
-
|
179
|
-
|
180
|
-
|
181
|
-
|
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->
|
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 = (
|
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->
|
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
|
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
|
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->
|
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
|
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
|
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
|
-
*
|
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
|
-
|
719
|
-
|
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
|
-
|
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
|
-
|
738
|
-
|
731
|
+
/* ensure there's always space for the sentinel byte */
|
732
|
+
chunk_size = MAXALIGN(size + 1);
|
739
733
|
#else
|
740
|
-
|
734
|
+
chunk_size = MAXALIGN(size);
|
741
735
|
#endif
|
742
736
|
|
743
|
-
|
744
|
-
|
745
|
-
|
746
|
-
|
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
|
-
|
742
|
+
context->mem_allocated += blksize;
|
749
743
|
|
750
|
-
|
751
|
-
|
744
|
+
block->aset = set;
|
745
|
+
block->freeptr = block->endptr = ((char *) block) + blksize;
|
752
746
|
|
753
|
-
|
747
|
+
chunk = (MemoryChunk *) (((char *) block) + ALLOC_BLOCKHDRSZ);
|
754
748
|
|
755
|
-
|
756
|
-
|
749
|
+
/* mark the MemoryChunk as externally managed */
|
750
|
+
MemoryChunkSetHdrMaskExternal(chunk, MCTX_ASET_ID);
|
757
751
|
|
758
752
|
#ifdef MEMORY_CONTEXT_CHECKING
|
759
|
-
|
760
|
-
|
761
|
-
|
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
|
-
|
766
|
-
|
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
|
-
*
|
771
|
-
*
|
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 (
|
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
|
-
|
784
|
-
|
785
|
-
|
882
|
+
a_fidx--;
|
883
|
+
Assert(a_fidx >= 0);
|
884
|
+
availchunk = GetChunkSizeFromFreeListIdx(a_fidx);
|
786
885
|
}
|
787
886
|
|
788
|
-
|
789
|
-
VALGRIND_MAKE_MEM_NOACCESS((char *) MemoryChunkGetPointer(chunk) + size,
|
790
|
-
chunk_size - size);
|
887
|
+
chunk = (MemoryChunk *) (block->freeptr);
|
791
888
|
|
792
|
-
/*
|
793
|
-
|
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
|
-
|
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 ((
|
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
|
-
|
909
|
-
|
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
|
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
|
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
|
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
|
1650
|
+
if (!IsKeeperBlock(set, block))
|
1581
1651
|
elog(WARNING, "problem in alloc set %s: empty block %p",
|
1582
1652
|
name, block);
|
1583
1653
|
}
|