pg_query 4.2.1 → 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 +61 -0
- data/README.md +7 -9
- 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 +28 -3
- data/ext/pg_query/include/pg_query_enum_defs.c +599 -167
- data/ext/pg_query/include/pg_query_fingerprint_conds.c +640 -520
- data/ext/pg_query/include/pg_query_fingerprint_defs.c +6400 -4633
- data/ext/pg_query/include/pg_query_outfuncs_conds.c +433 -343
- data/ext/pg_query/include/pg_query_outfuncs_defs.c +1472 -1152
- data/ext/pg_query/include/pg_query_readfuncs_conds.c +154 -124
- data/ext/pg_query/include/pg_query_readfuncs_defs.c +1886 -1506
- 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/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 +7723 -6368
- data/ext/pg_query/include/protobuf/pg_query.pb.h +120022 -87031
- data/ext/pg_query/pg_query.c +10 -1
- data/ext/pg_query/pg_query.pb-c.c +22595 -17738
- data/ext/pg_query/pg_query_deparse.c +1 -10635
- data/ext/pg_query/pg_query_fingerprint.c +12 -8
- 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 -0
- data/ext/pg_query/pg_query_normalize.c +43 -2
- data/ext/pg_query/pg_query_outfuncs_json.c +9 -1
- data/ext/pg_query/pg_query_outfuncs_protobuf.c +3 -2
- 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 +3 -2
- data/ext/pg_query/pg_query_ruby.c +5 -0
- data/ext/pg_query/pg_query_scan.c +2 -2
- data/ext/pg_query/pg_query_split.c +3 -3
- 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 +243 -63
- data/ext/pg_query/src_backend_catalog_pg_proc.c +1 -3
- data/ext/pg_query/src_backend_commands_define.c +2 -3
- data/ext/pg_query/src_backend_nodes_bitmapset.c +140 -156
- data/ext/pg_query/src_backend_nodes_copyfuncs.c +96 -6202
- data/ext/pg_query/src_backend_nodes_equalfuncs.c +95 -4068
- data/ext/pg_query/src_backend_nodes_extensible.c +6 -29
- data/ext/pg_query/src_backend_nodes_list.c +16 -8
- data/ext/pg_query/src_backend_nodes_makefuncs.c +134 -1
- data/ext/pg_query/src_backend_nodes_nodeFuncs.c +391 -133
- data/ext/pg_query/src_backend_nodes_value.c +1 -1
- data/ext/pg_query/src_backend_parser_gram.c +43710 -39953
- data/ext/pg_query/src_backend_parser_parser.c +34 -8
- data/ext/pg_query/src_backend_parser_scan.c +6971 -3373
- data/ext/pg_query/src_backend_parser_scansup.c +2 -1
- data/ext/pg_query/src_backend_storage_ipc_ipc.c +1 -1
- data/ext/pg_query/src_backend_tcop_postgres.c +99 -96
- data/ext/pg_query/src_backend_utils_activity_pgstat_database.c +2 -2
- data/ext/pg_query/src_backend_utils_adt_datum.c +2 -2
- data/ext/pg_query/src_backend_utils_adt_expandeddatum.c +1 -1
- data/ext/pg_query/src_backend_utils_adt_format_type.c +1 -1
- data/ext/pg_query/src_backend_utils_adt_numutils.c +488 -0
- data/ext/pg_query/src_backend_utils_adt_ruleutils.c +177 -30
- data/ext/pg_query/src_backend_utils_error_assert.c +4 -7
- data/ext/pg_query/src_backend_utils_error_elog.c +397 -270
- data/ext/pg_query/src_backend_utils_fmgr_fmgr.c +36 -2
- data/ext/pg_query/src_backend_utils_init_globals.c +20 -5
- data/ext/pg_query/src_backend_utils_mb_mbutils.c +31 -84
- 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 +704 -497
- 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 +637 -233
- 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 +1 -1
- data/ext/pg_query/src_common_keywords.c +1 -1
- data/ext/pg_query/src_common_kwlist_d.h +586 -517
- 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 +100 -116
- data/ext/pg_query/src_pl_plpgsql_src_pl_comp.c +99 -5
- data/ext/pg_query/src_pl_plpgsql_src_pl_funcs.c +3 -1
- data/ext/pg_query/src_pl_plpgsql_src_pl_gram.c +829 -763
- data/ext/pg_query/src_pl_plpgsql_src_pl_handler.c +1 -1
- data/ext/pg_query/src_pl_plpgsql_src_pl_reserved_kwlist_d.h +1 -1
- data/ext/pg_query/src_pl_plpgsql_src_pl_scanner.c +19 -1
- data/ext/pg_query/src_pl_plpgsql_src_pl_unreserved_kwlist_d.h +48 -46
- data/ext/pg_query/src_port_pg_bitutils.c +251 -32
- data/ext/pg_query/src_port_pgstrcasecmp.c +57 -1
- data/ext/pg_query/src_port_snprintf.c +20 -27
- data/ext/pg_query/src_port_strerror.c +1 -3
- data/ext/pg_query/src_port_strlcpy.c +79 -0
- data/lib/pg_query/fingerprint.rb +5 -8
- data/lib/pg_query/node.rb +16 -11
- data/lib/pg_query/param_refs.rb +2 -2
- data/lib/pg_query/parse.rb +6 -8
- data/lib/pg_query/parse_error.rb +1 -0
- data/lib/pg_query/pg_query_pb.rb +173 -3196
- data/lib/pg_query/scan.rb +1 -0
- data/lib/pg_query/treewalker.rb +52 -11
- data/lib/pg_query/truncate.rb +18 -20
- data/lib/pg_query/version.rb +1 -1
- metadata +443 -442
- data/ext/pg_query/guc-file.c +0 -0
- data/ext/pg_query/include/access/amapi.h +0 -290
- 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 -63
- data/ext/pg_query/include/access/commit_ts.h +0 -74
- data/ext/pg_query/include/access/detoast.h +0 -82
- data/ext/pg_query/include/access/genam.h +0 -231
- 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 -807
- data/ext/pg_query/include/access/itup.h +0 -167
- 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 -191
- 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 -85
- data/ext/pg_query/include/access/sysattr.h +0 -29
- data/ext/pg_query/include/access/table.h +0 -28
- data/ext/pg_query/include/access/tableam.h +0 -2077
- data/ext/pg_query/include/access/toast_compression.h +0 -73
- data/ext/pg_query/include/access/transam.h +0 -375
- 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 -65
- data/ext/pg_query/include/access/xact.h +0 -523
- data/ext/pg_query/include/access/xlog.h +0 -303
- data/ext/pg_query/include/access/xlog_internal.h +0 -366
- data/ext/pg_query/include/access/xlogdefs.h +0 -101
- data/ext/pg_query/include/access/xlogprefetcher.h +0 -55
- data/ext/pg_query/include/access/xlogreader.h +0 -443
- data/ext/pg_query/include/access/xlogrecord.h +0 -236
- data/ext/pg_query/include/access/xlogrecovery.h +0 -157
- data/ext/pg_query/include/c.h +0 -1391
- data/ext/pg_query/include/catalog/catalog.h +0 -44
- data/ext/pg_query/include/catalog/catversion.h +0 -58
- data/ext/pg_query/include/catalog/dependency.h +0 -269
- data/ext/pg_query/include/catalog/genbki.h +0 -142
- data/ext/pg_query/include/catalog/index.h +0 -214
- data/ext/pg_query/include/catalog/indexing.h +0 -54
- data/ext/pg_query/include/catalog/namespace.h +0 -190
- data/ext/pg_query/include/catalog/objectaccess.h +0 -265
- data/ext/pg_query/include/catalog/objectaddress.h +0 -89
- data/ext/pg_query/include/catalog/pg_aggregate.h +0 -180
- data/ext/pg_query/include/catalog/pg_aggregate_d.h +0 -78
- data/ext/pg_query/include/catalog/pg_am.h +0 -63
- data/ext/pg_query/include/catalog/pg_am_d.h +0 -47
- data/ext/pg_query/include/catalog/pg_attribute.h +0 -221
- data/ext/pg_query/include/catalog/pg_attribute_d.h +0 -62
- data/ext/pg_query/include/catalog/pg_authid.h +0 -63
- data/ext/pg_query/include/catalog/pg_authid_d.h +0 -57
- data/ext/pg_query/include/catalog/pg_class.h +0 -230
- data/ext/pg_query/include/catalog/pg_class_d.h +0 -132
- data/ext/pg_query/include/catalog/pg_collation.h +0 -98
- data/ext/pg_query/include/catalog/pg_collation_d.h +0 -62
- data/ext/pg_query/include/catalog/pg_constraint.h +0 -273
- data/ext/pg_query/include/catalog/pg_constraint_d.h +0 -73
- data/ext/pg_query/include/catalog/pg_control.h +0 -250
- data/ext/pg_query/include/catalog/pg_conversion.h +0 -75
- data/ext/pg_query/include/catalog/pg_conversion_d.h +0 -38
- data/ext/pg_query/include/catalog/pg_depend.h +0 -77
- data/ext/pg_query/include/catalog/pg_depend_d.h +0 -36
- data/ext/pg_query/include/catalog/pg_event_trigger.h +0 -57
- data/ext/pg_query/include/catalog/pg_event_trigger_d.h +0 -36
- data/ext/pg_query/include/catalog/pg_index.h +0 -90
- data/ext/pg_query/include/catalog/pg_index_d.h +0 -59
- data/ext/pg_query/include/catalog/pg_language.h +0 -72
- data/ext/pg_query/include/catalog/pg_language_d.h +0 -41
- data/ext/pg_query/include/catalog/pg_namespace.h +0 -64
- data/ext/pg_query/include/catalog/pg_namespace_d.h +0 -36
- data/ext/pg_query/include/catalog/pg_opclass.h +0 -88
- data/ext/pg_query/include/catalog/pg_opclass_d.h +0 -51
- data/ext/pg_query/include/catalog/pg_operator.h +0 -107
- data/ext/pg_query/include/catalog/pg_operator_d.h +0 -142
- data/ext/pg_query/include/catalog/pg_opfamily.h +0 -63
- data/ext/pg_query/include/catalog/pg_opfamily_d.h +0 -49
- data/ext/pg_query/include/catalog/pg_parameter_acl.h +0 -60
- data/ext/pg_query/include/catalog/pg_parameter_acl_d.h +0 -34
- data/ext/pg_query/include/catalog/pg_partitioned_table.h +0 -74
- data/ext/pg_query/include/catalog/pg_partitioned_table_d.h +0 -36
- data/ext/pg_query/include/catalog/pg_proc.h +0 -220
- data/ext/pg_query/include/catalog/pg_proc_d.h +0 -101
- data/ext/pg_query/include/catalog/pg_publication.h +0 -161
- data/ext/pg_query/include/catalog/pg_publication_d.h +0 -38
- data/ext/pg_query/include/catalog/pg_replication_origin.h +0 -62
- data/ext/pg_query/include/catalog/pg_replication_origin_d.h +0 -33
- data/ext/pg_query/include/catalog/pg_statistic.h +0 -282
- data/ext/pg_query/include/catalog/pg_statistic_d.h +0 -195
- data/ext/pg_query/include/catalog/pg_statistic_ext.h +0 -88
- data/ext/pg_query/include/catalog/pg_statistic_ext_d.h +0 -45
- data/ext/pg_query/include/catalog/pg_transform.h +0 -48
- data/ext/pg_query/include/catalog/pg_transform_d.h +0 -34
- data/ext/pg_query/include/catalog/pg_trigger.h +0 -153
- data/ext/pg_query/include/catalog/pg_trigger_d.h +0 -109
- data/ext/pg_query/include/catalog/pg_ts_config.h +0 -53
- data/ext/pg_query/include/catalog/pg_ts_config_d.h +0 -34
- data/ext/pg_query/include/catalog/pg_ts_dict.h +0 -59
- data/ext/pg_query/include/catalog/pg_ts_dict_d.h +0 -35
- data/ext/pg_query/include/catalog/pg_ts_parser.h +0 -60
- data/ext/pg_query/include/catalog/pg_ts_parser_d.h +0 -37
- data/ext/pg_query/include/catalog/pg_ts_template.h +0 -51
- data/ext/pg_query/include/catalog/pg_ts_template_d.h +0 -34
- data/ext/pg_query/include/catalog/pg_type.h +0 -404
- data/ext/pg_query/include/catalog/pg_type_d.h +0 -324
- data/ext/pg_query/include/catalog/storage.h +0 -50
- data/ext/pg_query/include/commands/async.h +0 -53
- data/ext/pg_query/include/commands/dbcommands.h +0 -36
- data/ext/pg_query/include/commands/defrem.h +0 -160
- 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 -287
- data/ext/pg_query/include/commands/user.h +0 -37
- data/ext/pg_query/include/commands/vacuum.h +0 -340
- 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 -31
- data/ext/pg_query/include/common/keywords.h +0 -29
- data/ext/pg_query/include/common/kwlookup.h +0 -44
- data/ext/pg_query/include/common/pg_prng.h +0 -60
- data/ext/pg_query/include/common/relpath.h +0 -90
- data/ext/pg_query/include/common/string.h +0 -42
- data/ext/pg_query/include/common/unicode_combining_table.h +0 -308
- data/ext/pg_query/include/common/unicode_east_asian_fw_table.h +0 -125
- data/ext/pg_query/include/datatype/timestamp.h +0 -236
- data/ext/pg_query/include/executor/execdesc.h +0 -70
- data/ext/pg_query/include/executor/executor.h +0 -663
- data/ext/pg_query/include/executor/functions.h +0 -55
- data/ext/pg_query/include/executor/instrument.h +0 -118
- data/ext/pg_query/include/executor/spi.h +0 -213
- 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 -781
- data/ext/pg_query/include/funcapi.h +0 -360
- 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 -1095
- data/ext/pg_query/include/lib/dshash.h +0 -112
- data/ext/pg_query/include/lib/ilist.h +0 -746
- data/ext/pg_query/include/lib/pairingheap.h +0 -102
- data/ext/pg_query/include/lib/simplehash.h +0 -1184
- data/ext/pg_query/include/lib/sort_template.h +0 -432
- data/ext/pg_query/include/lib/stringinfo.h +0 -161
- data/ext/pg_query/include/libpq/auth.h +0 -31
- data/ext/pg_query/include/libpq/crypt.h +0 -47
- data/ext/pg_query/include/libpq/hba.h +0 -179
- data/ext/pg_query/include/libpq/libpq-be.h +0 -343
- data/ext/pg_query/include/libpq/libpq.h +0 -144
- data/ext/pg_query/include/libpq/pqcomm.h +0 -194
- 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 -755
- data/ext/pg_query/include/mb/stringinfo_mb.h +0 -24
- data/ext/pg_query/include/miscadmin.h +0 -495
- data/ext/pg_query/include/nodes/bitmapset.h +0 -122
- data/ext/pg_query/include/nodes/execnodes.h +0 -2715
- data/ext/pg_query/include/nodes/extensible.h +0 -162
- data/ext/pg_query/include/nodes/lockoptions.h +0 -61
- data/ext/pg_query/include/nodes/makefuncs.h +0 -109
- data/ext/pg_query/include/nodes/memnodes.h +0 -110
- data/ext/pg_query/include/nodes/nodeFuncs.h +0 -162
- data/ext/pg_query/include/nodes/nodes.h +0 -861
- data/ext/pg_query/include/nodes/params.h +0 -170
- data/ext/pg_query/include/nodes/parsenodes.h +0 -3812
- data/ext/pg_query/include/nodes/pathnodes.h +0 -2734
- data/ext/pg_query/include/nodes/pg_list.h +0 -612
- data/ext/pg_query/include/nodes/plannodes.h +0 -1349
- data/ext/pg_query/include/nodes/primnodes.h +0 -1593
- 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 -80
- data/ext/pg_query/include/optimizer/cost.h +0 -213
- data/ext/pg_query/include/optimizer/geqo.h +0 -90
- data/ext/pg_query/include/optimizer/geqo_gene.h +0 -45
- data/ext/pg_query/include/optimizer/optimizer.h +0 -202
- data/ext/pg_query/include/optimizer/paths.h +0 -257
- data/ext/pg_query/include/optimizer/planmain.h +0 -120
- data/ext/pg_query/include/parser/analyze.h +0 -63
- data/ext/pg_query/include/parser/gram.h +0 -1101
- data/ext/pg_query/include/parser/gramparse.h +0 -75
- data/ext/pg_query/include/parser/kwlist.h +0 -487
- data/ext/pg_query/include/parser/parse_agg.h +0 -63
- data/ext/pg_query/include/parser/parse_coerce.h +0 -100
- data/ext/pg_query/include/parser/parse_expr.h +0 -25
- data/ext/pg_query/include/parser/parse_func.h +0 -74
- data/ext/pg_query/include/parser/parse_node.h +0 -339
- data/ext/pg_query/include/parser/parse_oper.h +0 -65
- data/ext/pg_query/include/parser/parse_relation.h +0 -124
- data/ext/pg_query/include/parser/parse_type.h +0 -60
- data/ext/pg_query/include/parser/parser.h +0 -68
- 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 -27
- data/ext/pg_query/include/partitioning/partdefs.h +0 -26
- data/ext/pg_query/include/pg_config.h +0 -1037
- data/ext/pg_query/include/pg_config_manual.h +0 -410
- 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 -699
- data/ext/pg_query/include/pgtime.h +0 -94
- data/ext/pg_query/include/pl_gram.h +0 -383
- 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 -111
- data/ext/pg_query/include/pl_unreserved_kwlist_d.h +0 -244
- data/ext/pg_query/include/plerrcodes.h +0 -998
- data/ext/pg_query/include/plpgsql.h +0 -1345
- data/ext/pg_query/include/port/atomics/arch-arm.h +0 -32
- 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 -302
- 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 -553
- data/ext/pg_query/include/portability/instr_time.h +0 -256
- data/ext/pg_query/include/postgres.h +0 -808
- 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/auxprocess.h +0 -20
- data/ext/pg_query/include/postmaster/bgworker.h +0 -162
- 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 -73
- data/ext/pg_query/include/postmaster/postmaster.h +0 -78
- data/ext/pg_query/include/postmaster/startup.h +0 -39
- data/ext/pg_query/include/postmaster/syslogger.h +0 -103
- data/ext/pg_query/include/postmaster/walwriter.h +0 -21
- data/ext/pg_query/include/regex/regex.h +0 -186
- data/ext/pg_query/include/replication/logicallauncher.h +0 -29
- data/ext/pg_query/include/replication/logicalproto.h +0 -254
- 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 -685
- data/ext/pg_query/include/replication/slot.h +0 -230
- data/ext/pg_query/include/replication/syncrep.h +0 -115
- data/ext/pg_query/include/replication/walreceiver.h +0 -472
- 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 -38
- 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 -115
- data/ext/pg_query/include/storage/buf.h +0 -46
- data/ext/pg_query/include/storage/bufmgr.h +0 -297
- data/ext/pg_query/include/storage/bufpage.h +0 -457
- data/ext/pg_query/include/storage/condition_variable.h +0 -73
- data/ext/pg_query/include/storage/dsm.h +0 -64
- data/ext/pg_query/include/storage/dsm_impl.h +0 -76
- data/ext/pg_query/include/storage/fd.h +0 -198
- data/ext/pg_query/include/storage/fileset.h +0 -40
- data/ext/pg_query/include/storage/ipc.h +0 -84
- 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 -208
- data/ext/pg_query/include/storage/large_object.h +0 -100
- data/ext/pg_query/include/storage/latch.h +0 -186
- data/ext/pg_query/include/storage/lmgr.h +0 -115
- data/ext/pg_query/include/storage/lock.h +0 -616
- data/ext/pg_query/include/storage/lockdefs.h +0 -59
- data/ext/pg_query/include/storage/lwlock.h +0 -206
- data/ext/pg_query/include/storage/lwlocknames.h +0 -50
- 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 -92
- data/ext/pg_query/include/storage/pmsignal.h +0 -105
- data/ext/pg_query/include/storage/predicate.h +0 -87
- data/ext/pg_query/include/storage/proc.h +0 -461
- data/ext/pg_query/include/storage/procarray.h +0 -98
- data/ext/pg_query/include/storage/proclist_types.h +0 -51
- data/ext/pg_query/include/storage/procsignal.h +0 -71
- data/ext/pg_query/include/storage/relfilenode.h +0 -99
- data/ext/pg_query/include/storage/s_lock.h +0 -1110
- data/ext/pg_query/include/storage/sharedfileset.h +0 -37
- data/ext/pg_query/include/storage/shm_mq.h +0 -86
- 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 -111
- data/ext/pg_query/include/storage/spin.h +0 -77
- data/ext/pg_query/include/storage/standby.h +0 -98
- data/ext/pg_query/include/storage/standbydefs.h +0 -74
- data/ext/pg_query/include/storage/sync.h +0 -66
- data/ext/pg_query/include/tcop/cmdtag.h +0 -58
- data/ext/pg_query/include/tcop/cmdtaglist.h +0 -218
- 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 -20
- data/ext/pg_query/include/tcop/pquery.h +0 -51
- data/ext/pg_query/include/tcop/tcopprot.h +0 -97
- data/ext/pg_query/include/tcop/utility.h +0 -112
- data/ext/pg_query/include/tsearch/ts_cache.h +0 -98
- data/ext/pg_query/include/utils/acl.h +0 -333
- data/ext/pg_query/include/utils/aclchk_internal.h +0 -45
- data/ext/pg_query/include/utils/array.h +0 -464
- data/ext/pg_query/include/utils/backend_progress.h +0 -44
- data/ext/pg_query/include/utils/backend_status.h +0 -321
- data/ext/pg_query/include/utils/builtins.h +0 -127
- data/ext/pg_query/include/utils/bytea.h +0 -28
- 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 -344
- data/ext/pg_query/include/utils/datum.h +0 -76
- data/ext/pg_query/include/utils/dsa.h +0 -123
- data/ext/pg_query/include/utils/dynahash.h +0 -20
- data/ext/pg_query/include/utils/elog.h +0 -470
- data/ext/pg_query/include/utils/errcodes.h +0 -354
- 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 -3261
- data/ext/pg_query/include/utils/fmgrprotos.h +0 -2829
- data/ext/pg_query/include/utils/fmgrtab.h +0 -49
- data/ext/pg_query/include/utils/guc.h +0 -469
- data/ext/pg_query/include/utils/guc_tables.h +0 -276
- data/ext/pg_query/include/utils/hsearch.h +0 -153
- data/ext/pg_query/include/utils/inval.h +0 -68
- data/ext/pg_query/include/utils/lsyscache.h +0 -208
- data/ext/pg_query/include/utils/memdebug.h +0 -82
- data/ext/pg_query/include/utils/memutils.h +0 -230
- data/ext/pg_query/include/utils/numeric.h +0 -90
- data/ext/pg_query/include/utils/palloc.h +0 -158
- data/ext/pg_query/include/utils/partcache.h +0 -102
- data/ext/pg_query/include/utils/pg_locale.h +0 -127
- data/ext/pg_query/include/utils/pg_lsn.h +0 -29
- data/ext/pg_query/include/utils/pgstat_internal.h +0 -784
- data/ext/pg_query/include/utils/pidfile.h +0 -56
- data/ext/pg_query/include/utils/plancache.h +0 -236
- data/ext/pg_query/include/utils/portal.h +0 -252
- 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/queryjumble.h +0 -88
- data/ext/pg_query/include/utils/regproc.h +0 -39
- data/ext/pg_query/include/utils/rel.h +0 -695
- data/ext/pg_query/include/utils/relcache.h +0 -153
- 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 -47
- data/ext/pg_query/include/utils/sharedtuplestore.h +0 -61
- data/ext/pg_query/include/utils/snapmgr.h +0 -179
- data/ext/pg_query/include/utils/snapshot.h +0 -219
- data/ext/pg_query/include/utils/sortsupport.h +0 -391
- data/ext/pg_query/include/utils/syscache.h +0 -224
- data/ext/pg_query/include/utils/timeout.h +0 -95
- data/ext/pg_query/include/utils/timestamp.h +0 -117
- data/ext/pg_query/include/utils/tuplesort.h +0 -291
- data/ext/pg_query/include/utils/tuplestore.h +0 -91
- data/ext/pg_query/include/utils/typcache.h +0 -209
- data/ext/pg_query/include/utils/tzparser.h +0 -39
- data/ext/pg_query/include/utils/varlena.h +0 -41
- data/ext/pg_query/include/utils/wait_event.h +0 -289
- data/ext/pg_query/include/utils/xml.h +0 -84
- data/ext/pg_query/src_backend_postmaster_postmaster.c +0 -2201
- data/ext/pg_query/src_backend_storage_lmgr_s_lock.c +0 -371
- data/ext/pg_query/src_backend_utils_hash_dynahash.c +0 -1116
- data/ext/pg_query/src_backend_utils_misc_guc.c +0 -1993
- data/ext/pg_query/src_common_pg_prng.c +0 -152
- data/ext/pg_query/src_common_string.c +0 -92
- data/ext/pg_query/src_port_pgsleep.c +0 -69
- 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/{access → postgres/access}/rmgr.h +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
|
*
|
@@ -57,17 +71,118 @@
|
|
57
71
|
|
58
72
|
#include "mb/pg_wchar.h"
|
59
73
|
#include "miscadmin.h"
|
60
|
-
#include "storage/proc.h"
|
61
|
-
#include "storage/procarray.h"
|
62
|
-
#include "storage/procsignal.h"
|
63
|
-
#include "utils/fmgrprotos.h"
|
64
74
|
#include "utils/memdebug.h"
|
65
75
|
#include "utils/memutils.h"
|
76
|
+
#include "utils/memutils_internal.h"
|
77
|
+
#include "utils/memutils_memorychunk.h"
|
66
78
|
|
67
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
|
+
|
68
85
|
/*****************************************************************************
|
69
86
|
* GLOBAL MEMORY *
|
70
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
|
71
186
|
|
72
187
|
/*
|
73
188
|
* CurrentMemoryContext
|
@@ -93,9 +208,10 @@ __thread MemoryContext ErrorContext = NULL;
|
|
93
208
|
/* This is a transient link to the active portal's memory context: */
|
94
209
|
|
95
210
|
|
211
|
+
static void MemoryContextDeleteOnly(MemoryContext context);
|
96
212
|
static void MemoryContextCallResetCallbacks(MemoryContext context);
|
97
213
|
static void MemoryContextStatsInternal(MemoryContext context, int level,
|
98
|
-
|
214
|
+
int max_level, int max_children,
|
99
215
|
MemoryContextCounters *totals,
|
100
216
|
bool print_to_stderr);
|
101
217
|
static void MemoryContextStatsPrint(MemoryContext context, void *passthru,
|
@@ -110,6 +226,144 @@ static void MemoryContextStatsPrint(MemoryContext context, void *passthru,
|
|
110
226
|
#define AssertNotInCriticalSection(context) \
|
111
227
|
Assert(CritSectionCount == 0 || (context)->allowInCritSection)
|
112
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
|
+
|
113
367
|
|
114
368
|
/*****************************************************************************
|
115
369
|
* EXPORTED ROUTINES *
|
@@ -135,7 +389,7 @@ static void MemoryContextStatsPrint(MemoryContext context, void *passthru,
|
|
135
389
|
void
|
136
390
|
MemoryContextInit(void)
|
137
391
|
{
|
138
|
-
|
392
|
+
Assert(TopMemoryContext == NULL);
|
139
393
|
|
140
394
|
/*
|
141
395
|
* First, initialize TopMemoryContext, which is the parent of all others.
|
@@ -179,7 +433,7 @@ MemoryContextInit(void)
|
|
179
433
|
void
|
180
434
|
MemoryContextReset(MemoryContext context)
|
181
435
|
{
|
182
|
-
|
436
|
+
Assert(MemoryContextIsValid(context));
|
183
437
|
|
184
438
|
/* save a function call in common case where there are no children */
|
185
439
|
if (context->firstchild != NULL)
|
@@ -198,7 +452,7 @@ MemoryContextReset(MemoryContext context)
|
|
198
452
|
void
|
199
453
|
MemoryContextResetOnly(MemoryContext context)
|
200
454
|
{
|
201
|
-
|
455
|
+
Assert(MemoryContextIsValid(context));
|
202
456
|
|
203
457
|
/* Nothing to do if no pallocs since startup or last reset */
|
204
458
|
if (!context->isReset)
|
@@ -209,10 +463,8 @@ MemoryContextResetOnly(MemoryContext context)
|
|
209
463
|
* If context->ident points into the context's memory, it will become
|
210
464
|
* a dangling pointer. We could prevent that by setting it to NULL
|
211
465
|
* here, but that would break valid coding patterns that keep the
|
212
|
-
* ident elsewhere, e.g. in a parent context.
|
213
|
-
*
|
214
|
-
* in separately-palloc'd chunks, so that risks false positives. So
|
215
|
-
* 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.
|
216
468
|
*/
|
217
469
|
|
218
470
|
context->methods->reset(context);
|
@@ -236,21 +488,60 @@ MemoryContextResetOnly(MemoryContext context)
|
|
236
488
|
* allocated therein.
|
237
489
|
*
|
238
490
|
* The type-specific delete routine removes all storage for the context,
|
239
|
-
* but we have to
|
240
|
-
* We must also delink the context from its parent, if it has one.
|
491
|
+
* but we have to deal with descendant nodes here.
|
241
492
|
*/
|
242
493
|
void
|
243
494
|
MemoryContextDelete(MemoryContext context)
|
244
495
|
{
|
245
|
-
|
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));
|
246
539
|
/* We had better not be deleting TopMemoryContext ... */
|
247
540
|
Assert(context != TopMemoryContext);
|
248
541
|
/* And not CurrentMemoryContext, either */
|
249
542
|
Assert(context != CurrentMemoryContext);
|
250
|
-
|
251
|
-
|
252
|
-
if (context->firstchild != NULL)
|
253
|
-
MemoryContextDeleteChildren(context);
|
543
|
+
/* All the children should've been deleted already */
|
544
|
+
Assert(context->firstchild == NULL);
|
254
545
|
|
255
546
|
/*
|
256
547
|
* It's not entirely clear whether 'tis better to do this before or after
|
@@ -287,7 +578,7 @@ MemoryContextDelete(MemoryContext context)
|
|
287
578
|
void
|
288
579
|
MemoryContextDeleteChildren(MemoryContext context)
|
289
580
|
{
|
290
|
-
|
581
|
+
Assert(MemoryContextIsValid(context));
|
291
582
|
|
292
583
|
/*
|
293
584
|
* MemoryContextDelete will delink the child from me, so just iterate as
|
@@ -369,8 +660,8 @@ MemoryContextCallResetCallbacks(MemoryContext context)
|
|
369
660
|
void
|
370
661
|
MemoryContextSetParent(MemoryContext context, MemoryContext new_parent)
|
371
662
|
{
|
372
|
-
|
373
|
-
|
663
|
+
Assert(MemoryContextIsValid(context));
|
664
|
+
Assert(context != new_parent);
|
374
665
|
|
375
666
|
/* Fast path if it's got correct parent already */
|
376
667
|
if (new_parent == context->parent)
|
@@ -396,7 +687,7 @@ MemoryContextSetParent(MemoryContext context, MemoryContext new_parent)
|
|
396
687
|
/* And relink */
|
397
688
|
if (new_parent)
|
398
689
|
{
|
399
|
-
|
690
|
+
Assert(MemoryContextIsValid(new_parent));
|
400
691
|
context->parent = new_parent;
|
401
692
|
context->prevchild = NULL;
|
402
693
|
context->nextchild = new_parent->firstchild;
|
@@ -426,11 +717,22 @@ MemoryContextSetParent(MemoryContext context, MemoryContext new_parent)
|
|
426
717
|
void
|
427
718
|
MemoryContextAllowInCriticalSection(MemoryContext context, bool allow)
|
428
719
|
{
|
429
|
-
|
720
|
+
Assert(MemoryContextIsValid(context));
|
430
721
|
|
431
722
|
context->allowInCritSection = allow;
|
432
723
|
}
|
433
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
|
+
|
434
736
|
/*
|
435
737
|
* GetMemoryChunkSpace
|
436
738
|
* Given a currently-allocated chunk, determine the total space
|
@@ -439,7 +741,11 @@ MemoryContextAllowInCriticalSection(MemoryContext context, bool allow)
|
|
439
741
|
* This is useful for measuring the total space occupied by a set of
|
440
742
|
* allocated chunks.
|
441
743
|
*/
|
442
|
-
|
744
|
+
Size
|
745
|
+
GetMemoryChunkSpace(void *pointer)
|
746
|
+
{
|
747
|
+
return MCXT_METHOD(pointer, get_chunk_space) (pointer);
|
748
|
+
}
|
443
749
|
|
444
750
|
/*
|
445
751
|
* MemoryContextGetParent
|
@@ -459,6 +765,12 @@ MemoryContextAllowInCriticalSection(MemoryContext context, bool allow)
|
|
459
765
|
*/
|
460
766
|
|
461
767
|
|
768
|
+
/*
|
769
|
+
* Return the memory consumption statistics about the given context and its
|
770
|
+
* children.
|
771
|
+
*/
|
772
|
+
|
773
|
+
|
462
774
|
/*
|
463
775
|
* MemoryContextStats
|
464
776
|
* Print statistics about the named context and all its descendants.
|
@@ -470,8 +782,8 @@ MemoryContextAllowInCriticalSection(MemoryContext context, bool allow)
|
|
470
782
|
void
|
471
783
|
MemoryContextStats(MemoryContext context)
|
472
784
|
{
|
473
|
-
/*
|
474
|
-
MemoryContextStatsDetail(context, 100, true);
|
785
|
+
/* Hard-wired limits are usually good enough */
|
786
|
+
MemoryContextStatsDetail(context, 100, 100, true);
|
475
787
|
}
|
476
788
|
|
477
789
|
/*
|
@@ -483,14 +795,16 @@ MemoryContextStats(MemoryContext context)
|
|
483
795
|
* with fprintf(stderr), otherwise use ereport().
|
484
796
|
*/
|
485
797
|
void
|
486
|
-
MemoryContextStatsDetail(MemoryContext context,
|
798
|
+
MemoryContextStatsDetail(MemoryContext context,
|
799
|
+
int max_level, int max_children,
|
487
800
|
bool print_to_stderr)
|
488
801
|
{
|
489
802
|
MemoryContextCounters grand_totals;
|
490
803
|
|
491
804
|
memset(&grand_totals, 0, sizeof(grand_totals));
|
492
805
|
|
493
|
-
MemoryContextStatsInternal(context, 0,
|
806
|
+
MemoryContextStatsInternal(context, 0, max_level, max_children,
|
807
|
+
&grand_totals, print_to_stderr);
|
494
808
|
|
495
809
|
if (print_to_stderr)
|
496
810
|
fprintf(stderr,
|
@@ -499,16 +813,16 @@ MemoryContextStatsDetail(MemoryContext context, int max_children,
|
|
499
813
|
grand_totals.freespace, grand_totals.freechunks,
|
500
814
|
grand_totals.totalspace - grand_totals.freespace);
|
501
815
|
else
|
502
|
-
|
816
|
+
{
|
503
817
|
/*
|
504
818
|
* Use LOG_SERVER_ONLY to prevent the memory contexts from being sent
|
505
819
|
* to the connected client.
|
506
820
|
*
|
507
821
|
* We don't buffer the information about all memory contexts in a
|
508
|
-
* backend into StringInfo and log it as one message.
|
509
|
-
*
|
510
|
-
*
|
511
|
-
*
|
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.
|
512
826
|
*/
|
513
827
|
ereport(LOG_SERVER_ONLY,
|
514
828
|
(errhidestmt(true),
|
@@ -517,89 +831,96 @@ MemoryContextStatsDetail(MemoryContext context, int max_children,
|
|
517
831
|
grand_totals.totalspace, grand_totals.nblocks,
|
518
832
|
grand_totals.freespace, grand_totals.freechunks,
|
519
833
|
grand_totals.totalspace - grand_totals.freespace)));
|
834
|
+
}
|
520
835
|
}
|
521
836
|
|
522
837
|
/*
|
523
838
|
* MemoryContextStatsInternal
|
524
839
|
* One recursion level for MemoryContextStats
|
525
840
|
*
|
526
|
-
* Print this context if
|
527
|
-
* *totals (if
|
841
|
+
* Print stats for this context if possible, but in any case accumulate counts
|
842
|
+
* into *totals (if not NULL).
|
528
843
|
*/
|
529
844
|
static void
|
530
845
|
MemoryContextStatsInternal(MemoryContext context, int level,
|
531
|
-
|
846
|
+
int max_level, int max_children,
|
532
847
|
MemoryContextCounters *totals,
|
533
848
|
bool print_to_stderr)
|
534
849
|
{
|
535
|
-
MemoryContextCounters local_totals;
|
536
850
|
MemoryContext child;
|
537
851
|
int ichild;
|
538
852
|
|
539
|
-
|
853
|
+
Assert(MemoryContextIsValid(context));
|
540
854
|
|
541
855
|
/* Examine the context itself */
|
542
856
|
context->methods->stats(context,
|
543
|
-
|
857
|
+
MemoryContextStatsPrint,
|
544
858
|
(void *) &level,
|
545
859
|
totals, print_to_stderr);
|
546
860
|
|
547
861
|
/*
|
548
|
-
* Examine children.
|
549
|
-
*
|
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.
|
550
868
|
*/
|
551
|
-
|
552
|
-
|
553
|
-
|
554
|
-
child != NULL;
|
555
|
-
child = child->nextchild, ichild++)
|
869
|
+
child = context->firstchild;
|
870
|
+
ichild = 0;
|
871
|
+
if (level < max_level && !stack_is_too_deep())
|
556
872
|
{
|
557
|
-
|
873
|
+
for (; child != NULL && ichild < max_children;
|
874
|
+
child = child->nextchild, ichild++)
|
875
|
+
{
|
558
876
|
MemoryContextStatsInternal(child, level + 1,
|
559
|
-
|
877
|
+
max_level, max_children,
|
560
878
|
totals,
|
561
879
|
print_to_stderr);
|
562
|
-
|
563
|
-
MemoryContextStatsInternal(child, level + 1,
|
564
|
-
false, max_children,
|
565
|
-
&local_totals,
|
566
|
-
print_to_stderr);
|
880
|
+
}
|
567
881
|
}
|
568
882
|
|
569
|
-
|
570
|
-
if (ichild > max_children)
|
883
|
+
if (child != NULL)
|
571
884
|
{
|
572
|
-
|
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)
|
573
892
|
{
|
574
|
-
|
575
|
-
|
576
|
-
|
577
|
-
|
578
|
-
for (i = 0; i <= level; i++)
|
579
|
-
fprintf(stderr, " ");
|
580
|
-
fprintf(stderr,
|
581
|
-
"%d more child contexts containing %zu total in %zu blocks; %zu free (%zu chunks); %zu used\n",
|
582
|
-
ichild - max_children,
|
583
|
-
local_totals.totalspace,
|
584
|
-
local_totals.nblocks,
|
585
|
-
local_totals.freespace,
|
586
|
-
local_totals.freechunks,
|
587
|
-
local_totals.totalspace - local_totals.freespace);
|
588
|
-
}
|
589
|
-
else
|
590
|
-
ereport(LOG_SERVER_ONLY,
|
591
|
-
(errhidestmt(true),
|
592
|
-
errhidecontext(true),
|
593
|
-
errmsg_internal("level: %d; %d more child contexts containing %zu total in %zu blocks; %zu free (%zu chunks); %zu used",
|
594
|
-
level,
|
595
|
-
ichild - max_children,
|
596
|
-
local_totals.totalspace,
|
597
|
-
local_totals.nblocks,
|
598
|
-
local_totals.freespace,
|
599
|
-
local_totals.freechunks,
|
600
|
-
local_totals.totalspace - local_totals.freespace)));
|
893
|
+
child->methods->stats(child, NULL, NULL, &local_totals, false);
|
894
|
+
ichild++;
|
895
|
+
child = MemoryContextTraverseNext(child, context);
|
601
896
|
}
|
602
897
|
|
898
|
+
if (print_to_stderr)
|
899
|
+
{
|
900
|
+
for (int i = 0; i <= level; i++)
|
901
|
+
fprintf(stderr, " ");
|
902
|
+
fprintf(stderr,
|
903
|
+
"%d more child contexts containing %zu total in %zu blocks; %zu free (%zu chunks); %zu used\n",
|
904
|
+
ichild,
|
905
|
+
local_totals.totalspace,
|
906
|
+
local_totals.nblocks,
|
907
|
+
local_totals.freespace,
|
908
|
+
local_totals.freechunks,
|
909
|
+
local_totals.totalspace - local_totals.freespace);
|
910
|
+
}
|
911
|
+
else
|
912
|
+
ereport(LOG_SERVER_ONLY,
|
913
|
+
(errhidestmt(true),
|
914
|
+
errhidecontext(true),
|
915
|
+
errmsg_internal("level: %d; %d more child contexts containing %zu total in %zu blocks; %zu free (%zu chunks); %zu used",
|
916
|
+
level,
|
917
|
+
ichild,
|
918
|
+
local_totals.totalspace,
|
919
|
+
local_totals.nblocks,
|
920
|
+
local_totals.freespace,
|
921
|
+
local_totals.freechunks,
|
922
|
+
local_totals.totalspace - local_totals.freespace)));
|
923
|
+
|
603
924
|
if (totals)
|
604
925
|
{
|
605
926
|
totals->nblocks += local_totals.nblocks;
|
@@ -691,7 +1012,7 @@ MemoryContextStatsPrint(MemoryContext context, void *passthru,
|
|
691
1012
|
|
692
1013
|
/*
|
693
1014
|
* MemoryContextCheck
|
694
|
-
* Check all chunks in the named context.
|
1015
|
+
* Check all chunks in the named context and its children.
|
695
1016
|
*
|
696
1017
|
* This is just a debugging utility, so it's not fancy.
|
697
1018
|
*/
|
@@ -699,19 +1020,6 @@ MemoryContextStatsPrint(MemoryContext context, void *passthru,
|
|
699
1020
|
|
700
1021
|
#endif
|
701
1022
|
|
702
|
-
/*
|
703
|
-
* MemoryContextContains
|
704
|
-
* Detect whether an allocated chunk of memory belongs to a given
|
705
|
-
* context or not.
|
706
|
-
*
|
707
|
-
* Caution: this test is reliable as long as 'pointer' does point to
|
708
|
-
* a chunk of memory allocated from *some* context. If 'pointer' points
|
709
|
-
* at memory obtained in some other way, there is a small chance of a
|
710
|
-
* false-positive result, since the bits right before it might look like
|
711
|
-
* a valid chunk header by chance.
|
712
|
-
*/
|
713
|
-
|
714
|
-
|
715
1023
|
/*
|
716
1024
|
* MemoryContextCreate
|
717
1025
|
* Context-type-independent part of context creation.
|
@@ -737,7 +1045,7 @@ MemoryContextStatsPrint(MemoryContext context, void *passthru,
|
|
737
1045
|
*
|
738
1046
|
* node: the as-yet-uninitialized common part of the context header node.
|
739
1047
|
* tag: NodeTag code identifying the memory context type.
|
740
|
-
*
|
1048
|
+
* method_id: MemoryContextMethodID of the context-type being created.
|
741
1049
|
* parent: parent context, or NULL if this will be a top-level context.
|
742
1050
|
* name: name of context (must be statically allocated).
|
743
1051
|
*
|
@@ -747,7 +1055,7 @@ MemoryContextStatsPrint(MemoryContext context, void *passthru,
|
|
747
1055
|
void
|
748
1056
|
MemoryContextCreate(MemoryContext node,
|
749
1057
|
NodeTag tag,
|
750
|
-
|
1058
|
+
MemoryContextMethodID method_id,
|
751
1059
|
MemoryContext parent,
|
752
1060
|
const char *name)
|
753
1061
|
{
|
@@ -757,7 +1065,7 @@ MemoryContextCreate(MemoryContext node,
|
|
757
1065
|
/* Initialize all standard fields of memory context header */
|
758
1066
|
node->type = tag;
|
759
1067
|
node->isReset = true;
|
760
|
-
node->methods =
|
1068
|
+
node->methods = &mcxt_methods[method_id];
|
761
1069
|
node->parent = parent;
|
762
1070
|
node->firstchild = NULL;
|
763
1071
|
node->mem_allocated = 0;
|
@@ -786,120 +1094,93 @@ MemoryContextCreate(MemoryContext node,
|
|
786
1094
|
}
|
787
1095
|
|
788
1096
|
/*
|
789
|
-
*
|
790
|
-
*
|
791
|
-
*
|
792
|
-
*
|
793
|
-
* 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'.
|
794
1101
|
*/
|
795
1102
|
void *
|
796
|
-
|
1103
|
+
MemoryContextAllocationFailure(MemoryContext context, Size size, int flags)
|
797
1104
|
{
|
798
|
-
|
799
|
-
|
800
|
-
AssertArg(MemoryContextIsValid(context));
|
801
|
-
AssertNotInCriticalSection(context);
|
802
|
-
|
803
|
-
if (!AllocSizeIsValid(size))
|
804
|
-
elog(ERROR, "invalid memory alloc request size %zu", size);
|
805
|
-
|
806
|
-
context->isReset = false;
|
807
|
-
|
808
|
-
ret = context->methods->alloc(context, size);
|
809
|
-
if (unlikely(ret == NULL))
|
1105
|
+
if ((flags & MCXT_ALLOC_NO_OOM) == 0)
|
810
1106
|
{
|
811
1107
|
MemoryContextStats(TopMemoryContext);
|
812
|
-
|
813
|
-
/*
|
814
|
-
* Here, and elsewhere in this module, we show the target context's
|
815
|
-
* "name" but not its "ident" (if any) in user-visible error messages.
|
816
|
-
* The "ident" string might contain security-sensitive data, such as
|
817
|
-
* values in SQL commands.
|
818
|
-
*/
|
819
1108
|
ereport(ERROR,
|
820
1109
|
(errcode(ERRCODE_OUT_OF_MEMORY),
|
821
1110
|
errmsg("out of memory"),
|
822
1111
|
errdetail("Failed on request of size %zu in memory context \"%s\".",
|
823
1112
|
size, context->name)));
|
824
1113
|
}
|
1114
|
+
return NULL;
|
1115
|
+
}
|
825
1116
|
|
826
|
-
|
827
|
-
|
828
|
-
|
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);
|
829
1126
|
}
|
830
1127
|
|
831
1128
|
/*
|
832
|
-
*
|
833
|
-
*
|
1129
|
+
* MemoryContextAlloc
|
1130
|
+
* Allocate space within the specified context.
|
834
1131
|
*
|
835
|
-
*
|
836
|
-
*
|
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.
|
837
1134
|
*/
|
838
1135
|
void *
|
839
|
-
|
1136
|
+
MemoryContextAlloc(MemoryContext context, Size size)
|
840
1137
|
{
|
841
1138
|
void *ret;
|
842
1139
|
|
843
|
-
|
1140
|
+
Assert(MemoryContextIsValid(context));
|
844
1141
|
AssertNotInCriticalSection(context);
|
845
1142
|
|
846
|
-
if (!AllocSizeIsValid(size))
|
847
|
-
elog(ERROR, "invalid memory alloc request size %zu", size);
|
848
|
-
|
849
1143
|
context->isReset = false;
|
850
1144
|
|
851
|
-
|
852
|
-
|
853
|
-
|
854
|
-
|
855
|
-
|
856
|
-
|
857
|
-
|
858
|
-
|
859
|
-
|
860
|
-
|
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);
|
861
1156
|
|
862
1157
|
VALGRIND_MEMPOOL_ALLOC(context, ret, size);
|
863
1158
|
|
864
|
-
MemSetAligned(ret, 0, size);
|
865
|
-
|
866
1159
|
return ret;
|
867
1160
|
}
|
868
1161
|
|
869
1162
|
/*
|
870
|
-
*
|
871
|
-
*
|
1163
|
+
* MemoryContextAllocZero
|
1164
|
+
* Like MemoryContextAlloc, but clears allocated memory
|
872
1165
|
*
|
873
|
-
*
|
874
|
-
* 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.
|
875
1168
|
*/
|
876
1169
|
void *
|
877
|
-
|
1170
|
+
MemoryContextAllocZero(MemoryContext context, Size size)
|
878
1171
|
{
|
879
1172
|
void *ret;
|
880
1173
|
|
881
|
-
|
1174
|
+
Assert(MemoryContextIsValid(context));
|
882
1175
|
AssertNotInCriticalSection(context);
|
883
1176
|
|
884
|
-
if (!AllocSizeIsValid(size))
|
885
|
-
elog(ERROR, "invalid memory alloc request size %zu", size);
|
886
|
-
|
887
1177
|
context->isReset = false;
|
888
1178
|
|
889
|
-
ret = context->methods->alloc(context, size);
|
890
|
-
if (unlikely(ret == NULL))
|
891
|
-
{
|
892
|
-
MemoryContextStats(TopMemoryContext);
|
893
|
-
ereport(ERROR,
|
894
|
-
(errcode(ERRCODE_OUT_OF_MEMORY),
|
895
|
-
errmsg("out of memory"),
|
896
|
-
errdetail("Failed on request of size %zu in memory context \"%s\".",
|
897
|
-
size, context->name)));
|
898
|
-
}
|
1179
|
+
ret = context->methods->alloc(context, size, 0);
|
899
1180
|
|
900
1181
|
VALGRIND_MEMPOOL_ALLOC(context, ret, size);
|
901
1182
|
|
902
|
-
|
1183
|
+
MemSetAligned(ret, 0, size);
|
903
1184
|
|
904
1185
|
return ret;
|
905
1186
|
}
|
@@ -913,29 +1194,18 @@ MemoryContextAllocExtended(MemoryContext context, Size size, int flags)
|
|
913
1194
|
{
|
914
1195
|
void *ret;
|
915
1196
|
|
916
|
-
|
1197
|
+
Assert(MemoryContextIsValid(context));
|
917
1198
|
AssertNotInCriticalSection(context);
|
918
1199
|
|
919
|
-
if (((flags & MCXT_ALLOC_HUGE) != 0
|
920
|
-
|
1200
|
+
if (!((flags & MCXT_ALLOC_HUGE) != 0 ? AllocHugeSizeIsValid(size) :
|
1201
|
+
AllocSizeIsValid(size)))
|
921
1202
|
elog(ERROR, "invalid memory alloc request size %zu", size);
|
922
1203
|
|
923
1204
|
context->isReset = false;
|
924
1205
|
|
925
|
-
ret = context->methods->alloc(context, size);
|
1206
|
+
ret = context->methods->alloc(context, size, flags);
|
926
1207
|
if (unlikely(ret == NULL))
|
927
|
-
{
|
928
|
-
if ((flags & MCXT_ALLOC_NO_OOM) == 0)
|
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
|
-
}
|
937
1208
|
return NULL;
|
938
|
-
}
|
939
1209
|
|
940
1210
|
VALGRIND_MEMPOOL_ALLOC(context, ret, size);
|
941
1211
|
|
@@ -973,25 +1243,24 @@ palloc(Size size)
|
|
973
1243
|
void *ret;
|
974
1244
|
MemoryContext context = CurrentMemoryContext;
|
975
1245
|
|
976
|
-
|
1246
|
+
Assert(MemoryContextIsValid(context));
|
977
1247
|
AssertNotInCriticalSection(context);
|
978
1248
|
|
979
|
-
if (!AllocSizeIsValid(size))
|
980
|
-
elog(ERROR, "invalid memory alloc request size %zu", size);
|
981
|
-
|
982
1249
|
context->isReset = false;
|
983
1250
|
|
984
|
-
|
985
|
-
|
986
|
-
|
987
|
-
|
988
|
-
|
989
|
-
|
990
|
-
|
991
|
-
|
992
|
-
|
993
|
-
|
994
|
-
|
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);
|
995
1264
|
VALGRIND_MEMPOOL_ALLOC(context, ret, size);
|
996
1265
|
|
997
1266
|
return ret;
|
@@ -1004,24 +1273,12 @@ palloc0(Size size)
|
|
1004
1273
|
void *ret;
|
1005
1274
|
MemoryContext context = CurrentMemoryContext;
|
1006
1275
|
|
1007
|
-
|
1276
|
+
Assert(MemoryContextIsValid(context));
|
1008
1277
|
AssertNotInCriticalSection(context);
|
1009
1278
|
|
1010
|
-
if (!AllocSizeIsValid(size))
|
1011
|
-
elog(ERROR, "invalid memory alloc request size %zu", size);
|
1012
|
-
|
1013
1279
|
context->isReset = false;
|
1014
1280
|
|
1015
|
-
ret = context->methods->alloc(context, size);
|
1016
|
-
if (unlikely(ret == NULL))
|
1017
|
-
{
|
1018
|
-
MemoryContextStats(TopMemoryContext);
|
1019
|
-
ereport(ERROR,
|
1020
|
-
(errcode(ERRCODE_OUT_OF_MEMORY),
|
1021
|
-
errmsg("out of memory"),
|
1022
|
-
errdetail("Failed on request of size %zu in memory context \"%s\".",
|
1023
|
-
size, context->name)));
|
1024
|
-
}
|
1281
|
+
ret = context->methods->alloc(context, size, 0);
|
1025
1282
|
|
1026
1283
|
VALGRIND_MEMPOOL_ALLOC(context, ret, size);
|
1027
1284
|
|
@@ -1032,6 +1289,125 @@ palloc0(Size size)
|
|
1032
1289
|
|
1033
1290
|
|
1034
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
|
+
|
1035
1411
|
/*
|
1036
1412
|
* pfree
|
1037
1413
|
* Release an allocated chunk.
|
@@ -1039,10 +1415,17 @@ palloc0(Size size)
|
|
1039
1415
|
void
|
1040
1416
|
pfree(void *pointer)
|
1041
1417
|
{
|
1418
|
+
#ifdef USE_VALGRIND
|
1419
|
+
MemoryContextMethodID method = GetMemoryChunkMethodID(pointer);
|
1042
1420
|
MemoryContext context = GetMemoryChunkContext(pointer);
|
1421
|
+
#endif
|
1422
|
+
|
1423
|
+
MCXT_METHOD(pointer, free_p) (pointer);
|
1043
1424
|
|
1044
|
-
|
1045
|
-
|
1425
|
+
#ifdef USE_VALGRIND
|
1426
|
+
if (method != MCTX_ALIGNED_REDIRECT_ID)
|
1427
|
+
VALGRIND_MEMPOOL_FREE(context, pointer);
|
1428
|
+
#endif
|
1046
1429
|
}
|
1047
1430
|
|
1048
1431
|
/*
|
@@ -1052,33 +1435,54 @@ pfree(void *pointer)
|
|
1052
1435
|
void *
|
1053
1436
|
repalloc(void *pointer, Size size)
|
1054
1437
|
{
|
1438
|
+
#ifdef USE_VALGRIND
|
1439
|
+
MemoryContextMethodID method = GetMemoryChunkMethodID(pointer);
|
1440
|
+
#endif
|
1441
|
+
#if defined(USE_ASSERT_CHECKING) || defined(USE_VALGRIND)
|
1055
1442
|
MemoryContext context = GetMemoryChunkContext(pointer);
|
1443
|
+
#endif
|
1056
1444
|
void *ret;
|
1057
1445
|
|
1058
|
-
if (!AllocSizeIsValid(size))
|
1059
|
-
elog(ERROR, "invalid memory alloc request size %zu", size);
|
1060
|
-
|
1061
1446
|
AssertNotInCriticalSection(context);
|
1062
1447
|
|
1063
1448
|
/* isReset must be false already */
|
1064
1449
|
Assert(!context->isReset);
|
1065
1450
|
|
1066
|
-
|
1067
|
-
|
1068
|
-
|
1069
|
-
|
1070
|
-
|
1071
|
-
|
1072
|
-
|
1073
|
-
|
1074
|
-
|
1075
|
-
|
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);
|
1076
1462
|
|
1077
|
-
|
1463
|
+
#ifdef USE_VALGRIND
|
1464
|
+
if (method != MCTX_ALIGNED_REDIRECT_ID)
|
1465
|
+
VALGRIND_MEMPOOL_CHANGE(context, pointer, ret, size);
|
1466
|
+
#endif
|
1078
1467
|
|
1079
1468
|
return ret;
|
1080
1469
|
}
|
1081
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
|
+
|
1082
1486
|
/*
|
1083
1487
|
* MemoryContextAllocHuge
|
1084
1488
|
* Allocate (possibly-expansive) space within the specified context.
|