pg_query 2.2.0 → 6.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG.md +86 -0
- data/README.md +57 -31
- data/Rakefile +5 -6
- 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 +33 -9
- data/ext/pg_query/include/pg_query.h +30 -4
- data/ext/pg_query/include/pg_query_enum_defs.c +839 -290
- data/ext/pg_query/include/pg_query_fingerprint_conds.c +638 -481
- data/ext/pg_query/include/pg_query_fingerprint_defs.c +6786 -4193
- data/ext/pg_query/include/pg_query_outfuncs_conds.c +450 -330
- data/ext/pg_query/include/pg_query_outfuncs_defs.c +1489 -1044
- data/ext/pg_query/include/pg_query_readfuncs_conds.c +157 -118
- data/ext/pg_query/include/pg_query_readfuncs_defs.c +1933 -1410
- data/ext/pg_query/include/postgres/access/amapi.h +303 -0
- data/ext/pg_query/include/postgres/access/attmap.h +54 -0
- data/ext/pg_query/include/postgres/access/attnum.h +64 -0
- 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 +62 -0
- data/ext/pg_query/include/postgres/access/commit_ts.h +73 -0
- data/ext/pg_query/include/postgres/access/detoast.h +82 -0
- data/ext/pg_query/include/postgres/access/genam.h +246 -0
- data/ext/pg_query/include/postgres/access/gin.h +91 -0
- data/ext/pg_query/include/postgres/access/htup.h +89 -0
- data/ext/pg_query/include/postgres/access/htup_details.h +811 -0
- data/ext/pg_query/include/postgres/access/itup.h +170 -0
- data/ext/pg_query/include/postgres/access/parallel.h +81 -0
- data/ext/pg_query/include/postgres/access/printtup.h +35 -0
- data/ext/pg_query/include/postgres/access/relation.h +28 -0
- data/ext/pg_query/include/postgres/access/relscan.h +191 -0
- data/ext/pg_query/include/postgres/access/rmgr.h +62 -0
- data/ext/pg_query/include/postgres/access/rmgrlist.h +49 -0
- data/ext/pg_query/include/postgres/access/sdir.h +67 -0
- data/ext/pg_query/include/postgres/access/skey.h +151 -0
- data/ext/pg_query/include/postgres/access/slru.h +218 -0
- data/ext/pg_query/include/postgres/access/stratnum.h +85 -0
- data/ext/pg_query/include/postgres/access/sysattr.h +29 -0
- data/ext/pg_query/include/postgres/access/table.h +28 -0
- data/ext/pg_query/include/postgres/access/tableam.h +2110 -0
- data/ext/pg_query/include/postgres/access/tidstore.h +50 -0
- data/ext/pg_query/include/postgres/access/toast_compression.h +73 -0
- data/ext/pg_query/include/postgres/access/transam.h +418 -0
- data/ext/pg_query/include/postgres/access/tsmapi.h +82 -0
- data/ext/pg_query/include/postgres/access/tupconvert.h +54 -0
- data/ext/pg_query/include/postgres/access/tupdesc.h +154 -0
- data/ext/pg_query/include/postgres/access/tupmacs.h +207 -0
- data/ext/pg_query/include/postgres/access/twophase.h +65 -0
- data/ext/pg_query/include/postgres/access/xact.h +530 -0
- data/ext/pg_query/include/postgres/access/xlog.h +310 -0
- data/ext/pg_query/include/postgres/access/xlog_internal.h +405 -0
- data/ext/pg_query/include/postgres/access/xlogbackup.h +43 -0
- data/ext/pg_query/include/postgres/access/xlogdefs.h +82 -0
- data/ext/pg_query/include/postgres/access/xlogprefetcher.h +55 -0
- data/ext/pg_query/include/postgres/access/xlogreader.h +444 -0
- data/ext/pg_query/include/postgres/access/xlogrecord.h +248 -0
- data/ext/pg_query/include/postgres/access/xlogrecovery.h +158 -0
- data/ext/pg_query/include/postgres/archive/archive_module.h +67 -0
- data/ext/pg_query/include/postgres/c.h +1374 -0
- data/ext/pg_query/include/postgres/catalog/catalog.h +47 -0
- data/ext/pg_query/include/postgres/catalog/catversion.h +62 -0
- data/ext/pg_query/include/postgres/catalog/dependency.h +228 -0
- data/ext/pg_query/include/postgres/catalog/genbki.h +149 -0
- data/ext/pg_query/include/postgres/catalog/index.h +218 -0
- data/ext/pg_query/include/postgres/catalog/indexing.h +54 -0
- data/ext/pg_query/include/postgres/catalog/namespace.h +189 -0
- data/ext/pg_query/include/postgres/catalog/objectaccess.h +267 -0
- data/ext/pg_query/include/postgres/catalog/objectaddress.h +93 -0
- data/ext/pg_query/include/postgres/catalog/pg_aggregate.h +182 -0
- data/ext/pg_query/include/postgres/catalog/pg_aggregate_d.h +78 -0
- data/ext/pg_query/include/postgres/catalog/pg_am.h +66 -0
- data/ext/pg_query/include/postgres/catalog/pg_am_d.h +47 -0
- data/ext/pg_query/include/postgres/catalog/pg_attribute.h +240 -0
- data/ext/pg_query/include/postgres/catalog/pg_attribute_d.h +62 -0
- data/ext/pg_query/include/postgres/catalog/pg_authid.h +66 -0
- data/ext/pg_query/include/postgres/catalog/pg_authid_d.h +60 -0
- data/ext/pg_query/include/postgres/catalog/pg_class.h +235 -0
- data/ext/pg_query/include/postgres/catalog/pg_class_d.h +134 -0
- data/ext/pg_query/include/postgres/catalog/pg_collation.h +106 -0
- data/ext/pg_query/include/postgres/catalog/pg_collation_d.h +66 -0
- data/ext/pg_query/include/postgres/catalog/pg_constraint.h +278 -0
- data/ext/pg_query/include/postgres/catalog/pg_constraint_d.h +74 -0
- data/ext/pg_query/include/postgres/catalog/pg_control.h +260 -0
- data/ext/pg_query/include/postgres/catalog/pg_conversion.h +79 -0
- data/ext/pg_query/include/postgres/catalog/pg_conversion_d.h +38 -0
- data/ext/pg_query/include/postgres/catalog/pg_database.h +129 -0
- data/ext/pg_query/include/postgres/catalog/pg_database_d.h +53 -0
- data/ext/pg_query/include/postgres/catalog/pg_depend.h +77 -0
- data/ext/pg_query/include/postgres/catalog/pg_depend_d.h +36 -0
- data/ext/pg_query/include/postgres/catalog/pg_event_trigger.h +60 -0
- data/ext/pg_query/include/postgres/catalog/pg_event_trigger_d.h +36 -0
- data/ext/pg_query/include/postgres/catalog/pg_index.h +92 -0
- data/ext/pg_query/include/postgres/catalog/pg_index_d.h +59 -0
- data/ext/pg_query/include/postgres/catalog/pg_language.h +75 -0
- data/ext/pg_query/include/postgres/catalog/pg_language_d.h +41 -0
- data/ext/pg_query/include/postgres/catalog/pg_namespace.h +67 -0
- data/ext/pg_query/include/postgres/catalog/pg_namespace_d.h +36 -0
- data/ext/pg_query/include/postgres/catalog/pg_opclass.h +91 -0
- data/ext/pg_query/include/postgres/catalog/pg_opclass_d.h +51 -0
- data/ext/pg_query/include/postgres/catalog/pg_operator.h +124 -0
- data/ext/pg_query/include/postgres/catalog/pg_operator_d.h +142 -0
- data/ext/pg_query/include/postgres/catalog/pg_opfamily.h +67 -0
- data/ext/pg_query/include/postgres/catalog/pg_opfamily_d.h +51 -0
- data/ext/pg_query/include/postgres/catalog/pg_partitioned_table.h +76 -0
- data/ext/pg_query/include/postgres/catalog/pg_partitioned_table_d.h +36 -0
- data/ext/pg_query/include/postgres/catalog/pg_proc.h +223 -0
- data/ext/pg_query/include/postgres/catalog/pg_proc_d.h +101 -0
- data/ext/pg_query/include/postgres/catalog/pg_publication.h +161 -0
- data/ext/pg_query/include/postgres/catalog/pg_publication_d.h +38 -0
- data/ext/pg_query/include/postgres/catalog/pg_replication_origin.h +65 -0
- data/ext/pg_query/include/postgres/catalog/pg_replication_origin_d.h +33 -0
- data/ext/pg_query/include/postgres/catalog/pg_statistic.h +288 -0
- data/ext/pg_query/include/postgres/catalog/pg_statistic_d.h +199 -0
- data/ext/pg_query/include/postgres/catalog/pg_statistic_ext.h +91 -0
- data/ext/pg_query/include/postgres/catalog/pg_statistic_ext_d.h +45 -0
- data/ext/pg_query/include/postgres/catalog/pg_transform.h +51 -0
- data/ext/pg_query/include/postgres/catalog/pg_transform_d.h +34 -0
- data/ext/pg_query/include/postgres/catalog/pg_trigger.h +153 -0
- data/ext/pg_query/include/postgres/catalog/pg_trigger_d.h +109 -0
- data/ext/pg_query/include/postgres/catalog/pg_ts_config.h +56 -0
- data/ext/pg_query/include/postgres/catalog/pg_ts_config_d.h +34 -0
- data/ext/pg_query/include/postgres/catalog/pg_ts_dict.h +62 -0
- data/ext/pg_query/include/postgres/catalog/pg_ts_dict_d.h +35 -0
- data/ext/pg_query/include/postgres/catalog/pg_ts_parser.h +63 -0
- data/ext/pg_query/include/postgres/catalog/pg_ts_parser_d.h +37 -0
- data/ext/pg_query/include/postgres/catalog/pg_ts_template.h +54 -0
- data/ext/pg_query/include/postgres/catalog/pg_ts_template_d.h +34 -0
- data/ext/pg_query/include/postgres/catalog/pg_type.h +407 -0
- data/ext/pg_query/include/postgres/catalog/pg_type_d.h +324 -0
- data/ext/pg_query/include/postgres/catalog/storage.h +50 -0
- data/ext/pg_query/include/postgres/catalog/syscache_ids.h +104 -0
- data/ext/pg_query/include/postgres/commands/async.h +49 -0
- data/ext/pg_query/include/postgres/commands/dbcommands.h +37 -0
- data/ext/pg_query/include/postgres/commands/defrem.h +161 -0
- data/ext/pg_query/include/postgres/commands/event_trigger.h +97 -0
- data/ext/pg_query/include/postgres/commands/explain.h +145 -0
- data/ext/pg_query/include/postgres/commands/prepare.h +61 -0
- data/ext/pg_query/include/postgres/commands/tablespace.h +69 -0
- data/ext/pg_query/include/postgres/commands/trigger.h +288 -0
- data/ext/pg_query/include/postgres/commands/user.h +43 -0
- data/ext/pg_query/include/postgres/commands/vacuum.h +388 -0
- data/ext/pg_query/include/postgres/common/cryptohash.h +39 -0
- data/ext/pg_query/include/postgres/common/file_perm.h +56 -0
- data/ext/pg_query/include/postgres/common/file_utils.h +65 -0
- data/ext/pg_query/include/postgres/common/hashfn.h +119 -0
- data/ext/pg_query/include/postgres/common/hashfn_unstable.h +407 -0
- data/ext/pg_query/include/postgres/common/int.h +512 -0
- data/ext/pg_query/include/postgres/common/keywords.h +29 -0
- data/ext/pg_query/include/postgres/common/kwlookup.h +44 -0
- data/ext/pg_query/include/postgres/common/pg_prng.h +62 -0
- data/ext/pg_query/include/postgres/common/relpath.h +97 -0
- data/ext/pg_query/include/postgres/common/scram-common.h +70 -0
- data/ext/pg_query/include/postgres/common/sha2.h +32 -0
- data/ext/pg_query/include/postgres/common/string.h +44 -0
- data/ext/pg_query/include/postgres/common/unicode_east_asian_fw_table.h +124 -0
- data/ext/pg_query/include/postgres/common/unicode_nonspacing_table.h +326 -0
- data/ext/pg_query/include/postgres/copyfuncs.funcs.c +5261 -0
- data/ext/pg_query/include/postgres/copyfuncs.switch.c +989 -0
- data/ext/pg_query/include/postgres/datatype/timestamp.h +269 -0
- data/ext/pg_query/include/postgres/equalfuncs.funcs.c +3310 -0
- data/ext/pg_query/include/postgres/equalfuncs.switch.c +836 -0
- data/ext/pg_query/include/postgres/executor/execdesc.h +70 -0
- data/ext/pg_query/include/postgres/executor/executor.h +681 -0
- data/ext/pg_query/include/postgres/executor/functions.h +56 -0
- data/ext/pg_query/include/postgres/executor/instrument.h +120 -0
- data/ext/pg_query/include/postgres/executor/spi.h +207 -0
- data/ext/pg_query/include/postgres/executor/tablefunc.h +67 -0
- data/ext/pg_query/include/postgres/executor/tuptable.h +523 -0
- data/ext/pg_query/include/postgres/fmgr.h +800 -0
- data/ext/pg_query/include/postgres/foreign/fdwapi.h +294 -0
- data/ext/pg_query/include/postgres/funcapi.h +360 -0
- data/ext/pg_query/include/postgres/gram.h +1168 -0
- data/ext/pg_query/include/postgres/gramparse.h +75 -0
- data/ext/pg_query/include/postgres/jit/jit.h +106 -0
- data/ext/pg_query/include/postgres/kwlist_d.h +1164 -0
- data/ext/pg_query/include/postgres/lib/dshash.h +130 -0
- data/ext/pg_query/include/postgres/lib/ilist.h +1159 -0
- data/ext/pg_query/include/postgres/lib/pairingheap.h +102 -0
- data/ext/pg_query/include/postgres/lib/simplehash.h +1206 -0
- data/ext/pg_query/include/postgres/lib/sort_template.h +445 -0
- data/ext/pg_query/include/postgres/lib/stringinfo.h +243 -0
- data/ext/pg_query/include/postgres/libpq/auth.h +37 -0
- data/ext/pg_query/include/postgres/libpq/crypt.h +47 -0
- data/ext/pg_query/include/postgres/libpq/hba.h +186 -0
- data/ext/pg_query/include/postgres/libpq/libpq-be.h +361 -0
- data/ext/pg_query/include/postgres/libpq/libpq.h +143 -0
- data/ext/pg_query/include/postgres/libpq/pqcomm.h +169 -0
- data/ext/pg_query/include/postgres/libpq/pqformat.h +209 -0
- data/ext/pg_query/include/postgres/libpq/pqsignal.h +54 -0
- data/ext/pg_query/include/postgres/libpq/protocol.h +89 -0
- data/ext/pg_query/include/postgres/libpq/sasl.h +136 -0
- data/ext/pg_query/include/postgres/libpq/scram.h +37 -0
- data/ext/pg_query/include/postgres/mb/pg_wchar.h +793 -0
- data/ext/pg_query/include/postgres/mb/stringinfo_mb.h +24 -0
- data/ext/pg_query/include/postgres/miscadmin.h +527 -0
- data/ext/pg_query/include/postgres/nodes/bitmapset.h +140 -0
- data/ext/pg_query/include/postgres/nodes/execnodes.h +2855 -0
- data/ext/pg_query/include/postgres/nodes/extensible.h +164 -0
- data/ext/pg_query/include/postgres/nodes/lockoptions.h +61 -0
- data/ext/pg_query/include/postgres/nodes/makefuncs.h +127 -0
- data/ext/pg_query/include/postgres/nodes/memnodes.h +152 -0
- data/ext/pg_query/include/postgres/nodes/miscnodes.h +56 -0
- data/ext/pg_query/include/postgres/nodes/nodeFuncs.h +222 -0
- data/ext/pg_query/include/postgres/nodes/nodes.h +435 -0
- data/ext/pg_query/include/postgres/nodes/nodetags.h +491 -0
- data/ext/pg_query/include/postgres/nodes/params.h +170 -0
- data/ext/pg_query/include/postgres/nodes/parsenodes.h +4233 -0
- data/ext/pg_query/include/postgres/nodes/pathnodes.h +3438 -0
- data/ext/pg_query/include/postgres/nodes/pg_list.h +686 -0
- data/ext/pg_query/include/postgres/nodes/plannodes.h +1593 -0
- data/ext/pg_query/include/postgres/nodes/primnodes.h +2339 -0
- data/ext/pg_query/include/postgres/nodes/print.h +34 -0
- data/ext/pg_query/include/postgres/nodes/queryjumble.h +86 -0
- data/ext/pg_query/include/postgres/nodes/replnodes.h +132 -0
- data/ext/pg_query/include/postgres/nodes/supportnodes.h +346 -0
- data/ext/pg_query/include/postgres/nodes/tidbitmap.h +75 -0
- data/ext/pg_query/include/postgres/nodes/value.h +90 -0
- data/ext/pg_query/include/postgres/optimizer/cost.h +216 -0
- data/ext/pg_query/include/postgres/optimizer/geqo.h +90 -0
- data/ext/pg_query/include/postgres/optimizer/geqo_gene.h +45 -0
- data/ext/pg_query/include/postgres/optimizer/optimizer.h +205 -0
- data/ext/pg_query/include/postgres/optimizer/paths.h +271 -0
- data/ext/pg_query/include/postgres/optimizer/planmain.h +123 -0
- data/ext/pg_query/include/postgres/parser/analyze.h +66 -0
- data/ext/pg_query/include/postgres/parser/kwlist.h +518 -0
- data/ext/pg_query/include/postgres/parser/parse_agg.h +65 -0
- data/ext/pg_query/include/postgres/parser/parse_coerce.h +105 -0
- data/ext/pg_query/include/postgres/parser/parse_expr.h +25 -0
- data/ext/pg_query/include/postgres/parser/parse_func.h +74 -0
- data/ext/pg_query/include/postgres/parser/parse_node.h +358 -0
- data/ext/pg_query/include/postgres/parser/parse_oper.h +68 -0
- data/ext/pg_query/include/postgres/parser/parse_relation.h +129 -0
- data/ext/pg_query/include/postgres/parser/parse_type.h +61 -0
- data/ext/pg_query/include/postgres/parser/parser.h +68 -0
- data/ext/pg_query/include/postgres/parser/parsetree.h +61 -0
- data/ext/pg_query/include/postgres/parser/scanner.h +152 -0
- data/ext/pg_query/include/postgres/parser/scansup.h +27 -0
- data/ext/pg_query/include/postgres/partitioning/partdefs.h +26 -0
- data/ext/pg_query/include/postgres/pg_config.h +985 -0
- data/ext/pg_query/include/postgres/pg_config_manual.h +385 -0
- data/ext/pg_query/include/postgres/pg_config_os.h +8 -0
- data/ext/pg_query/include/postgres/pg_getopt.h +56 -0
- data/ext/pg_query/include/postgres/pg_trace.h +17 -0
- data/ext/pg_query/include/postgres/pgstat.h +780 -0
- data/ext/pg_query/include/postgres/pgtime.h +94 -0
- data/ext/pg_query/include/postgres/pl_gram.h +385 -0
- data/ext/pg_query/include/postgres/pl_reserved_kwlist.h +52 -0
- data/ext/pg_query/include/postgres/pl_reserved_kwlist_d.h +114 -0
- data/ext/pg_query/include/postgres/pl_unreserved_kwlist.h +112 -0
- data/ext/pg_query/include/postgres/pl_unreserved_kwlist_d.h +246 -0
- data/ext/pg_query/include/postgres/plerrcodes.h +998 -0
- data/ext/pg_query/include/postgres/plpgsql.h +1342 -0
- data/ext/pg_query/include/postgres/port/atomics/arch-arm.h +32 -0
- data/ext/pg_query/include/postgres/port/atomics/arch-hppa.h +17 -0
- data/ext/pg_query/include/postgres/port/atomics/arch-ppc.h +256 -0
- data/ext/pg_query/include/postgres/port/atomics/arch-x86.h +254 -0
- data/ext/pg_query/include/postgres/port/atomics/fallback.h +170 -0
- data/ext/pg_query/include/postgres/port/atomics/generic-gcc.h +323 -0
- data/ext/pg_query/include/postgres/port/atomics/generic-msvc.h +119 -0
- data/ext/pg_query/include/postgres/port/atomics/generic-sunpro.h +121 -0
- data/ext/pg_query/include/postgres/port/atomics/generic.h +437 -0
- data/ext/pg_query/include/postgres/port/atomics.h +606 -0
- data/ext/pg_query/include/postgres/port/pg_bitutils.h +421 -0
- data/ext/pg_query/include/postgres/port/pg_bswap.h +161 -0
- data/ext/pg_query/include/postgres/port/pg_crc32c.h +110 -0
- data/ext/pg_query/include/postgres/port/pg_iovec.h +117 -0
- data/ext/pg_query/include/postgres/port/simd.h +422 -0
- data/ext/pg_query/include/postgres/port/win32/arpa/inet.h +3 -0
- data/ext/pg_query/include/postgres/port/win32/dlfcn.h +1 -0
- data/ext/pg_query/include/postgres/port/win32/grp.h +1 -0
- data/ext/pg_query/include/postgres/port/win32/netdb.h +7 -0
- data/ext/pg_query/include/postgres/port/win32/netinet/in.h +3 -0
- data/ext/pg_query/include/postgres/port/win32/netinet/tcp.h +7 -0
- data/ext/pg_query/include/postgres/port/win32/pwd.h +3 -0
- data/ext/pg_query/include/postgres/port/win32/sys/resource.h +20 -0
- data/ext/pg_query/include/postgres/port/win32/sys/select.h +3 -0
- data/ext/pg_query/include/postgres/port/win32/sys/socket.h +34 -0
- data/ext/pg_query/include/postgres/port/win32/sys/un.h +17 -0
- data/ext/pg_query/include/postgres/port/win32/sys/wait.h +3 -0
- data/ext/pg_query/include/postgres/port/win32.h +59 -0
- data/ext/pg_query/include/postgres/port/win32_msvc/dirent.h +34 -0
- data/ext/pg_query/include/postgres/port/win32_msvc/sys/file.h +1 -0
- data/ext/pg_query/include/postgres/port/win32_msvc/sys/param.h +1 -0
- data/ext/pg_query/include/postgres/port/win32_msvc/sys/time.h +1 -0
- data/ext/pg_query/include/postgres/port/win32_msvc/unistd.h +9 -0
- data/ext/pg_query/include/postgres/port/win32_msvc/utime.h +3 -0
- data/ext/pg_query/include/postgres/port/win32_port.h +582 -0
- data/ext/pg_query/include/postgres/port.h +555 -0
- data/ext/pg_query/include/postgres/portability/instr_time.h +197 -0
- data/ext/pg_query/include/postgres/postgres.h +579 -0
- data/ext/pg_query/include/postgres/postgres_ext.h +73 -0
- data/ext/pg_query/include/postgres/postmaster/autovacuum.h +69 -0
- data/ext/pg_query/include/postgres/postmaster/bgworker.h +164 -0
- data/ext/pg_query/include/postgres/postmaster/bgworker_internals.h +60 -0
- data/ext/pg_query/include/postgres/postmaster/bgwriter.h +45 -0
- data/ext/pg_query/include/postgres/postmaster/interrupt.h +32 -0
- data/ext/pg_query/include/postgres/postmaster/pgarch.h +36 -0
- data/ext/pg_query/include/postgres/postmaster/postmaster.h +101 -0
- data/ext/pg_query/include/postgres/postmaster/startup.h +41 -0
- data/ext/pg_query/include/postgres/postmaster/syslogger.h +101 -0
- data/ext/pg_query/include/postgres/postmaster/walsummarizer.h +35 -0
- data/ext/pg_query/include/postgres/postmaster/walwriter.h +23 -0
- data/ext/pg_query/include/postgres/regex/regex.h +272 -0
- data/ext/pg_query/include/postgres/replication/logicallauncher.h +34 -0
- data/ext/pg_query/include/postgres/replication/logicalproto.h +274 -0
- data/ext/pg_query/include/postgres/replication/logicalworker.h +33 -0
- data/ext/pg_query/include/postgres/replication/origin.h +73 -0
- data/ext/pg_query/include/postgres/replication/reorderbuffer.h +734 -0
- data/ext/pg_query/include/postgres/replication/slot.h +289 -0
- data/ext/pg_query/include/postgres/replication/slotsync.h +38 -0
- data/ext/pg_query/include/postgres/replication/syncrep.h +109 -0
- data/ext/pg_query/include/postgres/replication/walreceiver.h +504 -0
- data/ext/pg_query/include/postgres/replication/walsender.h +76 -0
- data/ext/pg_query/include/postgres/rewrite/prs2lock.h +46 -0
- data/ext/pg_query/include/postgres/rewrite/rewriteHandler.h +41 -0
- data/ext/pg_query/include/postgres/rewrite/rewriteManip.h +96 -0
- data/ext/pg_query/include/postgres/rewrite/rewriteSupport.h +26 -0
- data/ext/pg_query/include/postgres/storage/block.h +108 -0
- data/ext/pg_query/include/postgres/storage/buf.h +46 -0
- data/ext/pg_query/include/postgres/storage/bufmgr.h +411 -0
- data/ext/pg_query/include/postgres/storage/bufpage.h +510 -0
- data/ext/pg_query/include/postgres/storage/condition_variable.h +73 -0
- data/ext/pg_query/include/postgres/storage/dsm.h +61 -0
- data/ext/pg_query/include/postgres/storage/dsm_impl.h +79 -0
- data/ext/pg_query/include/postgres/storage/fd.h +219 -0
- data/ext/pg_query/include/postgres/storage/fileset.h +40 -0
- data/ext/pg_query/include/postgres/storage/ipc.h +87 -0
- data/ext/pg_query/include/postgres/storage/item.h +19 -0
- data/ext/pg_query/include/postgres/storage/itemid.h +184 -0
- data/ext/pg_query/include/postgres/storage/itemptr.h +245 -0
- data/ext/pg_query/include/postgres/storage/large_object.h +100 -0
- data/ext/pg_query/include/postgres/storage/latch.h +196 -0
- data/ext/pg_query/include/postgres/storage/lmgr.h +126 -0
- data/ext/pg_query/include/postgres/storage/lock.h +624 -0
- data/ext/pg_query/include/postgres/storage/lockdefs.h +61 -0
- data/ext/pg_query/include/postgres/storage/lwlock.h +228 -0
- data/ext/pg_query/include/postgres/storage/lwlocknames.h +47 -0
- data/ext/pg_query/include/postgres/storage/off.h +57 -0
- data/ext/pg_query/include/postgres/storage/pg_sema.h +61 -0
- data/ext/pg_query/include/postgres/storage/pg_shmem.h +93 -0
- data/ext/pg_query/include/postgres/storage/pmsignal.h +105 -0
- data/ext/pg_query/include/postgres/storage/predicate.h +83 -0
- data/ext/pg_query/include/postgres/storage/proc.h +488 -0
- data/ext/pg_query/include/postgres/storage/procarray.h +103 -0
- data/ext/pg_query/include/postgres/storage/proclist_types.h +53 -0
- data/ext/pg_query/include/postgres/storage/procnumber.h +43 -0
- data/ext/pg_query/include/postgres/storage/procsignal.h +75 -0
- data/ext/pg_query/include/postgres/storage/read_stream.h +65 -0
- data/ext/pg_query/include/postgres/storage/relfilelocator.h +100 -0
- data/ext/pg_query/include/postgres/storage/s_lock.h +847 -0
- data/ext/pg_query/include/postgres/storage/sharedfileset.h +37 -0
- data/ext/pg_query/include/postgres/storage/shm_mq.h +86 -0
- data/ext/pg_query/include/postgres/storage/shm_toc.h +58 -0
- data/ext/pg_query/include/postgres/storage/shmem.h +59 -0
- data/ext/pg_query/include/postgres/storage/sinval.h +153 -0
- data/ext/pg_query/include/postgres/storage/smgr.h +130 -0
- data/ext/pg_query/include/postgres/storage/spin.h +77 -0
- data/ext/pg_query/include/postgres/storage/standby.h +109 -0
- data/ext/pg_query/include/postgres/storage/standbydefs.h +74 -0
- data/ext/pg_query/include/postgres/storage/sync.h +66 -0
- data/ext/pg_query/include/postgres/tcop/cmdtag.h +62 -0
- data/ext/pg_query/include/postgres/tcop/cmdtaglist.h +219 -0
- data/ext/pg_query/include/postgres/tcop/deparse_utility.h +108 -0
- data/ext/pg_query/include/postgres/tcop/dest.h +148 -0
- data/ext/pg_query/include/postgres/tcop/fastpath.h +20 -0
- data/ext/pg_query/include/postgres/tcop/pquery.h +51 -0
- data/ext/pg_query/include/postgres/tcop/tcopprot.h +98 -0
- data/ext/pg_query/include/postgres/tcop/utility.h +112 -0
- data/ext/pg_query/include/postgres/tsearch/ts_cache.h +96 -0
- data/ext/pg_query/include/postgres/utils/acl.h +290 -0
- data/ext/pg_query/include/postgres/utils/aclchk_internal.h +45 -0
- data/ext/pg_query/include/postgres/utils/array.h +481 -0
- data/ext/pg_query/include/postgres/utils/ascii.h +84 -0
- data/ext/pg_query/include/postgres/utils/backend_progress.h +46 -0
- data/ext/pg_query/include/postgres/utils/backend_status.h +340 -0
- data/ext/pg_query/include/postgres/utils/builtins.h +139 -0
- data/ext/pg_query/include/postgres/utils/bytea.h +28 -0
- data/ext/pg_query/include/postgres/utils/catcache.h +231 -0
- data/ext/pg_query/include/postgres/utils/date.h +118 -0
- data/ext/pg_query/include/postgres/utils/datetime.h +367 -0
- data/ext/pg_query/include/postgres/utils/datum.h +76 -0
- data/ext/pg_query/include/postgres/utils/dsa.h +166 -0
- data/ext/pg_query/include/postgres/utils/elog.h +540 -0
- data/ext/pg_query/include/postgres/utils/errcodes.h +352 -0
- data/ext/pg_query/include/postgres/utils/expandeddatum.h +170 -0
- data/ext/pg_query/include/postgres/utils/expandedrecord.h +241 -0
- data/ext/pg_query/include/postgres/utils/float.h +357 -0
- data/ext/pg_query/include/postgres/utils/fmgroids.h +3347 -0
- data/ext/pg_query/include/postgres/utils/fmgrprotos.h +2904 -0
- data/ext/pg_query/include/postgres/utils/fmgrtab.h +49 -0
- data/ext/pg_query/include/postgres/utils/guc.h +456 -0
- data/ext/pg_query/include/postgres/utils/guc_hooks.h +184 -0
- data/ext/pg_query/include/postgres/utils/guc_tables.h +323 -0
- data/ext/pg_query/include/postgres/utils/hsearch.h +153 -0
- data/ext/pg_query/include/postgres/utils/injection_point.h +44 -0
- data/ext/pg_query/include/postgres/utils/inval.h +68 -0
- data/ext/pg_query/include/postgres/utils/logtape.h +77 -0
- data/ext/pg_query/include/postgres/utils/lsyscache.h +215 -0
- data/ext/pg_query/include/postgres/utils/memdebug.h +82 -0
- data/ext/pg_query/include/postgres/utils/memutils.h +193 -0
- data/ext/pg_query/include/postgres/utils/memutils_internal.h +176 -0
- data/ext/pg_query/include/postgres/utils/memutils_memorychunk.h +253 -0
- data/ext/pg_query/include/postgres/utils/numeric.h +110 -0
- data/ext/pg_query/include/postgres/utils/palloc.h +151 -0
- data/ext/pg_query/include/postgres/utils/partcache.h +103 -0
- data/ext/pg_query/include/postgres/utils/pg_locale.h +136 -0
- data/ext/pg_query/include/postgres/utils/pgstat_internal.h +827 -0
- data/ext/pg_query/include/postgres/utils/plancache.h +238 -0
- data/ext/pg_query/include/postgres/utils/portal.h +252 -0
- data/ext/pg_query/include/postgres/utils/probes.h +114 -0
- data/ext/pg_query/include/postgres/utils/ps_status.h +47 -0
- data/ext/pg_query/include/postgres/utils/queryenvironment.h +74 -0
- data/ext/pg_query/include/postgres/utils/regproc.h +39 -0
- data/ext/pg_query/include/postgres/utils/rel.h +711 -0
- data/ext/pg_query/include/postgres/utils/relcache.h +155 -0
- data/ext/pg_query/include/postgres/utils/reltrigger.h +81 -0
- data/ext/pg_query/include/postgres/utils/resowner.h +167 -0
- data/ext/pg_query/include/postgres/utils/ruleutils.h +52 -0
- data/ext/pg_query/include/postgres/utils/sharedtuplestore.h +61 -0
- data/ext/pg_query/include/postgres/utils/snapmgr.h +130 -0
- data/ext/pg_query/include/postgres/utils/snapshot.h +219 -0
- data/ext/pg_query/include/postgres/utils/sortsupport.h +391 -0
- data/ext/pg_query/include/postgres/utils/syscache.h +136 -0
- data/ext/pg_query/include/postgres/utils/timeout.h +96 -0
- data/ext/pg_query/include/postgres/utils/timestamp.h +147 -0
- data/ext/pg_query/include/postgres/utils/tuplesort.h +472 -0
- data/ext/pg_query/include/postgres/utils/tuplestore.h +88 -0
- data/ext/pg_query/include/postgres/utils/typcache.h +210 -0
- data/ext/pg_query/include/postgres/utils/varlena.h +53 -0
- data/ext/pg_query/include/postgres/utils/wait_event.h +108 -0
- data/ext/pg_query/include/postgres/utils/wait_event_types.h +218 -0
- data/ext/pg_query/include/postgres/utils/xml.h +94 -0
- data/ext/pg_query/include/postgres/varatt.h +358 -0
- data/ext/pg_query/include/protobuf/pg_query.pb-c.h +8077 -6217
- data/ext/pg_query/include/protobuf/pg_query.pb.h +132024 -88124
- data/ext/pg_query/pg_query.c +10 -1
- data/ext/pg_query/pg_query.pb-c.c +24028 -17173
- data/ext/pg_query/pg_query_deparse.c +1 -9902
- data/ext/pg_query/pg_query_fingerprint.c +42 -18
- data/ext/pg_query/pg_query_fingerprint.h +1 -1
- data/ext/pg_query/pg_query_internal.h +1 -1
- data/ext/pg_query/pg_query_json_plpgsql.c +1 -25
- data/ext/pg_query/pg_query_normalize.c +44 -3
- data/ext/pg_query/pg_query_outfuncs_json.c +62 -16
- data/ext/pg_query/pg_query_outfuncs_protobuf.c +73 -12
- data/ext/pg_query/pg_query_parse.c +47 -5
- data/ext/pg_query/pg_query_parse_plpgsql.c +19 -18
- data/ext/pg_query/pg_query_readfuncs_protobuf.c +45 -10
- data/ext/pg_query/pg_query_ruby.c +5 -0
- data/ext/pg_query/pg_query_scan.c +4 -3
- data/ext/pg_query/pg_query_split.c +6 -5
- data/ext/pg_query/postgres_deparse.c +11496 -0
- data/ext/pg_query/postgres_deparse.h +9 -0
- data/ext/pg_query/src_backend_catalog_namespace.c +262 -71
- data/ext/pg_query/src_backend_catalog_pg_proc.c +3 -2
- data/ext/pg_query/src_backend_commands_define.c +12 -3
- data/ext/pg_query/src_backend_nodes_bitmapset.c +142 -156
- data/ext/pg_query/src_backend_nodes_copyfuncs.c +100 -5881
- data/ext/pg_query/src_backend_nodes_equalfuncs.c +102 -3831
- data/ext/pg_query/src_backend_nodes_extensible.c +6 -29
- data/ext/pg_query/src_backend_nodes_list.c +89 -18
- data/ext/pg_query/src_backend_nodes_makefuncs.c +138 -4
- data/ext/pg_query/src_backend_nodes_nodeFuncs.c +433 -132
- data/ext/pg_query/src_backend_nodes_value.c +28 -19
- data/ext/pg_query/src_backend_parser_gram.c +45255 -38885
- data/ext/pg_query/src_backend_parser_parser.c +53 -8
- data/ext/pg_query/src_backend_parser_scan.c +6999 -3438
- data/ext/pg_query/src_backend_parser_scansup.c +5 -28
- data/ext/pg_query/src_backend_storage_ipc_ipc.c +13 -4
- data/ext/pg_query/src_backend_tcop_postgres.c +156 -114
- data/ext/pg_query/src_backend_utils_activity_pgstat_database.c +140 -0
- data/ext/pg_query/src_backend_utils_adt_datum.c +14 -2
- data/ext/pg_query/src_backend_utils_adt_expandeddatum.c +1 -1
- data/ext/pg_query/src_backend_utils_adt_format_type.c +6 -2
- data/ext/pg_query/src_backend_utils_adt_numutils.c +488 -0
- data/ext/pg_query/src_backend_utils_adt_ruleutils.c +247 -34
- data/ext/pg_query/src_backend_utils_error_assert.c +17 -18
- data/ext/pg_query/src_backend_utils_error_elog.c +543 -343
- data/ext/pg_query/src_backend_utils_fmgr_fmgr.c +47 -18
- data/ext/pg_query/src_backend_utils_init_globals.c +22 -7
- data/ext/pg_query/src_backend_utils_mb_mbutils.c +84 -148
- data/ext/pg_query/src_backend_utils_misc_guc_tables.c +502 -0
- data/ext/pg_query/src_backend_utils_mmgr_alignedalloc.c +166 -0
- data/ext/pg_query/src_backend_utils_mmgr_aset.c +708 -499
- data/ext/pg_query/src_backend_utils_mmgr_bump.c +728 -0
- data/ext/pg_query/src_backend_utils_mmgr_generation.c +1115 -0
- data/ext/pg_query/src_backend_utils_mmgr_mcxt.c +710 -218
- data/ext/pg_query/src_backend_utils_mmgr_slab.c +1079 -0
- data/ext/pg_query/src_common_encnames.c +46 -44
- data/ext/pg_query/src_common_hashfn.c +3 -3
- data/ext/pg_query/src_common_keywords.c +15 -2
- data/ext/pg_query/src_common_kwlist_d.h +602 -510
- 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 +21 -4
- data/ext/pg_query/src_common_wchar.c +754 -178
- data/ext/pg_query/src_pl_plpgsql_src_pl_comp.c +143 -24
- data/ext/pg_query/src_pl_plpgsql_src_pl_funcs.c +3 -18
- data/ext/pg_query/src_pl_plpgsql_src_pl_gram.c +1295 -1255
- 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 +10 -10
- data/ext/pg_query/src_pl_plpgsql_src_pl_scanner.c +20 -2
- data/ext/pg_query/src_pl_plpgsql_src_pl_unreserved_kwlist_d.h +60 -60
- data/ext/pg_query/src_port_pg_bitutils.c +283 -54
- data/ext/pg_query/src_port_pgstrcasecmp.c +57 -1
- data/ext/pg_query/src_port_qsort.c +12 -224
- data/ext/pg_query/src_port_snprintf.c +56 -39
- data/ext/pg_query/src_port_strerror.c +9 -21
- data/ext/pg_query/src_port_strlcpy.c +79 -0
- data/lib/pg_query/filter_columns.rb +1 -1
- data/lib/pg_query/fingerprint.rb +10 -9
- data/lib/pg_query/node.rb +18 -13
- data/lib/pg_query/param_refs.rb +3 -3
- data/lib/pg_query/parse.rb +25 -15
- data/lib/pg_query/parse_error.rb +1 -0
- data/lib/pg_query/pg_query_pb.rb +181 -3038
- data/lib/pg_query/scan.rb +1 -0
- data/lib/pg_query/treewalker.rb +55 -8
- data/lib/pg_query/truncate.rb +19 -21
- data/lib/pg_query/version.rb +1 -1
- metadata +447 -436
- data/ext/pg_query/guc-file.c +0 -0
- data/ext/pg_query/include/access/amapi.h +0 -246
- data/ext/pg_query/include/access/attmap.h +0 -52
- data/ext/pg_query/include/access/attnum.h +0 -64
- data/ext/pg_query/include/access/clog.h +0 -61
- data/ext/pg_query/include/access/commit_ts.h +0 -77
- data/ext/pg_query/include/access/detoast.h +0 -92
- data/ext/pg_query/include/access/genam.h +0 -228
- data/ext/pg_query/include/access/gin.h +0 -78
- data/ext/pg_query/include/access/htup.h +0 -89
- data/ext/pg_query/include/access/htup_details.h +0 -819
- data/ext/pg_query/include/access/itup.h +0 -161
- data/ext/pg_query/include/access/parallel.h +0 -82
- data/ext/pg_query/include/access/printtup.h +0 -35
- data/ext/pg_query/include/access/relation.h +0 -28
- data/ext/pg_query/include/access/relscan.h +0 -176
- data/ext/pg_query/include/access/rmgr.h +0 -35
- data/ext/pg_query/include/access/rmgrlist.h +0 -49
- data/ext/pg_query/include/access/sdir.h +0 -58
- data/ext/pg_query/include/access/skey.h +0 -151
- data/ext/pg_query/include/access/stratnum.h +0 -83
- data/ext/pg_query/include/access/sysattr.h +0 -29
- data/ext/pg_query/include/access/table.h +0 -27
- data/ext/pg_query/include/access/tableam.h +0 -1825
- data/ext/pg_query/include/access/transam.h +0 -265
- data/ext/pg_query/include/access/tupconvert.h +0 -51
- data/ext/pg_query/include/access/tupdesc.h +0 -154
- data/ext/pg_query/include/access/tupmacs.h +0 -247
- data/ext/pg_query/include/access/twophase.h +0 -63
- data/ext/pg_query/include/access/xact.h +0 -469
- data/ext/pg_query/include/access/xlog.h +0 -398
- data/ext/pg_query/include/access/xlog_internal.h +0 -339
- data/ext/pg_query/include/access/xlogdefs.h +0 -109
- data/ext/pg_query/include/access/xloginsert.h +0 -64
- data/ext/pg_query/include/access/xlogreader.h +0 -337
- data/ext/pg_query/include/access/xlogrecord.h +0 -227
- data/ext/pg_query/include/bootstrap/bootstrap.h +0 -62
- data/ext/pg_query/include/c.h +0 -1334
- data/ext/pg_query/include/catalog/catalog.h +0 -42
- data/ext/pg_query/include/catalog/catversion.h +0 -58
- data/ext/pg_query/include/catalog/dependency.h +0 -277
- data/ext/pg_query/include/catalog/genbki.h +0 -64
- data/ext/pg_query/include/catalog/index.h +0 -199
- data/ext/pg_query/include/catalog/indexing.h +0 -366
- data/ext/pg_query/include/catalog/namespace.h +0 -188
- data/ext/pg_query/include/catalog/objectaccess.h +0 -197
- data/ext/pg_query/include/catalog/objectaddress.h +0 -84
- data/ext/pg_query/include/catalog/pg_aggregate.h +0 -176
- data/ext/pg_query/include/catalog/pg_aggregate_d.h +0 -77
- data/ext/pg_query/include/catalog/pg_am.h +0 -60
- data/ext/pg_query/include/catalog/pg_am_d.h +0 -45
- data/ext/pg_query/include/catalog/pg_attribute.h +0 -204
- data/ext/pg_query/include/catalog/pg_attribute_d.h +0 -59
- data/ext/pg_query/include/catalog/pg_authid.h +0 -58
- data/ext/pg_query/include/catalog/pg_authid_d.h +0 -49
- data/ext/pg_query/include/catalog/pg_class.h +0 -200
- data/ext/pg_query/include/catalog/pg_class_d.h +0 -103
- data/ext/pg_query/include/catalog/pg_collation.h +0 -73
- data/ext/pg_query/include/catalog/pg_collation_d.h +0 -45
- data/ext/pg_query/include/catalog/pg_constraint.h +0 -247
- data/ext/pg_query/include/catalog/pg_constraint_d.h +0 -67
- data/ext/pg_query/include/catalog/pg_control.h +0 -252
- data/ext/pg_query/include/catalog/pg_conversion.h +0 -72
- data/ext/pg_query/include/catalog/pg_conversion_d.h +0 -35
- data/ext/pg_query/include/catalog/pg_depend.h +0 -73
- data/ext/pg_query/include/catalog/pg_depend_d.h +0 -34
- data/ext/pg_query/include/catalog/pg_event_trigger.h +0 -51
- data/ext/pg_query/include/catalog/pg_event_trigger_d.h +0 -34
- data/ext/pg_query/include/catalog/pg_index.h +0 -80
- data/ext/pg_query/include/catalog/pg_index_d.h +0 -56
- data/ext/pg_query/include/catalog/pg_language.h +0 -67
- data/ext/pg_query/include/catalog/pg_language_d.h +0 -39
- data/ext/pg_query/include/catalog/pg_namespace.h +0 -59
- data/ext/pg_query/include/catalog/pg_namespace_d.h +0 -34
- data/ext/pg_query/include/catalog/pg_opclass.h +0 -85
- data/ext/pg_query/include/catalog/pg_opclass_d.h +0 -49
- data/ext/pg_query/include/catalog/pg_operator.h +0 -104
- data/ext/pg_query/include/catalog/pg_operator_d.h +0 -106
- data/ext/pg_query/include/catalog/pg_opfamily.h +0 -60
- data/ext/pg_query/include/catalog/pg_opfamily_d.h +0 -47
- data/ext/pg_query/include/catalog/pg_partitioned_table.h +0 -63
- data/ext/pg_query/include/catalog/pg_partitioned_table_d.h +0 -35
- data/ext/pg_query/include/catalog/pg_proc.h +0 -211
- data/ext/pg_query/include/catalog/pg_proc_d.h +0 -99
- data/ext/pg_query/include/catalog/pg_publication.h +0 -118
- data/ext/pg_query/include/catalog/pg_publication_d.h +0 -36
- data/ext/pg_query/include/catalog/pg_replication_origin.h +0 -57
- data/ext/pg_query/include/catalog/pg_replication_origin_d.h +0 -29
- data/ext/pg_query/include/catalog/pg_statistic.h +0 -275
- data/ext/pg_query/include/catalog/pg_statistic_d.h +0 -194
- data/ext/pg_query/include/catalog/pg_statistic_ext.h +0 -74
- data/ext/pg_query/include/catalog/pg_statistic_ext_d.h +0 -40
- data/ext/pg_query/include/catalog/pg_transform.h +0 -45
- data/ext/pg_query/include/catalog/pg_transform_d.h +0 -32
- data/ext/pg_query/include/catalog/pg_trigger.h +0 -137
- data/ext/pg_query/include/catalog/pg_trigger_d.h +0 -106
- data/ext/pg_query/include/catalog/pg_ts_config.h +0 -50
- data/ext/pg_query/include/catalog/pg_ts_config_d.h +0 -32
- data/ext/pg_query/include/catalog/pg_ts_dict.h +0 -54
- data/ext/pg_query/include/catalog/pg_ts_dict_d.h +0 -33
- data/ext/pg_query/include/catalog/pg_ts_parser.h +0 -57
- data/ext/pg_query/include/catalog/pg_ts_parser_d.h +0 -35
- data/ext/pg_query/include/catalog/pg_ts_template.h +0 -48
- data/ext/pg_query/include/catalog/pg_ts_template_d.h +0 -32
- data/ext/pg_query/include/catalog/pg_type.h +0 -373
- data/ext/pg_query/include/catalog/pg_type_d.h +0 -285
- data/ext/pg_query/include/catalog/storage.h +0 -48
- data/ext/pg_query/include/commands/async.h +0 -54
- data/ext/pg_query/include/commands/dbcommands.h +0 -35
- data/ext/pg_query/include/commands/defrem.h +0 -173
- data/ext/pg_query/include/commands/event_trigger.h +0 -88
- data/ext/pg_query/include/commands/explain.h +0 -127
- data/ext/pg_query/include/commands/prepare.h +0 -61
- data/ext/pg_query/include/commands/tablespace.h +0 -69
- data/ext/pg_query/include/commands/trigger.h +0 -285
- data/ext/pg_query/include/commands/user.h +0 -37
- data/ext/pg_query/include/commands/vacuum.h +0 -293
- data/ext/pg_query/include/commands/variable.h +0 -38
- data/ext/pg_query/include/common/file_perm.h +0 -56
- data/ext/pg_query/include/common/hashfn.h +0 -104
- data/ext/pg_query/include/common/ip.h +0 -37
- data/ext/pg_query/include/common/keywords.h +0 -33
- data/ext/pg_query/include/common/kwlookup.h +0 -44
- data/ext/pg_query/include/common/relpath.h +0 -90
- data/ext/pg_query/include/common/string.h +0 -19
- data/ext/pg_query/include/common/unicode_combining_table.h +0 -196
- data/ext/pg_query/include/datatype/timestamp.h +0 -197
- data/ext/pg_query/include/executor/execdesc.h +0 -70
- data/ext/pg_query/include/executor/executor.h +0 -620
- data/ext/pg_query/include/executor/functions.h +0 -41
- data/ext/pg_query/include/executor/instrument.h +0 -101
- data/ext/pg_query/include/executor/spi.h +0 -175
- data/ext/pg_query/include/executor/tablefunc.h +0 -67
- data/ext/pg_query/include/executor/tuptable.h +0 -487
- data/ext/pg_query/include/fmgr.h +0 -775
- data/ext/pg_query/include/funcapi.h +0 -348
- data/ext/pg_query/include/getaddrinfo.h +0 -162
- data/ext/pg_query/include/jit/jit.h +0 -105
- data/ext/pg_query/include/kwlist_d.h +0 -1072
- data/ext/pg_query/include/lib/ilist.h +0 -727
- data/ext/pg_query/include/lib/pairingheap.h +0 -102
- data/ext/pg_query/include/lib/simplehash.h +0 -1059
- data/ext/pg_query/include/lib/stringinfo.h +0 -161
- data/ext/pg_query/include/libpq/auth.h +0 -29
- data/ext/pg_query/include/libpq/crypt.h +0 -46
- data/ext/pg_query/include/libpq/hba.h +0 -140
- data/ext/pg_query/include/libpq/libpq-be.h +0 -326
- data/ext/pg_query/include/libpq/libpq.h +0 -134
- data/ext/pg_query/include/libpq/pqcomm.h +0 -208
- data/ext/pg_query/include/libpq/pqformat.h +0 -210
- data/ext/pg_query/include/libpq/pqsignal.h +0 -42
- data/ext/pg_query/include/mb/pg_wchar.h +0 -673
- data/ext/pg_query/include/mb/stringinfo_mb.h +0 -24
- data/ext/pg_query/include/miscadmin.h +0 -489
- data/ext/pg_query/include/nodes/bitmapset.h +0 -122
- data/ext/pg_query/include/nodes/execnodes.h +0 -2523
- data/ext/pg_query/include/nodes/extensible.h +0 -160
- data/ext/pg_query/include/nodes/lockoptions.h +0 -61
- data/ext/pg_query/include/nodes/makefuncs.h +0 -108
- data/ext/pg_query/include/nodes/memnodes.h +0 -108
- data/ext/pg_query/include/nodes/nodeFuncs.h +0 -162
- data/ext/pg_query/include/nodes/nodes.h +0 -842
- data/ext/pg_query/include/nodes/params.h +0 -170
- data/ext/pg_query/include/nodes/parsenodes.h +0 -3580
- data/ext/pg_query/include/nodes/pathnodes.h +0 -2557
- data/ext/pg_query/include/nodes/pg_list.h +0 -606
- data/ext/pg_query/include/nodes/plannodes.h +0 -1266
- data/ext/pg_query/include/nodes/primnodes.h +0 -1541
- data/ext/pg_query/include/nodes/print.h +0 -34
- data/ext/pg_query/include/nodes/tidbitmap.h +0 -75
- data/ext/pg_query/include/nodes/value.h +0 -61
- data/ext/pg_query/include/optimizer/cost.h +0 -206
- data/ext/pg_query/include/optimizer/geqo.h +0 -88
- data/ext/pg_query/include/optimizer/geqo_gene.h +0 -45
- data/ext/pg_query/include/optimizer/optimizer.h +0 -194
- data/ext/pg_query/include/optimizer/paths.h +0 -257
- data/ext/pg_query/include/optimizer/planmain.h +0 -119
- data/ext/pg_query/include/parser/analyze.h +0 -49
- data/ext/pg_query/include/parser/gram.h +0 -1067
- data/ext/pg_query/include/parser/gramparse.h +0 -75
- data/ext/pg_query/include/parser/kwlist.h +0 -477
- data/ext/pg_query/include/parser/parse_agg.h +0 -68
- data/ext/pg_query/include/parser/parse_clause.h +0 -54
- data/ext/pg_query/include/parser/parse_coerce.h +0 -98
- data/ext/pg_query/include/parser/parse_collate.h +0 -27
- data/ext/pg_query/include/parser/parse_expr.h +0 -26
- data/ext/pg_query/include/parser/parse_func.h +0 -73
- data/ext/pg_query/include/parser/parse_node.h +0 -327
- data/ext/pg_query/include/parser/parse_oper.h +0 -67
- data/ext/pg_query/include/parser/parse_relation.h +0 -123
- data/ext/pg_query/include/parser/parse_target.h +0 -46
- data/ext/pg_query/include/parser/parse_type.h +0 -60
- data/ext/pg_query/include/parser/parser.h +0 -41
- data/ext/pg_query/include/parser/parsetree.h +0 -61
- data/ext/pg_query/include/parser/scanner.h +0 -152
- data/ext/pg_query/include/parser/scansup.h +0 -30
- data/ext/pg_query/include/partitioning/partdefs.h +0 -26
- data/ext/pg_query/include/pg_config.h +0 -995
- data/ext/pg_query/include/pg_config_manual.h +0 -357
- data/ext/pg_query/include/pg_config_os.h +0 -8
- data/ext/pg_query/include/pg_getopt.h +0 -56
- data/ext/pg_query/include/pg_trace.h +0 -17
- data/ext/pg_query/include/pgstat.h +0 -1488
- data/ext/pg_query/include/pgtime.h +0 -84
- data/ext/pg_query/include/pl_gram.h +0 -385
- data/ext/pg_query/include/pl_reserved_kwlist.h +0 -52
- data/ext/pg_query/include/pl_reserved_kwlist_d.h +0 -114
- data/ext/pg_query/include/pl_unreserved_kwlist.h +0 -112
- data/ext/pg_query/include/pl_unreserved_kwlist_d.h +0 -246
- data/ext/pg_query/include/plerrcodes.h +0 -990
- data/ext/pg_query/include/plpgsql.h +0 -1347
- data/ext/pg_query/include/port/atomics/arch-arm.h +0 -26
- data/ext/pg_query/include/port/atomics/arch-ppc.h +0 -254
- data/ext/pg_query/include/port/atomics/arch-x86.h +0 -252
- data/ext/pg_query/include/port/atomics/fallback.h +0 -170
- data/ext/pg_query/include/port/atomics/generic-gcc.h +0 -286
- data/ext/pg_query/include/port/atomics/generic.h +0 -401
- data/ext/pg_query/include/port/atomics.h +0 -524
- data/ext/pg_query/include/port/pg_bitutils.h +0 -272
- data/ext/pg_query/include/port/pg_bswap.h +0 -161
- data/ext/pg_query/include/port/pg_crc32c.h +0 -101
- data/ext/pg_query/include/port.h +0 -528
- data/ext/pg_query/include/portability/instr_time.h +0 -256
- data/ext/pg_query/include/postgres.h +0 -764
- data/ext/pg_query/include/postgres_ext.h +0 -74
- data/ext/pg_query/include/postmaster/autovacuum.h +0 -83
- data/ext/pg_query/include/postmaster/bgworker.h +0 -161
- data/ext/pg_query/include/postmaster/bgworker_internals.h +0 -64
- data/ext/pg_query/include/postmaster/bgwriter.h +0 -45
- data/ext/pg_query/include/postmaster/fork_process.h +0 -17
- data/ext/pg_query/include/postmaster/interrupt.h +0 -32
- data/ext/pg_query/include/postmaster/pgarch.h +0 -39
- data/ext/pg_query/include/postmaster/postmaster.h +0 -77
- data/ext/pg_query/include/postmaster/syslogger.h +0 -98
- data/ext/pg_query/include/postmaster/walwriter.h +0 -21
- data/ext/pg_query/include/regex/regex.h +0 -184
- data/ext/pg_query/include/replication/logicallauncher.h +0 -31
- data/ext/pg_query/include/replication/logicalproto.h +0 -110
- data/ext/pg_query/include/replication/logicalworker.h +0 -19
- data/ext/pg_query/include/replication/origin.h +0 -73
- data/ext/pg_query/include/replication/reorderbuffer.h +0 -468
- data/ext/pg_query/include/replication/slot.h +0 -219
- data/ext/pg_query/include/replication/syncrep.h +0 -115
- data/ext/pg_query/include/replication/walreceiver.h +0 -340
- data/ext/pg_query/include/replication/walsender.h +0 -74
- data/ext/pg_query/include/rewrite/prs2lock.h +0 -46
- data/ext/pg_query/include/rewrite/rewriteHandler.h +0 -40
- data/ext/pg_query/include/rewrite/rewriteManip.h +0 -87
- data/ext/pg_query/include/rewrite/rewriteSupport.h +0 -26
- data/ext/pg_query/include/storage/backendid.h +0 -37
- data/ext/pg_query/include/storage/block.h +0 -121
- data/ext/pg_query/include/storage/buf.h +0 -46
- data/ext/pg_query/include/storage/bufmgr.h +0 -292
- data/ext/pg_query/include/storage/bufpage.h +0 -459
- data/ext/pg_query/include/storage/condition_variable.h +0 -62
- data/ext/pg_query/include/storage/dsm.h +0 -61
- data/ext/pg_query/include/storage/dsm_impl.h +0 -75
- data/ext/pg_query/include/storage/fd.h +0 -168
- data/ext/pg_query/include/storage/ipc.h +0 -81
- data/ext/pg_query/include/storage/item.h +0 -19
- data/ext/pg_query/include/storage/itemid.h +0 -184
- data/ext/pg_query/include/storage/itemptr.h +0 -206
- data/ext/pg_query/include/storage/large_object.h +0 -100
- data/ext/pg_query/include/storage/latch.h +0 -190
- data/ext/pg_query/include/storage/lmgr.h +0 -114
- data/ext/pg_query/include/storage/lock.h +0 -613
- data/ext/pg_query/include/storage/lockdefs.h +0 -59
- data/ext/pg_query/include/storage/lwlock.h +0 -233
- data/ext/pg_query/include/storage/lwlocknames.h +0 -51
- data/ext/pg_query/include/storage/off.h +0 -57
- data/ext/pg_query/include/storage/pg_sema.h +0 -61
- data/ext/pg_query/include/storage/pg_shmem.h +0 -90
- data/ext/pg_query/include/storage/pmsignal.h +0 -94
- data/ext/pg_query/include/storage/predicate.h +0 -87
- data/ext/pg_query/include/storage/proc.h +0 -347
- data/ext/pg_query/include/storage/proclist_types.h +0 -51
- data/ext/pg_query/include/storage/procsignal.h +0 -75
- data/ext/pg_query/include/storage/relfilenode.h +0 -99
- data/ext/pg_query/include/storage/s_lock.h +0 -1071
- data/ext/pg_query/include/storage/sharedfileset.h +0 -45
- data/ext/pg_query/include/storage/shm_mq.h +0 -85
- data/ext/pg_query/include/storage/shm_toc.h +0 -58
- data/ext/pg_query/include/storage/shmem.h +0 -81
- data/ext/pg_query/include/storage/sinval.h +0 -153
- data/ext/pg_query/include/storage/sinvaladt.h +0 -43
- data/ext/pg_query/include/storage/smgr.h +0 -109
- data/ext/pg_query/include/storage/spin.h +0 -77
- data/ext/pg_query/include/storage/standby.h +0 -91
- data/ext/pg_query/include/storage/standbydefs.h +0 -74
- data/ext/pg_query/include/storage/sync.h +0 -62
- data/ext/pg_query/include/tcop/cmdtag.h +0 -58
- data/ext/pg_query/include/tcop/cmdtaglist.h +0 -217
- data/ext/pg_query/include/tcop/deparse_utility.h +0 -108
- data/ext/pg_query/include/tcop/dest.h +0 -149
- data/ext/pg_query/include/tcop/fastpath.h +0 -21
- data/ext/pg_query/include/tcop/pquery.h +0 -51
- data/ext/pg_query/include/tcop/tcopprot.h +0 -89
- data/ext/pg_query/include/tcop/utility.h +0 -108
- data/ext/pg_query/include/tsearch/ts_cache.h +0 -98
- data/ext/pg_query/include/utils/acl.h +0 -312
- data/ext/pg_query/include/utils/aclchk_internal.h +0 -45
- data/ext/pg_query/include/utils/array.h +0 -459
- data/ext/pg_query/include/utils/builtins.h +0 -128
- data/ext/pg_query/include/utils/bytea.h +0 -27
- data/ext/pg_query/include/utils/catcache.h +0 -231
- data/ext/pg_query/include/utils/date.h +0 -90
- data/ext/pg_query/include/utils/datetime.h +0 -343
- data/ext/pg_query/include/utils/datum.h +0 -68
- data/ext/pg_query/include/utils/dsa.h +0 -123
- data/ext/pg_query/include/utils/dynahash.h +0 -19
- data/ext/pg_query/include/utils/elog.h +0 -439
- data/ext/pg_query/include/utils/errcodes.h +0 -352
- data/ext/pg_query/include/utils/expandeddatum.h +0 -159
- data/ext/pg_query/include/utils/expandedrecord.h +0 -231
- data/ext/pg_query/include/utils/float.h +0 -356
- data/ext/pg_query/include/utils/fmgroids.h +0 -2657
- data/ext/pg_query/include/utils/fmgrprotos.h +0 -2646
- data/ext/pg_query/include/utils/fmgrtab.h +0 -48
- data/ext/pg_query/include/utils/guc.h +0 -443
- data/ext/pg_query/include/utils/guc_tables.h +0 -272
- data/ext/pg_query/include/utils/hsearch.h +0 -149
- data/ext/pg_query/include/utils/inval.h +0 -65
- data/ext/pg_query/include/utils/lsyscache.h +0 -198
- data/ext/pg_query/include/utils/memdebug.h +0 -82
- data/ext/pg_query/include/utils/memutils.h +0 -225
- data/ext/pg_query/include/utils/numeric.h +0 -76
- data/ext/pg_query/include/utils/palloc.h +0 -136
- data/ext/pg_query/include/utils/partcache.h +0 -102
- data/ext/pg_query/include/utils/pg_locale.h +0 -119
- data/ext/pg_query/include/utils/pg_lsn.h +0 -29
- data/ext/pg_query/include/utils/pidfile.h +0 -56
- data/ext/pg_query/include/utils/plancache.h +0 -235
- data/ext/pg_query/include/utils/portal.h +0 -254
- data/ext/pg_query/include/utils/probes.h +0 -114
- data/ext/pg_query/include/utils/ps_status.h +0 -25
- data/ext/pg_query/include/utils/queryenvironment.h +0 -74
- data/ext/pg_query/include/utils/regproc.h +0 -28
- data/ext/pg_query/include/utils/rel.h +0 -643
- data/ext/pg_query/include/utils/relcache.h +0 -150
- data/ext/pg_query/include/utils/reltrigger.h +0 -81
- data/ext/pg_query/include/utils/resowner.h +0 -86
- data/ext/pg_query/include/utils/rls.h +0 -50
- data/ext/pg_query/include/utils/ruleutils.h +0 -44
- data/ext/pg_query/include/utils/sharedtuplestore.h +0 -61
- data/ext/pg_query/include/utils/snapmgr.h +0 -159
- data/ext/pg_query/include/utils/snapshot.h +0 -206
- data/ext/pg_query/include/utils/sortsupport.h +0 -276
- data/ext/pg_query/include/utils/syscache.h +0 -219
- data/ext/pg_query/include/utils/timeout.h +0 -88
- data/ext/pg_query/include/utils/timestamp.h +0 -116
- data/ext/pg_query/include/utils/tuplesort.h +0 -277
- data/ext/pg_query/include/utils/tuplestore.h +0 -91
- data/ext/pg_query/include/utils/typcache.h +0 -202
- data/ext/pg_query/include/utils/tzparser.h +0 -39
- data/ext/pg_query/include/utils/varlena.h +0 -39
- data/ext/pg_query/include/utils/xml.h +0 -84
- data/ext/pg_query/pg_query_ruby_freebsd.sym +0 -2
- data/ext/pg_query/src_backend_libpq_pqcomm.c +0 -659
- data/ext/pg_query/src_backend_parser_parse_expr.c +0 -313
- data/ext/pg_query/src_backend_postmaster_postmaster.c +0 -2230
- data/ext/pg_query/src_backend_storage_lmgr_s_lock.c +0 -370
- data/ext/pg_query/src_backend_utils_hash_dynahash.c +0 -1086
- data/ext/pg_query/src_backend_utils_misc_guc.c +0 -1832
- data/ext/pg_query/src_common_string.c +0 -86
- data/ext/pg_query/src_port_erand48.c +0 -127
- data/ext/pg_query/src_port_pgsleep.c +0 -69
- data/ext/pg_query/src_port_random.c +0 -31
- data/ext/pg_query/src_port_strnlen.c +0 -39
- /data/ext/pg_query/{pg_query_ruby.sym → ext_symbols.sym} +0 -0
- /data/ext/pg_query/include/{pg_config_ext.h → postgres/pg_config_ext.h} +0 -0
@@ -4,29 +4,43 @@
|
|
4
4
|
* - MemoryContextReset
|
5
5
|
* - MemoryContextDeleteChildren
|
6
6
|
* - MemoryContextDelete
|
7
|
+
* - MemoryContextDeleteOnly
|
7
8
|
* - TopMemoryContext
|
8
9
|
* - CurrentMemoryContext
|
9
10
|
* - MemoryContextSetParent
|
10
11
|
* - MemoryContextCallResetCallbacks
|
11
12
|
* - MemoryContextResetOnly
|
12
13
|
* - repalloc
|
14
|
+
* - GetMemoryChunkContext
|
15
|
+
* - mcxt_methods
|
16
|
+
* - MemoryContextAllocationFailure
|
13
17
|
* - MemoryContextStats
|
14
18
|
* - MemoryContextStatsDetail
|
15
19
|
* - MemoryContextStatsInternal
|
16
20
|
* - MemoryContextStatsPrint
|
21
|
+
* - MemoryContextTraverseNext
|
22
|
+
* - GetMemoryChunkSpace
|
23
|
+
* - MemoryContextAllocAligned
|
24
|
+
* - MemoryContextAllocExtended
|
25
|
+
* - BogusFree
|
26
|
+
* - GetMemoryChunkHeader
|
27
|
+
* - BogusRealloc
|
28
|
+
* - BogusGetChunkContext
|
29
|
+
* - BogusGetChunkSpace
|
30
|
+
* - GetMemoryChunkMethodID
|
17
31
|
* - pfree
|
18
32
|
* - pstrdup
|
19
33
|
* - MemoryContextStrdup
|
20
34
|
* - MemoryContextAlloc
|
21
35
|
* - palloc
|
22
|
-
* - MemoryContextAllocZeroAligned
|
23
|
-
* - MemoryContextAllocZero
|
24
36
|
* - palloc0
|
25
37
|
* - MemoryContextCreate
|
26
38
|
* - MemoryContextInit
|
27
39
|
* - MemoryContextAllowInCriticalSection
|
28
40
|
* - CurrentMemoryContext
|
29
41
|
* - MemoryContextDelete
|
42
|
+
* - MemoryContextAllocZero
|
43
|
+
* - MemoryContextSizeFailure
|
30
44
|
* - palloc0
|
31
45
|
* - MemoryContextAllocExtended
|
32
46
|
*--------------------------------------------------------------------
|
@@ -43,7 +57,7 @@
|
|
43
57
|
* context's MemoryContextMethods struct.
|
44
58
|
*
|
45
59
|
*
|
46
|
-
* Portions Copyright (c) 1996-
|
60
|
+
* Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group
|
47
61
|
* Portions Copyright (c) 1994, Regents of the University of California
|
48
62
|
*
|
49
63
|
*
|
@@ -59,11 +73,116 @@
|
|
59
73
|
#include "miscadmin.h"
|
60
74
|
#include "utils/memdebug.h"
|
61
75
|
#include "utils/memutils.h"
|
76
|
+
#include "utils/memutils_internal.h"
|
77
|
+
#include "utils/memutils_memorychunk.h"
|
62
78
|
|
63
79
|
|
80
|
+
static void BogusFree(void *pointer);
|
81
|
+
static void *BogusRealloc(void *pointer, Size size, int flags);
|
82
|
+
static MemoryContext BogusGetChunkContext(void *pointer);
|
83
|
+
static Size BogusGetChunkSpace(void *pointer);
|
84
|
+
|
64
85
|
/*****************************************************************************
|
65
86
|
* GLOBAL MEMORY *
|
66
87
|
*****************************************************************************/
|
88
|
+
#define BOGUS_MCTX(id) \
|
89
|
+
[id].free_p = BogusFree, \
|
90
|
+
[id].realloc = BogusRealloc, \
|
91
|
+
[id].get_chunk_context = BogusGetChunkContext, \
|
92
|
+
[id].get_chunk_space = BogusGetChunkSpace
|
93
|
+
|
94
|
+
static const MemoryContextMethods mcxt_methods[] = {
|
95
|
+
/* aset.c */
|
96
|
+
[MCTX_ASET_ID].alloc = AllocSetAlloc,
|
97
|
+
[MCTX_ASET_ID].free_p = AllocSetFree,
|
98
|
+
[MCTX_ASET_ID].realloc = AllocSetRealloc,
|
99
|
+
[MCTX_ASET_ID].reset = AllocSetReset,
|
100
|
+
[MCTX_ASET_ID].delete_context = AllocSetDelete,
|
101
|
+
[MCTX_ASET_ID].get_chunk_context = AllocSetGetChunkContext,
|
102
|
+
[MCTX_ASET_ID].get_chunk_space = AllocSetGetChunkSpace,
|
103
|
+
[MCTX_ASET_ID].is_empty = AllocSetIsEmpty,
|
104
|
+
[MCTX_ASET_ID].stats = AllocSetStats,
|
105
|
+
#ifdef MEMORY_CONTEXT_CHECKING
|
106
|
+
[MCTX_ASET_ID].check = AllocSetCheck,
|
107
|
+
#endif
|
108
|
+
|
109
|
+
/* generation.c */
|
110
|
+
[MCTX_GENERATION_ID].alloc = GenerationAlloc,
|
111
|
+
[MCTX_GENERATION_ID].free_p = GenerationFree,
|
112
|
+
[MCTX_GENERATION_ID].realloc = GenerationRealloc,
|
113
|
+
[MCTX_GENERATION_ID].reset = GenerationReset,
|
114
|
+
[MCTX_GENERATION_ID].delete_context = GenerationDelete,
|
115
|
+
[MCTX_GENERATION_ID].get_chunk_context = GenerationGetChunkContext,
|
116
|
+
[MCTX_GENERATION_ID].get_chunk_space = GenerationGetChunkSpace,
|
117
|
+
[MCTX_GENERATION_ID].is_empty = GenerationIsEmpty,
|
118
|
+
[MCTX_GENERATION_ID].stats = GenerationStats,
|
119
|
+
#ifdef MEMORY_CONTEXT_CHECKING
|
120
|
+
[MCTX_GENERATION_ID].check = GenerationCheck,
|
121
|
+
#endif
|
122
|
+
|
123
|
+
/* slab.c */
|
124
|
+
[MCTX_SLAB_ID].alloc = SlabAlloc,
|
125
|
+
[MCTX_SLAB_ID].free_p = SlabFree,
|
126
|
+
[MCTX_SLAB_ID].realloc = SlabRealloc,
|
127
|
+
[MCTX_SLAB_ID].reset = SlabReset,
|
128
|
+
[MCTX_SLAB_ID].delete_context = SlabDelete,
|
129
|
+
[MCTX_SLAB_ID].get_chunk_context = SlabGetChunkContext,
|
130
|
+
[MCTX_SLAB_ID].get_chunk_space = SlabGetChunkSpace,
|
131
|
+
[MCTX_SLAB_ID].is_empty = SlabIsEmpty,
|
132
|
+
[MCTX_SLAB_ID].stats = SlabStats,
|
133
|
+
#ifdef MEMORY_CONTEXT_CHECKING
|
134
|
+
[MCTX_SLAB_ID].check = SlabCheck,
|
135
|
+
#endif
|
136
|
+
|
137
|
+
/* alignedalloc.c */
|
138
|
+
[MCTX_ALIGNED_REDIRECT_ID].alloc = NULL, /* not required */
|
139
|
+
[MCTX_ALIGNED_REDIRECT_ID].free_p = AlignedAllocFree,
|
140
|
+
[MCTX_ALIGNED_REDIRECT_ID].realloc = AlignedAllocRealloc,
|
141
|
+
[MCTX_ALIGNED_REDIRECT_ID].reset = NULL, /* not required */
|
142
|
+
[MCTX_ALIGNED_REDIRECT_ID].delete_context = NULL, /* not required */
|
143
|
+
[MCTX_ALIGNED_REDIRECT_ID].get_chunk_context = AlignedAllocGetChunkContext,
|
144
|
+
[MCTX_ALIGNED_REDIRECT_ID].get_chunk_space = AlignedAllocGetChunkSpace,
|
145
|
+
[MCTX_ALIGNED_REDIRECT_ID].is_empty = NULL, /* not required */
|
146
|
+
[MCTX_ALIGNED_REDIRECT_ID].stats = NULL, /* not required */
|
147
|
+
#ifdef MEMORY_CONTEXT_CHECKING
|
148
|
+
[MCTX_ALIGNED_REDIRECT_ID].check = NULL, /* not required */
|
149
|
+
#endif
|
150
|
+
|
151
|
+
/* bump.c */
|
152
|
+
[MCTX_BUMP_ID].alloc = BumpAlloc,
|
153
|
+
[MCTX_BUMP_ID].free_p = BumpFree,
|
154
|
+
[MCTX_BUMP_ID].realloc = BumpRealloc,
|
155
|
+
[MCTX_BUMP_ID].reset = BumpReset,
|
156
|
+
[MCTX_BUMP_ID].delete_context = BumpDelete,
|
157
|
+
[MCTX_BUMP_ID].get_chunk_context = BumpGetChunkContext,
|
158
|
+
[MCTX_BUMP_ID].get_chunk_space = BumpGetChunkSpace,
|
159
|
+
[MCTX_BUMP_ID].is_empty = BumpIsEmpty,
|
160
|
+
[MCTX_BUMP_ID].stats = BumpStats,
|
161
|
+
#ifdef MEMORY_CONTEXT_CHECKING
|
162
|
+
[MCTX_BUMP_ID].check = BumpCheck,
|
163
|
+
#endif
|
164
|
+
|
165
|
+
|
166
|
+
/*
|
167
|
+
* Reserved and unused IDs should have dummy entries here. This allows us
|
168
|
+
* to fail cleanly if a bogus pointer is passed to pfree or the like. It
|
169
|
+
* seems sufficient to provide routines for the methods that might get
|
170
|
+
* invoked from inspection of a chunk (see MCXT_METHOD calls below).
|
171
|
+
*/
|
172
|
+
BOGUS_MCTX(MCTX_1_RESERVED_GLIBC_ID),
|
173
|
+
BOGUS_MCTX(MCTX_2_RESERVED_GLIBC_ID),
|
174
|
+
BOGUS_MCTX(MCTX_8_UNUSED_ID),
|
175
|
+
BOGUS_MCTX(MCTX_9_UNUSED_ID),
|
176
|
+
BOGUS_MCTX(MCTX_10_UNUSED_ID),
|
177
|
+
BOGUS_MCTX(MCTX_11_UNUSED_ID),
|
178
|
+
BOGUS_MCTX(MCTX_12_UNUSED_ID),
|
179
|
+
BOGUS_MCTX(MCTX_13_UNUSED_ID),
|
180
|
+
BOGUS_MCTX(MCTX_14_UNUSED_ID),
|
181
|
+
BOGUS_MCTX(MCTX_0_RESERVED_UNUSEDMEM_ID),
|
182
|
+
BOGUS_MCTX(MCTX_15_RESERVED_WIPEDMEM_ID)
|
183
|
+
};
|
184
|
+
|
185
|
+
#undef BOGUS_MCTX
|
67
186
|
|
68
187
|
/*
|
69
188
|
* CurrentMemoryContext
|
@@ -89,12 +208,15 @@ __thread MemoryContext ErrorContext = NULL;
|
|
89
208
|
/* This is a transient link to the active portal's memory context: */
|
90
209
|
|
91
210
|
|
211
|
+
static void MemoryContextDeleteOnly(MemoryContext context);
|
92
212
|
static void MemoryContextCallResetCallbacks(MemoryContext context);
|
93
213
|
static void MemoryContextStatsInternal(MemoryContext context, int level,
|
94
|
-
|
95
|
-
MemoryContextCounters *totals
|
214
|
+
int max_level, int max_children,
|
215
|
+
MemoryContextCounters *totals,
|
216
|
+
bool print_to_stderr);
|
96
217
|
static void MemoryContextStatsPrint(MemoryContext context, void *passthru,
|
97
|
-
const char *stats_string
|
218
|
+
const char *stats_string,
|
219
|
+
bool print_to_stderr);
|
98
220
|
|
99
221
|
/*
|
100
222
|
* You should not do memory allocations within a critical section, because
|
@@ -104,6 +226,145 @@ static void MemoryContextStatsPrint(MemoryContext context, void *passthru,
|
|
104
226
|
#define AssertNotInCriticalSection(context) \
|
105
227
|
Assert(CritSectionCount == 0 || (context)->allowInCritSection)
|
106
228
|
|
229
|
+
/*
|
230
|
+
* Call the given function in the MemoryContextMethods for the memory context
|
231
|
+
* type that 'pointer' belongs to.
|
232
|
+
*/
|
233
|
+
#define MCXT_METHOD(pointer, method) \
|
234
|
+
mcxt_methods[GetMemoryChunkMethodID(pointer)].method
|
235
|
+
|
236
|
+
/*
|
237
|
+
* GetMemoryChunkMethodID
|
238
|
+
* Return the MemoryContextMethodID from the uint64 chunk header which
|
239
|
+
* directly precedes 'pointer'.
|
240
|
+
*/
|
241
|
+
static inline MemoryContextMethodID
|
242
|
+
GetMemoryChunkMethodID(const void *pointer)
|
243
|
+
{
|
244
|
+
uint64 header;
|
245
|
+
|
246
|
+
/*
|
247
|
+
* Try to detect bogus pointers handed to us, poorly though we can.
|
248
|
+
* Presumably, a pointer that isn't MAXALIGNED isn't pointing at an
|
249
|
+
* allocated chunk.
|
250
|
+
*/
|
251
|
+
Assert(pointer == (const void *) MAXALIGN(pointer));
|
252
|
+
|
253
|
+
/* Allow access to the uint64 header */
|
254
|
+
VALGRIND_MAKE_MEM_DEFINED((char *) pointer - sizeof(uint64), sizeof(uint64));
|
255
|
+
|
256
|
+
header = *((const uint64 *) ((const char *) pointer - sizeof(uint64)));
|
257
|
+
|
258
|
+
/* Disallow access to the uint64 header */
|
259
|
+
VALGRIND_MAKE_MEM_NOACCESS((char *) pointer - sizeof(uint64), sizeof(uint64));
|
260
|
+
|
261
|
+
return (MemoryContextMethodID) (header & MEMORY_CONTEXT_METHODID_MASK);
|
262
|
+
}
|
263
|
+
|
264
|
+
/*
|
265
|
+
* GetMemoryChunkHeader
|
266
|
+
* Return the uint64 chunk header which directly precedes 'pointer'.
|
267
|
+
*
|
268
|
+
* This is only used after GetMemoryChunkMethodID, so no need for error checks.
|
269
|
+
*/
|
270
|
+
static inline uint64
|
271
|
+
GetMemoryChunkHeader(const void *pointer)
|
272
|
+
{
|
273
|
+
uint64 header;
|
274
|
+
|
275
|
+
/* Allow access to the uint64 header */
|
276
|
+
VALGRIND_MAKE_MEM_DEFINED((char *) pointer - sizeof(uint64), sizeof(uint64));
|
277
|
+
|
278
|
+
header = *((const uint64 *) ((const char *) pointer - sizeof(uint64)));
|
279
|
+
|
280
|
+
/* Disallow access to the uint64 header */
|
281
|
+
VALGRIND_MAKE_MEM_NOACCESS((char *) pointer - sizeof(uint64), sizeof(uint64));
|
282
|
+
|
283
|
+
return header;
|
284
|
+
}
|
285
|
+
|
286
|
+
/*
|
287
|
+
* MemoryContextTraverseNext
|
288
|
+
* Helper function to traverse all descendants of a memory context
|
289
|
+
* without recursion.
|
290
|
+
*
|
291
|
+
* Recursion could lead to out-of-stack errors with deep context hierarchies,
|
292
|
+
* which would be unpleasant in error cleanup code paths.
|
293
|
+
*
|
294
|
+
* To process 'context' and all its descendants, use a loop like this:
|
295
|
+
*
|
296
|
+
* <process 'context'>
|
297
|
+
* for (MemoryContext curr = context->firstchild;
|
298
|
+
* curr != NULL;
|
299
|
+
* curr = MemoryContextTraverseNext(curr, context))
|
300
|
+
* {
|
301
|
+
* <process 'curr'>
|
302
|
+
* }
|
303
|
+
*
|
304
|
+
* This visits all the contexts in pre-order, that is a node is visited
|
305
|
+
* before its children.
|
306
|
+
*/
|
307
|
+
static MemoryContext
|
308
|
+
MemoryContextTraverseNext(MemoryContext curr, MemoryContext top)
|
309
|
+
{
|
310
|
+
/* After processing a node, traverse to its first child if any */
|
311
|
+
if (curr->firstchild != NULL)
|
312
|
+
return curr->firstchild;
|
313
|
+
|
314
|
+
/*
|
315
|
+
* After processing a childless node, traverse to its next sibling if
|
316
|
+
* there is one. If there isn't, traverse back up to the parent (which
|
317
|
+
* has already been visited, and now so have all its descendants). We're
|
318
|
+
* done if that is "top", otherwise traverse to its next sibling if any,
|
319
|
+
* otherwise repeat moving up.
|
320
|
+
*/
|
321
|
+
while (curr->nextchild == NULL)
|
322
|
+
{
|
323
|
+
curr = curr->parent;
|
324
|
+
if (curr == top)
|
325
|
+
return NULL;
|
326
|
+
}
|
327
|
+
return curr->nextchild;
|
328
|
+
}
|
329
|
+
|
330
|
+
/*
|
331
|
+
* Support routines to trap use of invalid memory context method IDs
|
332
|
+
* (from calling pfree or the like on a bogus pointer). As a possible
|
333
|
+
* aid in debugging, we report the header word along with the pointer
|
334
|
+
* address (if we got here, there must be an accessible header word).
|
335
|
+
*/
|
336
|
+
static void
|
337
|
+
BogusFree(void *pointer)
|
338
|
+
{
|
339
|
+
elog(ERROR, "pfree called with invalid pointer %p (header 0x%016llx)",
|
340
|
+
pointer, (unsigned long long) GetMemoryChunkHeader(pointer));
|
341
|
+
}
|
342
|
+
|
343
|
+
static void *
|
344
|
+
BogusRealloc(void *pointer, Size size, int flags)
|
345
|
+
{
|
346
|
+
elog(ERROR, "repalloc called with invalid pointer %p (header 0x%016llx)",
|
347
|
+
pointer, (unsigned long long) GetMemoryChunkHeader(pointer));
|
348
|
+
return NULL; /* keep compiler quiet */
|
349
|
+
}
|
350
|
+
|
351
|
+
static MemoryContext
|
352
|
+
BogusGetChunkContext(void *pointer)
|
353
|
+
{
|
354
|
+
elog(ERROR, "GetMemoryChunkContext called with invalid pointer %p (header 0x%016llx)",
|
355
|
+
pointer, (unsigned long long) GetMemoryChunkHeader(pointer));
|
356
|
+
return NULL; /* keep compiler quiet */
|
357
|
+
}
|
358
|
+
|
359
|
+
static Size
|
360
|
+
BogusGetChunkSpace(void *pointer)
|
361
|
+
{
|
362
|
+
elog(ERROR, "GetMemoryChunkSpace called with invalid pointer %p (header 0x%016llx)",
|
363
|
+
pointer, (unsigned long long) GetMemoryChunkHeader(pointer));
|
364
|
+
return 0; /* keep compiler quiet */
|
365
|
+
}
|
366
|
+
|
367
|
+
|
107
368
|
/*****************************************************************************
|
108
369
|
* EXPORTED ROUTINES *
|
109
370
|
*****************************************************************************/
|
@@ -128,7 +389,7 @@ static void MemoryContextStatsPrint(MemoryContext context, void *passthru,
|
|
128
389
|
void
|
129
390
|
MemoryContextInit(void)
|
130
391
|
{
|
131
|
-
|
392
|
+
Assert(TopMemoryContext == NULL);
|
132
393
|
|
133
394
|
/*
|
134
395
|
* First, initialize TopMemoryContext, which is the parent of all others.
|
@@ -172,7 +433,7 @@ MemoryContextInit(void)
|
|
172
433
|
void
|
173
434
|
MemoryContextReset(MemoryContext context)
|
174
435
|
{
|
175
|
-
|
436
|
+
Assert(MemoryContextIsValid(context));
|
176
437
|
|
177
438
|
/* save a function call in common case where there are no children */
|
178
439
|
if (context->firstchild != NULL)
|
@@ -191,7 +452,7 @@ MemoryContextReset(MemoryContext context)
|
|
191
452
|
void
|
192
453
|
MemoryContextResetOnly(MemoryContext context)
|
193
454
|
{
|
194
|
-
|
455
|
+
Assert(MemoryContextIsValid(context));
|
195
456
|
|
196
457
|
/* Nothing to do if no pallocs since startup or last reset */
|
197
458
|
if (!context->isReset)
|
@@ -202,10 +463,8 @@ MemoryContextResetOnly(MemoryContext context)
|
|
202
463
|
* If context->ident points into the context's memory, it will become
|
203
464
|
* a dangling pointer. We could prevent that by setting it to NULL
|
204
465
|
* here, but that would break valid coding patterns that keep the
|
205
|
-
* ident elsewhere, e.g. in a parent context.
|
206
|
-
*
|
207
|
-
* in separately-palloc'd chunks, so that risks false positives. So
|
208
|
-
* for now we assume the programmer got it right.
|
466
|
+
* ident elsewhere, e.g. in a parent context. So for now we assume
|
467
|
+
* the programmer got it right.
|
209
468
|
*/
|
210
469
|
|
211
470
|
context->methods->reset(context);
|
@@ -229,21 +488,60 @@ MemoryContextResetOnly(MemoryContext context)
|
|
229
488
|
* allocated therein.
|
230
489
|
*
|
231
490
|
* The type-specific delete routine removes all storage for the context,
|
232
|
-
* but we have to
|
233
|
-
* We must also delink the context from its parent, if it has one.
|
491
|
+
* but we have to deal with descendant nodes here.
|
234
492
|
*/
|
235
493
|
void
|
236
494
|
MemoryContextDelete(MemoryContext context)
|
237
495
|
{
|
238
|
-
|
496
|
+
MemoryContext curr;
|
497
|
+
|
498
|
+
Assert(MemoryContextIsValid(context));
|
499
|
+
|
500
|
+
/*
|
501
|
+
* Delete subcontexts from the bottom up.
|
502
|
+
*
|
503
|
+
* Note: Do not use recursion here. A "stack depth limit exceeded" error
|
504
|
+
* would be unpleasant if we're already in the process of cleaning up from
|
505
|
+
* transaction abort. We also cannot use MemoryContextTraverseNext() here
|
506
|
+
* because we modify the tree as we go.
|
507
|
+
*/
|
508
|
+
curr = context;
|
509
|
+
for (;;)
|
510
|
+
{
|
511
|
+
MemoryContext parent;
|
512
|
+
|
513
|
+
/* Descend down until we find a leaf context with no children */
|
514
|
+
while (curr->firstchild != NULL)
|
515
|
+
curr = curr->firstchild;
|
516
|
+
|
517
|
+
/*
|
518
|
+
* We're now at a leaf with no children. Free it and continue from the
|
519
|
+
* parent. Or if this was the original node, we're all done.
|
520
|
+
*/
|
521
|
+
parent = curr->parent;
|
522
|
+
MemoryContextDeleteOnly(curr);
|
523
|
+
|
524
|
+
if (curr == context)
|
525
|
+
break;
|
526
|
+
curr = parent;
|
527
|
+
}
|
528
|
+
}
|
529
|
+
|
530
|
+
/*
|
531
|
+
* Subroutine of MemoryContextDelete,
|
532
|
+
* to delete a context that has no children.
|
533
|
+
* We must also delink the context from its parent, if it has one.
|
534
|
+
*/
|
535
|
+
static void
|
536
|
+
MemoryContextDeleteOnly(MemoryContext context)
|
537
|
+
{
|
538
|
+
Assert(MemoryContextIsValid(context));
|
239
539
|
/* We had better not be deleting TopMemoryContext ... */
|
240
540
|
Assert(context != TopMemoryContext);
|
241
541
|
/* And not CurrentMemoryContext, either */
|
242
542
|
Assert(context != CurrentMemoryContext);
|
243
|
-
|
244
|
-
|
245
|
-
if (context->firstchild != NULL)
|
246
|
-
MemoryContextDeleteChildren(context);
|
543
|
+
/* All the children should've been deleted already */
|
544
|
+
Assert(context->firstchild == NULL);
|
247
545
|
|
248
546
|
/*
|
249
547
|
* It's not entirely clear whether 'tis better to do this before or after
|
@@ -280,7 +578,7 @@ MemoryContextDelete(MemoryContext context)
|
|
280
578
|
void
|
281
579
|
MemoryContextDeleteChildren(MemoryContext context)
|
282
580
|
{
|
283
|
-
|
581
|
+
Assert(MemoryContextIsValid(context));
|
284
582
|
|
285
583
|
/*
|
286
584
|
* MemoryContextDelete will delink the child from me, so just iterate as
|
@@ -362,8 +660,8 @@ MemoryContextCallResetCallbacks(MemoryContext context)
|
|
362
660
|
void
|
363
661
|
MemoryContextSetParent(MemoryContext context, MemoryContext new_parent)
|
364
662
|
{
|
365
|
-
|
366
|
-
|
663
|
+
Assert(MemoryContextIsValid(context));
|
664
|
+
Assert(context != new_parent);
|
367
665
|
|
368
666
|
/* Fast path if it's got correct parent already */
|
369
667
|
if (new_parent == context->parent)
|
@@ -389,7 +687,7 @@ MemoryContextSetParent(MemoryContext context, MemoryContext new_parent)
|
|
389
687
|
/* And relink */
|
390
688
|
if (new_parent)
|
391
689
|
{
|
392
|
-
|
690
|
+
Assert(MemoryContextIsValid(new_parent));
|
393
691
|
context->parent = new_parent;
|
394
692
|
context->prevchild = NULL;
|
395
693
|
context->nextchild = new_parent->firstchild;
|
@@ -419,11 +717,22 @@ MemoryContextSetParent(MemoryContext context, MemoryContext new_parent)
|
|
419
717
|
void
|
420
718
|
MemoryContextAllowInCriticalSection(MemoryContext context, bool allow)
|
421
719
|
{
|
422
|
-
|
720
|
+
Assert(MemoryContextIsValid(context));
|
423
721
|
|
424
722
|
context->allowInCritSection = allow;
|
425
723
|
}
|
426
724
|
|
725
|
+
/*
|
726
|
+
* GetMemoryChunkContext
|
727
|
+
* Given a currently-allocated chunk, determine the MemoryContext that
|
728
|
+
* the chunk belongs to.
|
729
|
+
*/
|
730
|
+
MemoryContext
|
731
|
+
GetMemoryChunkContext(void *pointer)
|
732
|
+
{
|
733
|
+
return MCXT_METHOD(pointer, get_chunk_context) (pointer);
|
734
|
+
}
|
735
|
+
|
427
736
|
/*
|
428
737
|
* GetMemoryChunkSpace
|
429
738
|
* Given a currently-allocated chunk, determine the total space
|
@@ -432,7 +741,11 @@ MemoryContextAllowInCriticalSection(MemoryContext context, bool allow)
|
|
432
741
|
* This is useful for measuring the total space occupied by a set of
|
433
742
|
* allocated chunks.
|
434
743
|
*/
|
435
|
-
|
744
|
+
Size
|
745
|
+
GetMemoryChunkSpace(void *pointer)
|
746
|
+
{
|
747
|
+
return MCXT_METHOD(pointer, get_chunk_space) (pointer);
|
748
|
+
}
|
436
749
|
|
437
750
|
/*
|
438
751
|
* MemoryContextGetParent
|
@@ -452,6 +765,12 @@ MemoryContextAllowInCriticalSection(MemoryContext context, bool allow)
|
|
452
765
|
*/
|
453
766
|
|
454
767
|
|
768
|
+
/*
|
769
|
+
* Return the memory consumption statistics about the given context and its
|
770
|
+
* children.
|
771
|
+
*/
|
772
|
+
|
773
|
+
|
455
774
|
/*
|
456
775
|
* MemoryContextStats
|
457
776
|
* Print statistics about the named context and all its descendants.
|
@@ -463,93 +782,144 @@ MemoryContextAllowInCriticalSection(MemoryContext context, bool allow)
|
|
463
782
|
void
|
464
783
|
MemoryContextStats(MemoryContext context)
|
465
784
|
{
|
466
|
-
/*
|
467
|
-
MemoryContextStatsDetail(context, 100);
|
785
|
+
/* Hard-wired limits are usually good enough */
|
786
|
+
MemoryContextStatsDetail(context, 100, 100, true);
|
468
787
|
}
|
469
788
|
|
470
789
|
/*
|
471
790
|
* MemoryContextStatsDetail
|
472
791
|
*
|
473
792
|
* Entry point for use if you want to vary the number of child contexts shown.
|
793
|
+
*
|
794
|
+
* If print_to_stderr is true, print statistics about the memory contexts
|
795
|
+
* with fprintf(stderr), otherwise use ereport().
|
474
796
|
*/
|
475
797
|
void
|
476
|
-
MemoryContextStatsDetail(MemoryContext context,
|
798
|
+
MemoryContextStatsDetail(MemoryContext context,
|
799
|
+
int max_level, int max_children,
|
800
|
+
bool print_to_stderr)
|
477
801
|
{
|
478
802
|
MemoryContextCounters grand_totals;
|
479
803
|
|
480
804
|
memset(&grand_totals, 0, sizeof(grand_totals));
|
481
805
|
|
482
|
-
MemoryContextStatsInternal(context, 0,
|
806
|
+
MemoryContextStatsInternal(context, 0, max_level, max_children,
|
807
|
+
&grand_totals, print_to_stderr);
|
483
808
|
|
484
|
-
|
485
|
-
|
486
|
-
|
487
|
-
|
488
|
-
|
809
|
+
if (print_to_stderr)
|
810
|
+
fprintf(stderr,
|
811
|
+
"Grand total: %zu bytes in %zu blocks; %zu free (%zu chunks); %zu used\n",
|
812
|
+
grand_totals.totalspace, grand_totals.nblocks,
|
813
|
+
grand_totals.freespace, grand_totals.freechunks,
|
814
|
+
grand_totals.totalspace - grand_totals.freespace);
|
815
|
+
else
|
816
|
+
{
|
817
|
+
/*
|
818
|
+
* Use LOG_SERVER_ONLY to prevent the memory contexts from being sent
|
819
|
+
* to the connected client.
|
820
|
+
*
|
821
|
+
* We don't buffer the information about all memory contexts in a
|
822
|
+
* backend into StringInfo and log it as one message. That would
|
823
|
+
* require the buffer to be enlarged, risking an OOM as there could be
|
824
|
+
* a large number of memory contexts in a backend. Instead, we log
|
825
|
+
* one message per memory context.
|
826
|
+
*/
|
827
|
+
ereport(LOG_SERVER_ONLY,
|
828
|
+
(errhidestmt(true),
|
829
|
+
errhidecontext(true),
|
830
|
+
errmsg_internal("Grand total: %zu bytes in %zu blocks; %zu free (%zu chunks); %zu used",
|
831
|
+
grand_totals.totalspace, grand_totals.nblocks,
|
832
|
+
grand_totals.freespace, grand_totals.freechunks,
|
833
|
+
grand_totals.totalspace - grand_totals.freespace)));
|
834
|
+
}
|
489
835
|
}
|
490
836
|
|
491
837
|
/*
|
492
838
|
* MemoryContextStatsInternal
|
493
839
|
* One recursion level for MemoryContextStats
|
494
840
|
*
|
495
|
-
* Print this context if
|
496
|
-
* *totals (if
|
841
|
+
* Print stats for this context if possible, but in any case accumulate counts
|
842
|
+
* into *totals (if not NULL).
|
497
843
|
*/
|
498
844
|
static void
|
499
845
|
MemoryContextStatsInternal(MemoryContext context, int level,
|
500
|
-
|
501
|
-
MemoryContextCounters *totals
|
846
|
+
int max_level, int max_children,
|
847
|
+
MemoryContextCounters *totals,
|
848
|
+
bool print_to_stderr)
|
502
849
|
{
|
503
|
-
MemoryContextCounters local_totals;
|
504
850
|
MemoryContext child;
|
505
851
|
int ichild;
|
506
852
|
|
507
|
-
|
853
|
+
Assert(MemoryContextIsValid(context));
|
508
854
|
|
509
855
|
/* Examine the context itself */
|
510
856
|
context->methods->stats(context,
|
511
|
-
|
857
|
+
MemoryContextStatsPrint,
|
512
858
|
(void *) &level,
|
513
|
-
totals);
|
859
|
+
totals, print_to_stderr);
|
514
860
|
|
515
861
|
/*
|
516
|
-
* Examine children.
|
517
|
-
*
|
862
|
+
* Examine children.
|
863
|
+
*
|
864
|
+
* If we are past the recursion depth limit or already running low on
|
865
|
+
* stack, do not print them explicitly but just summarize them. Similarly,
|
866
|
+
* if there are more than max_children of them, we do not print the rest
|
867
|
+
* explicitly, but just summarize them.
|
518
868
|
*/
|
519
|
-
|
520
|
-
|
521
|
-
|
522
|
-
child != NULL;
|
523
|
-
child = child->nextchild, ichild++)
|
869
|
+
child = context->firstchild;
|
870
|
+
ichild = 0;
|
871
|
+
if (level < max_level && !stack_is_too_deep())
|
524
872
|
{
|
525
|
-
|
526
|
-
|
527
|
-
|
528
|
-
totals);
|
529
|
-
else
|
873
|
+
for (; child != NULL && ichild < max_children;
|
874
|
+
child = child->nextchild, ichild++)
|
875
|
+
{
|
530
876
|
MemoryContextStatsInternal(child, level + 1,
|
531
|
-
|
532
|
-
|
877
|
+
max_level, max_children,
|
878
|
+
totals,
|
879
|
+
print_to_stderr);
|
880
|
+
}
|
533
881
|
}
|
534
882
|
|
535
|
-
|
536
|
-
if (ichild > max_children)
|
883
|
+
if (child != NULL)
|
537
884
|
{
|
538
|
-
|
885
|
+
/* Summarize the rest of the children, avoiding recursion. */
|
886
|
+
MemoryContextCounters local_totals;
|
887
|
+
|
888
|
+
memset(&local_totals, 0, sizeof(local_totals));
|
889
|
+
|
890
|
+
ichild = 0;
|
891
|
+
while (child != NULL)
|
539
892
|
{
|
540
|
-
|
893
|
+
child->methods->stats(child, NULL, NULL, &local_totals, false);
|
894
|
+
ichild++;
|
895
|
+
child = MemoryContextTraverseNext(child, context);
|
896
|
+
}
|
541
897
|
|
542
|
-
|
898
|
+
if (print_to_stderr)
|
899
|
+
{
|
900
|
+
for (int i = 0; i <= level; i++)
|
543
901
|
fprintf(stderr, " ");
|
544
902
|
fprintf(stderr,
|
545
|
-
"%d more child contexts containing %zu total in %
|
546
|
-
ichild
|
903
|
+
"%d more child contexts containing %zu total in %zu blocks; %zu free (%zu chunks); %zu used\n",
|
904
|
+
ichild,
|
547
905
|
local_totals.totalspace,
|
548
906
|
local_totals.nblocks,
|
549
907
|
local_totals.freespace,
|
550
908
|
local_totals.freechunks,
|
551
909
|
local_totals.totalspace - local_totals.freespace);
|
552
910
|
}
|
911
|
+
else
|
912
|
+
ereport(LOG_SERVER_ONLY,
|
913
|
+
(errhidestmt(true),
|
914
|
+
errhidecontext(true),
|
915
|
+
errmsg_internal("level: %d; %d more child contexts containing %zu total in %zu blocks; %zu free (%zu chunks); %zu used",
|
916
|
+
level,
|
917
|
+
ichild,
|
918
|
+
local_totals.totalspace,
|
919
|
+
local_totals.nblocks,
|
920
|
+
local_totals.freespace,
|
921
|
+
local_totals.freechunks,
|
922
|
+
local_totals.totalspace - local_totals.freespace)));
|
553
923
|
|
554
924
|
if (totals)
|
555
925
|
{
|
@@ -570,11 +940,13 @@ MemoryContextStatsInternal(MemoryContext context, int level,
|
|
570
940
|
*/
|
571
941
|
static void
|
572
942
|
MemoryContextStatsPrint(MemoryContext context, void *passthru,
|
573
|
-
const char *stats_string
|
943
|
+
const char *stats_string,
|
944
|
+
bool print_to_stderr)
|
574
945
|
{
|
575
946
|
int level = *(int *) passthru;
|
576
947
|
const char *name = context->name;
|
577
948
|
const char *ident = context->ident;
|
949
|
+
char truncated_ident[110];
|
578
950
|
int i;
|
579
951
|
|
580
952
|
/*
|
@@ -588,9 +960,8 @@ MemoryContextStatsPrint(MemoryContext context, void *passthru,
|
|
588
960
|
ident = NULL;
|
589
961
|
}
|
590
962
|
|
591
|
-
|
592
|
-
|
593
|
-
fprintf(stderr, "%s: %s", name, stats_string);
|
963
|
+
truncated_ident[0] = '\0';
|
964
|
+
|
594
965
|
if (ident)
|
595
966
|
{
|
596
967
|
/*
|
@@ -602,29 +973,46 @@ MemoryContextStatsPrint(MemoryContext context, void *passthru,
|
|
602
973
|
int idlen = strlen(ident);
|
603
974
|
bool truncated = false;
|
604
975
|
|
976
|
+
strcpy(truncated_ident, ": ");
|
977
|
+
i = strlen(truncated_ident);
|
978
|
+
|
605
979
|
if (idlen > 100)
|
606
980
|
{
|
607
981
|
idlen = pg_mbcliplen(ident, idlen, 100);
|
608
982
|
truncated = true;
|
609
983
|
}
|
610
|
-
|
984
|
+
|
611
985
|
while (idlen-- > 0)
|
612
986
|
{
|
613
987
|
unsigned char c = *ident++;
|
614
988
|
|
615
989
|
if (c < ' ')
|
616
990
|
c = ' ';
|
617
|
-
|
991
|
+
truncated_ident[i++] = c;
|
618
992
|
}
|
993
|
+
truncated_ident[i] = '\0';
|
994
|
+
|
619
995
|
if (truncated)
|
620
|
-
|
996
|
+
strcat(truncated_ident, "...");
|
997
|
+
}
|
998
|
+
|
999
|
+
if (print_to_stderr)
|
1000
|
+
{
|
1001
|
+
for (i = 0; i < level; i++)
|
1002
|
+
fprintf(stderr, " ");
|
1003
|
+
fprintf(stderr, "%s: %s%s\n", name, stats_string, truncated_ident);
|
621
1004
|
}
|
622
|
-
|
1005
|
+
else
|
1006
|
+
ereport(LOG_SERVER_ONLY,
|
1007
|
+
(errhidestmt(true),
|
1008
|
+
errhidecontext(true),
|
1009
|
+
errmsg_internal("level: %d; %s: %s%s",
|
1010
|
+
level, name, stats_string, truncated_ident)));
|
623
1011
|
}
|
624
1012
|
|
625
1013
|
/*
|
626
1014
|
* MemoryContextCheck
|
627
|
-
* Check all chunks in the named context.
|
1015
|
+
* Check all chunks in the named context and its children.
|
628
1016
|
*
|
629
1017
|
* This is just a debugging utility, so it's not fancy.
|
630
1018
|
*/
|
@@ -632,19 +1020,6 @@ MemoryContextStatsPrint(MemoryContext context, void *passthru,
|
|
632
1020
|
|
633
1021
|
#endif
|
634
1022
|
|
635
|
-
/*
|
636
|
-
* MemoryContextContains
|
637
|
-
* Detect whether an allocated chunk of memory belongs to a given
|
638
|
-
* context or not.
|
639
|
-
*
|
640
|
-
* Caution: this test is reliable as long as 'pointer' does point to
|
641
|
-
* a chunk of memory allocated from *some* context. If 'pointer' points
|
642
|
-
* at memory obtained in some other way, there is a small chance of a
|
643
|
-
* false-positive result, since the bits right before it might look like
|
644
|
-
* a valid chunk header by chance.
|
645
|
-
*/
|
646
|
-
|
647
|
-
|
648
1023
|
/*
|
649
1024
|
* MemoryContextCreate
|
650
1025
|
* Context-type-independent part of context creation.
|
@@ -670,7 +1045,7 @@ MemoryContextStatsPrint(MemoryContext context, void *passthru,
|
|
670
1045
|
*
|
671
1046
|
* node: the as-yet-uninitialized common part of the context header node.
|
672
1047
|
* tag: NodeTag code identifying the memory context type.
|
673
|
-
*
|
1048
|
+
* method_id: MemoryContextMethodID of the context-type being created.
|
674
1049
|
* parent: parent context, or NULL if this will be a top-level context.
|
675
1050
|
* name: name of context (must be statically allocated).
|
676
1051
|
*
|
@@ -680,7 +1055,7 @@ MemoryContextStatsPrint(MemoryContext context, void *passthru,
|
|
680
1055
|
void
|
681
1056
|
MemoryContextCreate(MemoryContext node,
|
682
1057
|
NodeTag tag,
|
683
|
-
|
1058
|
+
MemoryContextMethodID method_id,
|
684
1059
|
MemoryContext parent,
|
685
1060
|
const char *name)
|
686
1061
|
{
|
@@ -690,7 +1065,7 @@ MemoryContextCreate(MemoryContext node,
|
|
690
1065
|
/* Initialize all standard fields of memory context header */
|
691
1066
|
node->type = tag;
|
692
1067
|
node->isReset = true;
|
693
|
-
node->methods =
|
1068
|
+
node->methods = &mcxt_methods[method_id];
|
694
1069
|
node->parent = parent;
|
695
1070
|
node->firstchild = NULL;
|
696
1071
|
node->mem_allocated = 0;
|
@@ -719,120 +1094,93 @@ MemoryContextCreate(MemoryContext node,
|
|
719
1094
|
}
|
720
1095
|
|
721
1096
|
/*
|
722
|
-
*
|
723
|
-
*
|
724
|
-
*
|
725
|
-
*
|
726
|
-
* nodes/memnodes.h into postgres.h which seems a bad idea.
|
1097
|
+
* MemoryContextAllocationFailure
|
1098
|
+
* For use by MemoryContextMethods implementations to handle when malloc
|
1099
|
+
* returns NULL. The behavior is specific to whether MCXT_ALLOC_NO_OOM
|
1100
|
+
* is in 'flags'.
|
727
1101
|
*/
|
728
1102
|
void *
|
729
|
-
|
1103
|
+
MemoryContextAllocationFailure(MemoryContext context, Size size, int flags)
|
730
1104
|
{
|
731
|
-
|
732
|
-
|
733
|
-
AssertArg(MemoryContextIsValid(context));
|
734
|
-
AssertNotInCriticalSection(context);
|
735
|
-
|
736
|
-
if (!AllocSizeIsValid(size))
|
737
|
-
elog(ERROR, "invalid memory alloc request size %zu", size);
|
738
|
-
|
739
|
-
context->isReset = false;
|
740
|
-
|
741
|
-
ret = context->methods->alloc(context, size);
|
742
|
-
if (unlikely(ret == NULL))
|
1105
|
+
if ((flags & MCXT_ALLOC_NO_OOM) == 0)
|
743
1106
|
{
|
744
1107
|
MemoryContextStats(TopMemoryContext);
|
745
|
-
|
746
|
-
/*
|
747
|
-
* Here, and elsewhere in this module, we show the target context's
|
748
|
-
* "name" but not its "ident" (if any) in user-visible error messages.
|
749
|
-
* The "ident" string might contain security-sensitive data, such as
|
750
|
-
* values in SQL commands.
|
751
|
-
*/
|
752
1108
|
ereport(ERROR,
|
753
1109
|
(errcode(ERRCODE_OUT_OF_MEMORY),
|
754
1110
|
errmsg("out of memory"),
|
755
1111
|
errdetail("Failed on request of size %zu in memory context \"%s\".",
|
756
1112
|
size, context->name)));
|
757
1113
|
}
|
1114
|
+
return NULL;
|
1115
|
+
}
|
758
1116
|
|
759
|
-
|
760
|
-
|
761
|
-
|
1117
|
+
/*
|
1118
|
+
* MemoryContextSizeFailure
|
1119
|
+
* For use by MemoryContextMethods implementations to handle invalid
|
1120
|
+
* memory allocation request sizes.
|
1121
|
+
*/
|
1122
|
+
void
|
1123
|
+
MemoryContextSizeFailure(MemoryContext context, Size size, int flags)
|
1124
|
+
{
|
1125
|
+
elog(ERROR, "invalid memory alloc request size %zu", size);
|
762
1126
|
}
|
763
1127
|
|
764
1128
|
/*
|
765
|
-
*
|
766
|
-
*
|
1129
|
+
* MemoryContextAlloc
|
1130
|
+
* Allocate space within the specified context.
|
767
1131
|
*
|
768
|
-
*
|
769
|
-
*
|
1132
|
+
* This could be turned into a macro, but we'd have to import
|
1133
|
+
* nodes/memnodes.h into postgres.h which seems a bad idea.
|
770
1134
|
*/
|
771
1135
|
void *
|
772
|
-
|
1136
|
+
MemoryContextAlloc(MemoryContext context, Size size)
|
773
1137
|
{
|
774
1138
|
void *ret;
|
775
1139
|
|
776
|
-
|
1140
|
+
Assert(MemoryContextIsValid(context));
|
777
1141
|
AssertNotInCriticalSection(context);
|
778
1142
|
|
779
|
-
if (!AllocSizeIsValid(size))
|
780
|
-
elog(ERROR, "invalid memory alloc request size %zu", size);
|
781
|
-
|
782
1143
|
context->isReset = false;
|
783
1144
|
|
784
|
-
|
785
|
-
|
786
|
-
|
787
|
-
|
788
|
-
|
789
|
-
|
790
|
-
|
791
|
-
|
792
|
-
|
793
|
-
|
1145
|
+
/*
|
1146
|
+
* For efficiency reasons, we purposefully offload the handling of
|
1147
|
+
* allocation failures to the MemoryContextMethods implementation as this
|
1148
|
+
* allows these checks to be performed only when an actual malloc needs to
|
1149
|
+
* be done to request more memory from the OS. Additionally, not having
|
1150
|
+
* to execute any instructions after this call allows the compiler to use
|
1151
|
+
* the sibling call optimization. If you're considering adding code after
|
1152
|
+
* this call, consider making it the responsibility of the 'alloc'
|
1153
|
+
* function instead.
|
1154
|
+
*/
|
1155
|
+
ret = context->methods->alloc(context, size, 0);
|
794
1156
|
|
795
1157
|
VALGRIND_MEMPOOL_ALLOC(context, ret, size);
|
796
1158
|
|
797
|
-
MemSetAligned(ret, 0, size);
|
798
|
-
|
799
1159
|
return ret;
|
800
1160
|
}
|
801
1161
|
|
802
1162
|
/*
|
803
|
-
*
|
804
|
-
*
|
1163
|
+
* MemoryContextAllocZero
|
1164
|
+
* Like MemoryContextAlloc, but clears allocated memory
|
805
1165
|
*
|
806
|
-
*
|
807
|
-
* is so
|
1166
|
+
* We could just call MemoryContextAlloc then clear the memory, but this
|
1167
|
+
* is a very common combination, so we provide the combined operation.
|
808
1168
|
*/
|
809
1169
|
void *
|
810
|
-
|
1170
|
+
MemoryContextAllocZero(MemoryContext context, Size size)
|
811
1171
|
{
|
812
1172
|
void *ret;
|
813
1173
|
|
814
|
-
|
1174
|
+
Assert(MemoryContextIsValid(context));
|
815
1175
|
AssertNotInCriticalSection(context);
|
816
1176
|
|
817
|
-
if (!AllocSizeIsValid(size))
|
818
|
-
elog(ERROR, "invalid memory alloc request size %zu", size);
|
819
|
-
|
820
1177
|
context->isReset = false;
|
821
1178
|
|
822
|
-
ret = context->methods->alloc(context, size);
|
823
|
-
if (unlikely(ret == NULL))
|
824
|
-
{
|
825
|
-
MemoryContextStats(TopMemoryContext);
|
826
|
-
ereport(ERROR,
|
827
|
-
(errcode(ERRCODE_OUT_OF_MEMORY),
|
828
|
-
errmsg("out of memory"),
|
829
|
-
errdetail("Failed on request of size %zu in memory context \"%s\".",
|
830
|
-
size, context->name)));
|
831
|
-
}
|
1179
|
+
ret = context->methods->alloc(context, size, 0);
|
832
1180
|
|
833
1181
|
VALGRIND_MEMPOOL_ALLOC(context, ret, size);
|
834
1182
|
|
835
|
-
|
1183
|
+
MemSetAligned(ret, 0, size);
|
836
1184
|
|
837
1185
|
return ret;
|
838
1186
|
}
|
@@ -846,29 +1194,18 @@ MemoryContextAllocExtended(MemoryContext context, Size size, int flags)
|
|
846
1194
|
{
|
847
1195
|
void *ret;
|
848
1196
|
|
849
|
-
|
1197
|
+
Assert(MemoryContextIsValid(context));
|
850
1198
|
AssertNotInCriticalSection(context);
|
851
1199
|
|
852
|
-
if (((flags & MCXT_ALLOC_HUGE) != 0
|
853
|
-
|
1200
|
+
if (!((flags & MCXT_ALLOC_HUGE) != 0 ? AllocHugeSizeIsValid(size) :
|
1201
|
+
AllocSizeIsValid(size)))
|
854
1202
|
elog(ERROR, "invalid memory alloc request size %zu", size);
|
855
1203
|
|
856
1204
|
context->isReset = false;
|
857
1205
|
|
858
|
-
ret = context->methods->alloc(context, size);
|
1206
|
+
ret = context->methods->alloc(context, size, flags);
|
859
1207
|
if (unlikely(ret == NULL))
|
860
|
-
{
|
861
|
-
if ((flags & MCXT_ALLOC_NO_OOM) == 0)
|
862
|
-
{
|
863
|
-
MemoryContextStats(TopMemoryContext);
|
864
|
-
ereport(ERROR,
|
865
|
-
(errcode(ERRCODE_OUT_OF_MEMORY),
|
866
|
-
errmsg("out of memory"),
|
867
|
-
errdetail("Failed on request of size %zu in memory context \"%s\".",
|
868
|
-
size, context->name)));
|
869
|
-
}
|
870
1208
|
return NULL;
|
871
|
-
}
|
872
1209
|
|
873
1210
|
VALGRIND_MEMPOOL_ALLOC(context, ret, size);
|
874
1211
|
|
@@ -878,6 +1215,27 @@ MemoryContextAllocExtended(MemoryContext context, Size size, int flags)
|
|
878
1215
|
return ret;
|
879
1216
|
}
|
880
1217
|
|
1218
|
+
/*
|
1219
|
+
* HandleLogMemoryContextInterrupt
|
1220
|
+
* Handle receipt of an interrupt indicating logging of memory
|
1221
|
+
* contexts.
|
1222
|
+
*
|
1223
|
+
* All the actual work is deferred to ProcessLogMemoryContextInterrupt(),
|
1224
|
+
* because we cannot safely emit a log message inside the signal handler.
|
1225
|
+
*/
|
1226
|
+
|
1227
|
+
|
1228
|
+
/*
|
1229
|
+
* ProcessLogMemoryContextInterrupt
|
1230
|
+
* Perform logging of memory contexts of this backend process.
|
1231
|
+
*
|
1232
|
+
* Any backend that participates in ProcSignal signaling must arrange
|
1233
|
+
* to call this function if we see LogMemoryContextPending set.
|
1234
|
+
* It is called from CHECK_FOR_INTERRUPTS(), which is enough because
|
1235
|
+
* the target process for logging of memory contexts is a backend.
|
1236
|
+
*/
|
1237
|
+
|
1238
|
+
|
881
1239
|
void *
|
882
1240
|
palloc(Size size)
|
883
1241
|
{
|
@@ -885,25 +1243,24 @@ palloc(Size size)
|
|
885
1243
|
void *ret;
|
886
1244
|
MemoryContext context = CurrentMemoryContext;
|
887
1245
|
|
888
|
-
|
1246
|
+
Assert(MemoryContextIsValid(context));
|
889
1247
|
AssertNotInCriticalSection(context);
|
890
1248
|
|
891
|
-
if (!AllocSizeIsValid(size))
|
892
|
-
elog(ERROR, "invalid memory alloc request size %zu", size);
|
893
|
-
|
894
1249
|
context->isReset = false;
|
895
1250
|
|
896
|
-
|
897
|
-
|
898
|
-
|
899
|
-
|
900
|
-
|
901
|
-
|
902
|
-
|
903
|
-
|
904
|
-
|
905
|
-
|
906
|
-
|
1251
|
+
/*
|
1252
|
+
* For efficiency reasons, we purposefully offload the handling of
|
1253
|
+
* allocation failures to the MemoryContextMethods implementation as this
|
1254
|
+
* allows these checks to be performed only when an actual malloc needs to
|
1255
|
+
* be done to request more memory from the OS. Additionally, not having
|
1256
|
+
* to execute any instructions after this call allows the compiler to use
|
1257
|
+
* the sibling call optimization. If you're considering adding code after
|
1258
|
+
* this call, consider making it the responsibility of the 'alloc'
|
1259
|
+
* function instead.
|
1260
|
+
*/
|
1261
|
+
ret = context->methods->alloc(context, size, 0);
|
1262
|
+
/* We expect OOM to be handled by the alloc function */
|
1263
|
+
Assert(ret != NULL);
|
907
1264
|
VALGRIND_MEMPOOL_ALLOC(context, ret, size);
|
908
1265
|
|
909
1266
|
return ret;
|
@@ -916,24 +1273,12 @@ palloc0(Size size)
|
|
916
1273
|
void *ret;
|
917
1274
|
MemoryContext context = CurrentMemoryContext;
|
918
1275
|
|
919
|
-
|
1276
|
+
Assert(MemoryContextIsValid(context));
|
920
1277
|
AssertNotInCriticalSection(context);
|
921
1278
|
|
922
|
-
if (!AllocSizeIsValid(size))
|
923
|
-
elog(ERROR, "invalid memory alloc request size %zu", size);
|
924
|
-
|
925
1279
|
context->isReset = false;
|
926
1280
|
|
927
|
-
ret = context->methods->alloc(context, size);
|
928
|
-
if (unlikely(ret == NULL))
|
929
|
-
{
|
930
|
-
MemoryContextStats(TopMemoryContext);
|
931
|
-
ereport(ERROR,
|
932
|
-
(errcode(ERRCODE_OUT_OF_MEMORY),
|
933
|
-
errmsg("out of memory"),
|
934
|
-
errdetail("Failed on request of size %zu in memory context \"%s\".",
|
935
|
-
size, context->name)));
|
936
|
-
}
|
1281
|
+
ret = context->methods->alloc(context, size, 0);
|
937
1282
|
|
938
1283
|
VALGRIND_MEMPOOL_ALLOC(context, ret, size);
|
939
1284
|
|
@@ -944,6 +1289,125 @@ palloc0(Size size)
|
|
944
1289
|
|
945
1290
|
|
946
1291
|
|
1292
|
+
/*
|
1293
|
+
* MemoryContextAllocAligned
|
1294
|
+
* Allocate 'size' bytes of memory in 'context' aligned to 'alignto'
|
1295
|
+
* bytes.
|
1296
|
+
*
|
1297
|
+
* Currently, we align addresses by requesting additional bytes from the
|
1298
|
+
* MemoryContext's standard allocator function and then aligning the returned
|
1299
|
+
* address by the required alignment. This means that the given MemoryContext
|
1300
|
+
* must support providing us with a chunk of memory that's larger than 'size'.
|
1301
|
+
* For allocators such as Slab, that's not going to work, as slab only allows
|
1302
|
+
* chunks of the size that's specified when the context is created.
|
1303
|
+
*
|
1304
|
+
* 'alignto' must be a power of 2.
|
1305
|
+
* 'flags' may be 0 or set the same as MemoryContextAllocExtended().
|
1306
|
+
*/
|
1307
|
+
void *
|
1308
|
+
MemoryContextAllocAligned(MemoryContext context,
|
1309
|
+
Size size, Size alignto, int flags)
|
1310
|
+
{
|
1311
|
+
MemoryChunk *alignedchunk;
|
1312
|
+
Size alloc_size;
|
1313
|
+
void *unaligned;
|
1314
|
+
void *aligned;
|
1315
|
+
|
1316
|
+
/* wouldn't make much sense to waste that much space */
|
1317
|
+
Assert(alignto < (128 * 1024 * 1024));
|
1318
|
+
|
1319
|
+
/* ensure alignto is a power of 2 */
|
1320
|
+
Assert((alignto & (alignto - 1)) == 0);
|
1321
|
+
|
1322
|
+
/*
|
1323
|
+
* If the alignment requirements are less than what we already guarantee
|
1324
|
+
* then just use the standard allocation function.
|
1325
|
+
*/
|
1326
|
+
if (unlikely(alignto <= MAXIMUM_ALIGNOF))
|
1327
|
+
return MemoryContextAllocExtended(context, size, flags);
|
1328
|
+
|
1329
|
+
/*
|
1330
|
+
* We implement aligned pointers by simply allocating enough memory for
|
1331
|
+
* the requested size plus the alignment and an additional "redirection"
|
1332
|
+
* MemoryChunk. This additional MemoryChunk is required for operations
|
1333
|
+
* such as pfree when used on the pointer returned by this function. We
|
1334
|
+
* use this redirection MemoryChunk in order to find the pointer to the
|
1335
|
+
* memory that was returned by the MemoryContextAllocExtended call below.
|
1336
|
+
* We do that by "borrowing" the block offset field and instead of using
|
1337
|
+
* that to find the offset into the owning block, we use it to find the
|
1338
|
+
* original allocated address.
|
1339
|
+
*
|
1340
|
+
* Here we must allocate enough extra memory so that we can still align
|
1341
|
+
* the pointer returned by MemoryContextAllocExtended and also have enough
|
1342
|
+
* space for the redirection MemoryChunk. Since allocations will already
|
1343
|
+
* be at least aligned by MAXIMUM_ALIGNOF, we can subtract that amount
|
1344
|
+
* from the allocation size to save a little memory.
|
1345
|
+
*/
|
1346
|
+
alloc_size = size + PallocAlignedExtraBytes(alignto);
|
1347
|
+
|
1348
|
+
#ifdef MEMORY_CONTEXT_CHECKING
|
1349
|
+
/* ensure there's space for a sentinel byte */
|
1350
|
+
alloc_size += 1;
|
1351
|
+
#endif
|
1352
|
+
|
1353
|
+
/* perform the actual allocation */
|
1354
|
+
unaligned = MemoryContextAllocExtended(context, alloc_size, flags);
|
1355
|
+
|
1356
|
+
/* set the aligned pointer */
|
1357
|
+
aligned = (void *) TYPEALIGN(alignto, (char *) unaligned +
|
1358
|
+
sizeof(MemoryChunk));
|
1359
|
+
|
1360
|
+
alignedchunk = PointerGetMemoryChunk(aligned);
|
1361
|
+
|
1362
|
+
/*
|
1363
|
+
* We set the redirect MemoryChunk so that the block offset calculation is
|
1364
|
+
* used to point back to the 'unaligned' allocated chunk. This allows us
|
1365
|
+
* to use MemoryChunkGetBlock() to find the unaligned chunk when we need
|
1366
|
+
* to perform operations such as pfree() and repalloc().
|
1367
|
+
*
|
1368
|
+
* We store 'alignto' in the MemoryChunk's 'value' so that we know what
|
1369
|
+
* the alignment was set to should we ever be asked to realloc this
|
1370
|
+
* pointer.
|
1371
|
+
*/
|
1372
|
+
MemoryChunkSetHdrMask(alignedchunk, unaligned, alignto,
|
1373
|
+
MCTX_ALIGNED_REDIRECT_ID);
|
1374
|
+
|
1375
|
+
/* double check we produced a correctly aligned pointer */
|
1376
|
+
Assert((void *) TYPEALIGN(alignto, aligned) == aligned);
|
1377
|
+
|
1378
|
+
#ifdef MEMORY_CONTEXT_CHECKING
|
1379
|
+
alignedchunk->requested_size = size;
|
1380
|
+
/* set mark to catch clobber of "unused" space */
|
1381
|
+
set_sentinel(aligned, size);
|
1382
|
+
#endif
|
1383
|
+
|
1384
|
+
/* Mark the bytes before the redirection header as noaccess */
|
1385
|
+
VALGRIND_MAKE_MEM_NOACCESS(unaligned,
|
1386
|
+
(char *) alignedchunk - (char *) unaligned);
|
1387
|
+
|
1388
|
+
/* Disallow access to the redirection chunk header. */
|
1389
|
+
VALGRIND_MAKE_MEM_NOACCESS(alignedchunk, sizeof(MemoryChunk));
|
1390
|
+
|
1391
|
+
return aligned;
|
1392
|
+
}
|
1393
|
+
|
1394
|
+
/*
|
1395
|
+
* palloc_aligned
|
1396
|
+
* Allocate 'size' bytes returning a pointer that's aligned to the
|
1397
|
+
* 'alignto' boundary.
|
1398
|
+
*
|
1399
|
+
* Currently, we align addresses by requesting additional bytes from the
|
1400
|
+
* MemoryContext's standard allocator function and then aligning the returned
|
1401
|
+
* address by the required alignment. This means that the given MemoryContext
|
1402
|
+
* must support providing us with a chunk of memory that's larger than 'size'.
|
1403
|
+
* For allocators such as Slab, that's not going to work, as slab only allows
|
1404
|
+
* chunks of the size that's specified when the context is created.
|
1405
|
+
*
|
1406
|
+
* 'alignto' must be a power of 2.
|
1407
|
+
* 'flags' may be 0 or set the same as MemoryContextAllocExtended().
|
1408
|
+
*/
|
1409
|
+
|
1410
|
+
|
947
1411
|
/*
|
948
1412
|
* pfree
|
949
1413
|
* Release an allocated chunk.
|
@@ -951,10 +1415,17 @@ palloc0(Size size)
|
|
951
1415
|
void
|
952
1416
|
pfree(void *pointer)
|
953
1417
|
{
|
1418
|
+
#ifdef USE_VALGRIND
|
1419
|
+
MemoryContextMethodID method = GetMemoryChunkMethodID(pointer);
|
954
1420
|
MemoryContext context = GetMemoryChunkContext(pointer);
|
1421
|
+
#endif
|
955
1422
|
|
956
|
-
|
957
|
-
|
1423
|
+
MCXT_METHOD(pointer, free_p) (pointer);
|
1424
|
+
|
1425
|
+
#ifdef USE_VALGRIND
|
1426
|
+
if (method != MCTX_ALIGNED_REDIRECT_ID)
|
1427
|
+
VALGRIND_MEMPOOL_FREE(context, pointer);
|
1428
|
+
#endif
|
958
1429
|
}
|
959
1430
|
|
960
1431
|
/*
|
@@ -964,33 +1435,54 @@ pfree(void *pointer)
|
|
964
1435
|
void *
|
965
1436
|
repalloc(void *pointer, Size size)
|
966
1437
|
{
|
1438
|
+
#ifdef USE_VALGRIND
|
1439
|
+
MemoryContextMethodID method = GetMemoryChunkMethodID(pointer);
|
1440
|
+
#endif
|
1441
|
+
#if defined(USE_ASSERT_CHECKING) || defined(USE_VALGRIND)
|
967
1442
|
MemoryContext context = GetMemoryChunkContext(pointer);
|
1443
|
+
#endif
|
968
1444
|
void *ret;
|
969
1445
|
|
970
|
-
if (!AllocSizeIsValid(size))
|
971
|
-
elog(ERROR, "invalid memory alloc request size %zu", size);
|
972
|
-
|
973
1446
|
AssertNotInCriticalSection(context);
|
974
1447
|
|
975
1448
|
/* isReset must be false already */
|
976
1449
|
Assert(!context->isReset);
|
977
1450
|
|
978
|
-
|
979
|
-
|
980
|
-
|
981
|
-
|
982
|
-
|
983
|
-
|
984
|
-
|
985
|
-
|
986
|
-
|
987
|
-
|
1451
|
+
/*
|
1452
|
+
* For efficiency reasons, we purposefully offload the handling of
|
1453
|
+
* allocation failures to the MemoryContextMethods implementation as this
|
1454
|
+
* allows these checks to be performed only when an actual malloc needs to
|
1455
|
+
* be done to request more memory from the OS. Additionally, not having
|
1456
|
+
* to execute any instructions after this call allows the compiler to use
|
1457
|
+
* the sibling call optimization. If you're considering adding code after
|
1458
|
+
* this call, consider making it the responsibility of the 'realloc'
|
1459
|
+
* function instead.
|
1460
|
+
*/
|
1461
|
+
ret = MCXT_METHOD(pointer, realloc) (pointer, size, 0);
|
988
1462
|
|
989
|
-
|
1463
|
+
#ifdef USE_VALGRIND
|
1464
|
+
if (method != MCTX_ALIGNED_REDIRECT_ID)
|
1465
|
+
VALGRIND_MEMPOOL_CHANGE(context, pointer, ret, size);
|
1466
|
+
#endif
|
990
1467
|
|
991
1468
|
return ret;
|
992
1469
|
}
|
993
1470
|
|
1471
|
+
/*
|
1472
|
+
* repalloc_extended
|
1473
|
+
* Adjust the size of a previously allocated chunk,
|
1474
|
+
* with HUGE and NO_OOM options.
|
1475
|
+
*/
|
1476
|
+
#if defined(USE_ASSERT_CHECKING) || defined(USE_VALGRIND)
|
1477
|
+
#endif
|
1478
|
+
|
1479
|
+
/*
|
1480
|
+
* repalloc0
|
1481
|
+
* Adjust the size of a previously allocated chunk and zero out the added
|
1482
|
+
* space.
|
1483
|
+
*/
|
1484
|
+
|
1485
|
+
|
994
1486
|
/*
|
995
1487
|
* MemoryContextAllocHuge
|
996
1488
|
* Allocate (possibly-expansive) space within the specified context.
|