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
@@ -0,0 +1,1115 @@
|
|
1
|
+
/*--------------------------------------------------------------------
|
2
|
+
* Symbols referenced in this file:
|
3
|
+
* - GenerationAlloc
|
4
|
+
* - GenerationAllocLarge
|
5
|
+
* - GenerationBlockFreeBytes
|
6
|
+
* - GenerationAllocChunkFromBlock
|
7
|
+
* - GenerationAllocFromNewBlock
|
8
|
+
* - GenerationBlockInit
|
9
|
+
* - GenerationFree
|
10
|
+
* - GenerationBlockMarkEmpty
|
11
|
+
* - GenerationBlockFree
|
12
|
+
* - GenerationRealloc
|
13
|
+
* - GenerationReset
|
14
|
+
* - GenerationDelete
|
15
|
+
* - GenerationGetChunkContext
|
16
|
+
* - GenerationGetChunkSpace
|
17
|
+
* - GenerationIsEmpty
|
18
|
+
* - GenerationStats
|
19
|
+
* - GenerationCheck
|
20
|
+
*--------------------------------------------------------------------
|
21
|
+
*/
|
22
|
+
|
23
|
+
/*-------------------------------------------------------------------------
|
24
|
+
*
|
25
|
+
* generation.c
|
26
|
+
* Generational allocator definitions.
|
27
|
+
*
|
28
|
+
* Generation is a custom MemoryContext implementation designed for cases of
|
29
|
+
* chunks with similar lifespan.
|
30
|
+
*
|
31
|
+
* Portions Copyright (c) 2017-2024, PostgreSQL Global Development Group
|
32
|
+
*
|
33
|
+
* IDENTIFICATION
|
34
|
+
* src/backend/utils/mmgr/generation.c
|
35
|
+
*
|
36
|
+
*
|
37
|
+
* This memory context is based on the assumption that the chunks are freed
|
38
|
+
* roughly in the same order as they were allocated (FIFO), or in groups with
|
39
|
+
* similar lifespan (generations - hence the name of the context). This is
|
40
|
+
* typical for various queue-like use cases, i.e. when tuples are constructed,
|
41
|
+
* processed and then thrown away.
|
42
|
+
*
|
43
|
+
* The memory context uses a very simple approach to free space management.
|
44
|
+
* Instead of a complex global freelist, each block tracks a number
|
45
|
+
* of allocated and freed chunks. The block is classed as empty when the
|
46
|
+
* number of free chunks is equal to the number of allocated chunks. When
|
47
|
+
* this occurs, instead of freeing the block, we try to "recycle" it, i.e.
|
48
|
+
* reuse it for new allocations. This is done by setting the block in the
|
49
|
+
* context's 'freeblock' field. If the freeblock field is already occupied
|
50
|
+
* by another free block we simply return the newly empty block to malloc.
|
51
|
+
*
|
52
|
+
* This approach to free blocks requires fewer malloc/free calls for truly
|
53
|
+
* first allocated, first free'd allocation patterns.
|
54
|
+
*
|
55
|
+
*-------------------------------------------------------------------------
|
56
|
+
*/
|
57
|
+
|
58
|
+
#include "postgres.h"
|
59
|
+
|
60
|
+
#include "lib/ilist.h"
|
61
|
+
#include "port/pg_bitutils.h"
|
62
|
+
#include "utils/memdebug.h"
|
63
|
+
#include "utils/memutils.h"
|
64
|
+
#include "utils/memutils_internal.h"
|
65
|
+
#include "utils/memutils_memorychunk.h"
|
66
|
+
|
67
|
+
|
68
|
+
#define Generation_BLOCKHDRSZ MAXALIGN(sizeof(GenerationBlock))
|
69
|
+
#define Generation_CHUNKHDRSZ sizeof(MemoryChunk)
|
70
|
+
|
71
|
+
#define Generation_CHUNK_FRACTION 8
|
72
|
+
|
73
|
+
typedef struct GenerationBlock GenerationBlock; /* forward reference */
|
74
|
+
|
75
|
+
typedef void *GenerationPointer;
|
76
|
+
|
77
|
+
/*
|
78
|
+
* GenerationContext is a simple memory context not reusing allocated chunks,
|
79
|
+
* and freeing blocks once all chunks are freed.
|
80
|
+
*/
|
81
|
+
typedef struct GenerationContext
|
82
|
+
{
|
83
|
+
MemoryContextData header; /* Standard memory-context fields */
|
84
|
+
|
85
|
+
/* Generational context parameters */
|
86
|
+
uint32 initBlockSize; /* initial block size */
|
87
|
+
uint32 maxBlockSize; /* maximum block size */
|
88
|
+
uint32 nextBlockSize; /* next block size to allocate */
|
89
|
+
uint32 allocChunkLimit; /* effective chunk size limit */
|
90
|
+
|
91
|
+
GenerationBlock *block; /* current (most recently allocated) block */
|
92
|
+
GenerationBlock *freeblock; /* pointer to an empty block that's being
|
93
|
+
* recycled, or NULL if there's no such block. */
|
94
|
+
dlist_head blocks; /* list of blocks */
|
95
|
+
} GenerationContext;
|
96
|
+
|
97
|
+
/*
|
98
|
+
* GenerationBlock
|
99
|
+
* GenerationBlock is the unit of memory that is obtained by generation.c
|
100
|
+
* from malloc(). It contains zero or more MemoryChunks, which are the
|
101
|
+
* units requested by palloc() and freed by pfree(). MemoryChunks cannot
|
102
|
+
* be returned to malloc() individually, instead pfree() updates the free
|
103
|
+
* counter of the block and when all chunks in a block are free the whole
|
104
|
+
* block can be returned to malloc().
|
105
|
+
*
|
106
|
+
* GenerationBlock is the header data for a block --- the usable space
|
107
|
+
* within the block begins at the next alignment boundary.
|
108
|
+
*/
|
109
|
+
struct GenerationBlock
|
110
|
+
{
|
111
|
+
dlist_node node; /* doubly-linked list of blocks */
|
112
|
+
GenerationContext *context; /* pointer back to the owning context */
|
113
|
+
Size blksize; /* allocated size of this block */
|
114
|
+
int nchunks; /* number of chunks in the block */
|
115
|
+
int nfree; /* number of free chunks */
|
116
|
+
char *freeptr; /* start of free space in this block */
|
117
|
+
char *endptr; /* end of space in this block */
|
118
|
+
};
|
119
|
+
|
120
|
+
/*
|
121
|
+
* GenerationIsValid
|
122
|
+
* True iff set is valid generation set.
|
123
|
+
*/
|
124
|
+
#define GenerationIsValid(set) \
|
125
|
+
(PointerIsValid(set) && IsA(set, GenerationContext))
|
126
|
+
|
127
|
+
/*
|
128
|
+
* GenerationBlockIsValid
|
129
|
+
* True iff block is valid block of generation set.
|
130
|
+
*/
|
131
|
+
#define GenerationBlockIsValid(block) \
|
132
|
+
(PointerIsValid(block) && GenerationIsValid((block)->context))
|
133
|
+
|
134
|
+
/*
|
135
|
+
* GenerationBlockIsEmpty
|
136
|
+
* True iff block contains no chunks
|
137
|
+
*/
|
138
|
+
#define GenerationBlockIsEmpty(b) ((b)->nchunks == 0)
|
139
|
+
|
140
|
+
/*
|
141
|
+
* We always store external chunks on a dedicated block. This makes fetching
|
142
|
+
* the block from an external chunk easy since it's always the first and only
|
143
|
+
* chunk on the block.
|
144
|
+
*/
|
145
|
+
#define ExternalChunkGetBlock(chunk) \
|
146
|
+
(GenerationBlock *) ((char *) chunk - Generation_BLOCKHDRSZ)
|
147
|
+
|
148
|
+
/* Obtain the keeper block for a generation context */
|
149
|
+
#define KeeperBlock(set) \
|
150
|
+
((GenerationBlock *) (((char *) set) + \
|
151
|
+
MAXALIGN(sizeof(GenerationContext))))
|
152
|
+
|
153
|
+
/* Check if the block is the keeper block of the given generation context */
|
154
|
+
#define IsKeeperBlock(set, block) ((block) == (KeeperBlock(set)))
|
155
|
+
|
156
|
+
/* Inlined helper functions */
|
157
|
+
static inline void GenerationBlockInit(GenerationContext *context,
|
158
|
+
GenerationBlock *block,
|
159
|
+
Size blksize);
|
160
|
+
static inline void GenerationBlockMarkEmpty(GenerationBlock *block);
|
161
|
+
static inline Size GenerationBlockFreeBytes(GenerationBlock *block);
|
162
|
+
static inline void GenerationBlockFree(GenerationContext *set,
|
163
|
+
GenerationBlock *block);
|
164
|
+
|
165
|
+
|
166
|
+
/*
|
167
|
+
* Public routines
|
168
|
+
*/
|
169
|
+
|
170
|
+
|
171
|
+
/*
|
172
|
+
* GenerationContextCreate
|
173
|
+
* Create a new Generation context.
|
174
|
+
*
|
175
|
+
* parent: parent context, or NULL if top-level context
|
176
|
+
* name: name of context (must be statically allocated)
|
177
|
+
* minContextSize: minimum context size
|
178
|
+
* initBlockSize: initial allocation block size
|
179
|
+
* maxBlockSize: maximum allocation block size
|
180
|
+
*/
|
181
|
+
|
182
|
+
|
183
|
+
/*
|
184
|
+
* GenerationReset
|
185
|
+
* Frees all memory which is allocated in the given set.
|
186
|
+
*
|
187
|
+
* The initial "keeper" block (which shares a malloc chunk with the context
|
188
|
+
* header) is not given back to the operating system though. In this way, we
|
189
|
+
* don't thrash malloc() when a context is repeatedly reset after small
|
190
|
+
* allocations.
|
191
|
+
*/
|
192
|
+
void
|
193
|
+
GenerationReset(MemoryContext context)
|
194
|
+
{
|
195
|
+
GenerationContext *set = (GenerationContext *) context;
|
196
|
+
dlist_mutable_iter miter;
|
197
|
+
|
198
|
+
Assert(GenerationIsValid(set));
|
199
|
+
|
200
|
+
#ifdef MEMORY_CONTEXT_CHECKING
|
201
|
+
/* Check for corruption and leaks before freeing */
|
202
|
+
GenerationCheck(context);
|
203
|
+
#endif
|
204
|
+
|
205
|
+
/*
|
206
|
+
* NULLify the free block pointer. We must do this before calling
|
207
|
+
* GenerationBlockFree as that function never expects to free the
|
208
|
+
* freeblock.
|
209
|
+
*/
|
210
|
+
set->freeblock = NULL;
|
211
|
+
|
212
|
+
dlist_foreach_modify(miter, &set->blocks)
|
213
|
+
{
|
214
|
+
GenerationBlock *block = dlist_container(GenerationBlock, node, miter.cur);
|
215
|
+
|
216
|
+
if (IsKeeperBlock(set, block))
|
217
|
+
GenerationBlockMarkEmpty(block);
|
218
|
+
else
|
219
|
+
GenerationBlockFree(set, block);
|
220
|
+
}
|
221
|
+
|
222
|
+
/* set it so new allocations to make use of the keeper block */
|
223
|
+
set->block = KeeperBlock(set);
|
224
|
+
|
225
|
+
/* Reset block size allocation sequence, too */
|
226
|
+
set->nextBlockSize = set->initBlockSize;
|
227
|
+
|
228
|
+
/* Ensure there is only 1 item in the dlist */
|
229
|
+
Assert(!dlist_is_empty(&set->blocks));
|
230
|
+
Assert(!dlist_has_next(&set->blocks, dlist_head_node(&set->blocks)));
|
231
|
+
}
|
232
|
+
|
233
|
+
/*
|
234
|
+
* GenerationDelete
|
235
|
+
* Free all memory which is allocated in the given context.
|
236
|
+
*/
|
237
|
+
void
|
238
|
+
GenerationDelete(MemoryContext context)
|
239
|
+
{
|
240
|
+
/* Reset to release all releasable GenerationBlocks */
|
241
|
+
GenerationReset(context);
|
242
|
+
/* And free the context header and keeper block */
|
243
|
+
free(context);
|
244
|
+
}
|
245
|
+
|
246
|
+
/*
|
247
|
+
* Helper for GenerationAlloc() that allocates an entire block for the chunk.
|
248
|
+
*
|
249
|
+
* GenerationAlloc()'s comment explains why this is separate.
|
250
|
+
*/
|
251
|
+
pg_noinline
|
252
|
+
static void *
|
253
|
+
GenerationAllocLarge(MemoryContext context, Size size, int flags)
|
254
|
+
{
|
255
|
+
GenerationContext *set = (GenerationContext *) context;
|
256
|
+
GenerationBlock *block;
|
257
|
+
MemoryChunk *chunk;
|
258
|
+
Size chunk_size;
|
259
|
+
Size required_size;
|
260
|
+
Size blksize;
|
261
|
+
|
262
|
+
/* validate 'size' is within the limits for the given 'flags' */
|
263
|
+
MemoryContextCheckSize(context, size, flags);
|
264
|
+
|
265
|
+
#ifdef MEMORY_CONTEXT_CHECKING
|
266
|
+
/* ensure there's always space for the sentinel byte */
|
267
|
+
chunk_size = MAXALIGN(size + 1);
|
268
|
+
#else
|
269
|
+
chunk_size = MAXALIGN(size);
|
270
|
+
#endif
|
271
|
+
required_size = chunk_size + Generation_CHUNKHDRSZ;
|
272
|
+
blksize = required_size + Generation_BLOCKHDRSZ;
|
273
|
+
|
274
|
+
block = (GenerationBlock *) malloc(blksize);
|
275
|
+
if (block == NULL)
|
276
|
+
return MemoryContextAllocationFailure(context, size, flags);
|
277
|
+
|
278
|
+
context->mem_allocated += blksize;
|
279
|
+
|
280
|
+
/* block with a single (used) chunk */
|
281
|
+
block->context = set;
|
282
|
+
block->blksize = blksize;
|
283
|
+
block->nchunks = 1;
|
284
|
+
block->nfree = 0;
|
285
|
+
|
286
|
+
/* the block is completely full */
|
287
|
+
block->freeptr = block->endptr = ((char *) block) + blksize;
|
288
|
+
|
289
|
+
chunk = (MemoryChunk *) (((char *) block) + Generation_BLOCKHDRSZ);
|
290
|
+
|
291
|
+
/* mark the MemoryChunk as externally managed */
|
292
|
+
MemoryChunkSetHdrMaskExternal(chunk, MCTX_GENERATION_ID);
|
293
|
+
|
294
|
+
#ifdef MEMORY_CONTEXT_CHECKING
|
295
|
+
chunk->requested_size = size;
|
296
|
+
/* set mark to catch clobber of "unused" space */
|
297
|
+
Assert(size < chunk_size);
|
298
|
+
set_sentinel(MemoryChunkGetPointer(chunk), size);
|
299
|
+
#endif
|
300
|
+
#ifdef RANDOMIZE_ALLOCATED_MEMORY
|
301
|
+
/* fill the allocated space with junk */
|
302
|
+
randomize_mem((char *) MemoryChunkGetPointer(chunk), size);
|
303
|
+
#endif
|
304
|
+
|
305
|
+
/* add the block to the list of allocated blocks */
|
306
|
+
dlist_push_head(&set->blocks, &block->node);
|
307
|
+
|
308
|
+
/* Ensure any padding bytes are marked NOACCESS. */
|
309
|
+
VALGRIND_MAKE_MEM_NOACCESS((char *) MemoryChunkGetPointer(chunk) + size,
|
310
|
+
chunk_size - size);
|
311
|
+
|
312
|
+
/* Disallow access to the chunk header. */
|
313
|
+
VALGRIND_MAKE_MEM_NOACCESS(chunk, Generation_CHUNKHDRSZ);
|
314
|
+
|
315
|
+
return MemoryChunkGetPointer(chunk);
|
316
|
+
}
|
317
|
+
|
318
|
+
/*
|
319
|
+
* Small helper for allocating a new chunk from a chunk, to avoid duplicating
|
320
|
+
* the code between GenerationAlloc() and GenerationAllocFromNewBlock().
|
321
|
+
*/
|
322
|
+
static inline void *
|
323
|
+
GenerationAllocChunkFromBlock(MemoryContext context, GenerationBlock *block,
|
324
|
+
Size size, Size chunk_size)
|
325
|
+
{
|
326
|
+
MemoryChunk *chunk = (MemoryChunk *) (block->freeptr);
|
327
|
+
|
328
|
+
/* validate we've been given a block with enough free space */
|
329
|
+
Assert(block != NULL);
|
330
|
+
Assert((block->endptr - block->freeptr) >=
|
331
|
+
Generation_CHUNKHDRSZ + chunk_size);
|
332
|
+
|
333
|
+
/* Prepare to initialize the chunk header. */
|
334
|
+
VALGRIND_MAKE_MEM_UNDEFINED(chunk, Generation_CHUNKHDRSZ);
|
335
|
+
|
336
|
+
block->nchunks += 1;
|
337
|
+
block->freeptr += (Generation_CHUNKHDRSZ + chunk_size);
|
338
|
+
|
339
|
+
Assert(block->freeptr <= block->endptr);
|
340
|
+
|
341
|
+
MemoryChunkSetHdrMask(chunk, block, chunk_size, MCTX_GENERATION_ID);
|
342
|
+
#ifdef MEMORY_CONTEXT_CHECKING
|
343
|
+
chunk->requested_size = size;
|
344
|
+
/* set mark to catch clobber of "unused" space */
|
345
|
+
Assert(size < chunk_size);
|
346
|
+
set_sentinel(MemoryChunkGetPointer(chunk), size);
|
347
|
+
#endif
|
348
|
+
#ifdef RANDOMIZE_ALLOCATED_MEMORY
|
349
|
+
/* fill the allocated space with junk */
|
350
|
+
randomize_mem((char *) MemoryChunkGetPointer(chunk), size);
|
351
|
+
#endif
|
352
|
+
|
353
|
+
/* Ensure any padding bytes are marked NOACCESS. */
|
354
|
+
VALGRIND_MAKE_MEM_NOACCESS((char *) MemoryChunkGetPointer(chunk) + size,
|
355
|
+
chunk_size - size);
|
356
|
+
|
357
|
+
/* Disallow access to the chunk header. */
|
358
|
+
VALGRIND_MAKE_MEM_NOACCESS(chunk, Generation_CHUNKHDRSZ);
|
359
|
+
|
360
|
+
return MemoryChunkGetPointer(chunk);
|
361
|
+
}
|
362
|
+
|
363
|
+
/*
|
364
|
+
* Helper for GenerationAlloc() that allocates a new block and returns a chunk
|
365
|
+
* allocated from it.
|
366
|
+
*
|
367
|
+
* GenerationAlloc()'s comment explains why this is separate.
|
368
|
+
*/
|
369
|
+
pg_noinline
|
370
|
+
static void *
|
371
|
+
GenerationAllocFromNewBlock(MemoryContext context, Size size, int flags,
|
372
|
+
Size chunk_size)
|
373
|
+
{
|
374
|
+
GenerationContext *set = (GenerationContext *) context;
|
375
|
+
GenerationBlock *block;
|
376
|
+
Size blksize;
|
377
|
+
Size required_size;
|
378
|
+
|
379
|
+
/*
|
380
|
+
* The first such block has size initBlockSize, and we double the space in
|
381
|
+
* each succeeding block, but not more than maxBlockSize.
|
382
|
+
*/
|
383
|
+
blksize = set->nextBlockSize;
|
384
|
+
set->nextBlockSize <<= 1;
|
385
|
+
if (set->nextBlockSize > set->maxBlockSize)
|
386
|
+
set->nextBlockSize = set->maxBlockSize;
|
387
|
+
|
388
|
+
/* we'll need space for the chunk, chunk hdr and block hdr */
|
389
|
+
required_size = chunk_size + Generation_CHUNKHDRSZ + Generation_BLOCKHDRSZ;
|
390
|
+
|
391
|
+
/* round the size up to the next power of 2 */
|
392
|
+
if (blksize < required_size)
|
393
|
+
blksize = pg_nextpower2_size_t(required_size);
|
394
|
+
|
395
|
+
block = (GenerationBlock *) malloc(blksize);
|
396
|
+
|
397
|
+
if (block == NULL)
|
398
|
+
return MemoryContextAllocationFailure(context, size, flags);
|
399
|
+
|
400
|
+
context->mem_allocated += blksize;
|
401
|
+
|
402
|
+
/* initialize the new block */
|
403
|
+
GenerationBlockInit(set, block, blksize);
|
404
|
+
|
405
|
+
/* add it to the doubly-linked list of blocks */
|
406
|
+
dlist_push_head(&set->blocks, &block->node);
|
407
|
+
|
408
|
+
/* make this the current block */
|
409
|
+
set->block = block;
|
410
|
+
|
411
|
+
return GenerationAllocChunkFromBlock(context, block, size, chunk_size);
|
412
|
+
}
|
413
|
+
|
414
|
+
/*
|
415
|
+
* GenerationAlloc
|
416
|
+
* Returns a pointer to allocated memory of given size or raises an ERROR
|
417
|
+
* on allocation failure, or returns NULL when flags contains
|
418
|
+
* MCXT_ALLOC_NO_OOM.
|
419
|
+
*
|
420
|
+
* No request may exceed:
|
421
|
+
* MAXALIGN_DOWN(SIZE_MAX) - Generation_BLOCKHDRSZ - Generation_CHUNKHDRSZ
|
422
|
+
* All callers use a much-lower limit.
|
423
|
+
*
|
424
|
+
* Note: when using valgrind, it doesn't matter how the returned allocation
|
425
|
+
* is marked, as mcxt.c will set it to UNDEFINED. In some paths we will
|
426
|
+
* return space that is marked NOACCESS - GenerationRealloc has to beware!
|
427
|
+
*
|
428
|
+
* This function should only contain the most common code paths. Everything
|
429
|
+
* else should be in pg_noinline helper functions, thus avoiding the overhead
|
430
|
+
* of creating a stack frame for the common cases. Allocating memory is often
|
431
|
+
* a bottleneck in many workloads, so avoiding stack frame setup is
|
432
|
+
* worthwhile. Helper functions should always directly return the newly
|
433
|
+
* allocated memory so that we can just return that address directly as a tail
|
434
|
+
* call.
|
435
|
+
*/
|
436
|
+
void *
|
437
|
+
GenerationAlloc(MemoryContext context, Size size, int flags)
|
438
|
+
{
|
439
|
+
GenerationContext *set = (GenerationContext *) context;
|
440
|
+
GenerationBlock *block;
|
441
|
+
Size chunk_size;
|
442
|
+
Size required_size;
|
443
|
+
|
444
|
+
Assert(GenerationIsValid(set));
|
445
|
+
|
446
|
+
#ifdef MEMORY_CONTEXT_CHECKING
|
447
|
+
/* ensure there's always space for the sentinel byte */
|
448
|
+
chunk_size = MAXALIGN(size + 1);
|
449
|
+
#else
|
450
|
+
chunk_size = MAXALIGN(size);
|
451
|
+
#endif
|
452
|
+
|
453
|
+
/*
|
454
|
+
* If requested size exceeds maximum for chunks we hand the request off to
|
455
|
+
* GenerationAllocLarge().
|
456
|
+
*/
|
457
|
+
if (chunk_size > set->allocChunkLimit)
|
458
|
+
return GenerationAllocLarge(context, size, flags);
|
459
|
+
|
460
|
+
required_size = chunk_size + Generation_CHUNKHDRSZ;
|
461
|
+
|
462
|
+
/*
|
463
|
+
* Not an oversized chunk. We try to first make use of the current block,
|
464
|
+
* but if there's not enough space in it, instead of allocating a new
|
465
|
+
* block, we look to see if the empty freeblock has enough space. We
|
466
|
+
* don't try reusing the keeper block. If it's become empty we'll reuse
|
467
|
+
* that again only if the context is reset.
|
468
|
+
*
|
469
|
+
* We only try reusing the freeblock if we've no space for this allocation
|
470
|
+
* on the current block. When a freeblock exists, we'll switch to it once
|
471
|
+
* the first time we can't fit an allocation in the current block. We
|
472
|
+
* avoid ping-ponging between the two as we need to be careful not to
|
473
|
+
* fragment differently sized consecutive allocations between several
|
474
|
+
* blocks. Going between the two could cause fragmentation for FIFO
|
475
|
+
* workloads, which generation is meant to be good at.
|
476
|
+
*/
|
477
|
+
block = set->block;
|
478
|
+
|
479
|
+
if (unlikely(GenerationBlockFreeBytes(block) < required_size))
|
480
|
+
{
|
481
|
+
GenerationBlock *freeblock = set->freeblock;
|
482
|
+
|
483
|
+
/* freeblock, if set, must be empty */
|
484
|
+
Assert(freeblock == NULL || GenerationBlockIsEmpty(freeblock));
|
485
|
+
|
486
|
+
/* check if we have a freeblock and if it's big enough */
|
487
|
+
if (freeblock != NULL &&
|
488
|
+
GenerationBlockFreeBytes(freeblock) >= required_size)
|
489
|
+
{
|
490
|
+
/* make the freeblock the current block */
|
491
|
+
set->freeblock = NULL;
|
492
|
+
set->block = freeblock;
|
493
|
+
|
494
|
+
return GenerationAllocChunkFromBlock(context,
|
495
|
+
freeblock,
|
496
|
+
size,
|
497
|
+
chunk_size);
|
498
|
+
}
|
499
|
+
else
|
500
|
+
{
|
501
|
+
/*
|
502
|
+
* No freeblock, or it's not big enough for this allocation. Make
|
503
|
+
* a new block.
|
504
|
+
*/
|
505
|
+
return GenerationAllocFromNewBlock(context, size, flags, chunk_size);
|
506
|
+
}
|
507
|
+
}
|
508
|
+
|
509
|
+
/* The current block has space, so just allocate chunk there. */
|
510
|
+
return GenerationAllocChunkFromBlock(context, block, size, chunk_size);
|
511
|
+
}
|
512
|
+
|
513
|
+
/*
|
514
|
+
* GenerationBlockInit
|
515
|
+
* Initializes 'block' assuming 'blksize'. Does not update the context's
|
516
|
+
* mem_allocated field.
|
517
|
+
*/
|
518
|
+
static inline void
|
519
|
+
GenerationBlockInit(GenerationContext *context, GenerationBlock *block,
|
520
|
+
Size blksize)
|
521
|
+
{
|
522
|
+
block->context = context;
|
523
|
+
block->blksize = blksize;
|
524
|
+
block->nchunks = 0;
|
525
|
+
block->nfree = 0;
|
526
|
+
|
527
|
+
block->freeptr = ((char *) block) + Generation_BLOCKHDRSZ;
|
528
|
+
block->endptr = ((char *) block) + blksize;
|
529
|
+
|
530
|
+
/* Mark unallocated space NOACCESS. */
|
531
|
+
VALGRIND_MAKE_MEM_NOACCESS(block->freeptr,
|
532
|
+
blksize - Generation_BLOCKHDRSZ);
|
533
|
+
}
|
534
|
+
|
535
|
+
/*
|
536
|
+
* GenerationBlockMarkEmpty
|
537
|
+
* Set a block as empty. Does not free the block.
|
538
|
+
*/
|
539
|
+
static inline void
|
540
|
+
GenerationBlockMarkEmpty(GenerationBlock *block)
|
541
|
+
{
|
542
|
+
#if defined(USE_VALGRIND) || defined(CLOBBER_FREED_MEMORY)
|
543
|
+
char *datastart = ((char *) block) + Generation_BLOCKHDRSZ;
|
544
|
+
#endif
|
545
|
+
|
546
|
+
#ifdef CLOBBER_FREED_MEMORY
|
547
|
+
wipe_mem(datastart, block->freeptr - datastart);
|
548
|
+
#else
|
549
|
+
/* wipe_mem() would have done this */
|
550
|
+
VALGRIND_MAKE_MEM_NOACCESS(datastart, block->freeptr - datastart);
|
551
|
+
#endif
|
552
|
+
|
553
|
+
/* Reset the block, but don't return it to malloc */
|
554
|
+
block->nchunks = 0;
|
555
|
+
block->nfree = 0;
|
556
|
+
block->freeptr = ((char *) block) + Generation_BLOCKHDRSZ;
|
557
|
+
}
|
558
|
+
|
559
|
+
/*
|
560
|
+
* GenerationBlockFreeBytes
|
561
|
+
* Returns the number of bytes free in 'block'
|
562
|
+
*/
|
563
|
+
static inline Size
|
564
|
+
GenerationBlockFreeBytes(GenerationBlock *block)
|
565
|
+
{
|
566
|
+
return (block->endptr - block->freeptr);
|
567
|
+
}
|
568
|
+
|
569
|
+
/*
|
570
|
+
* GenerationBlockFree
|
571
|
+
* Remove 'block' from 'set' and release the memory consumed by it.
|
572
|
+
*/
|
573
|
+
static inline void
|
574
|
+
GenerationBlockFree(GenerationContext *set, GenerationBlock *block)
|
575
|
+
{
|
576
|
+
/* Make sure nobody tries to free the keeper block */
|
577
|
+
Assert(!IsKeeperBlock(set, block));
|
578
|
+
/* We shouldn't be freeing the freeblock either */
|
579
|
+
Assert(block != set->freeblock);
|
580
|
+
|
581
|
+
/* release the block from the list of blocks */
|
582
|
+
dlist_delete(&block->node);
|
583
|
+
|
584
|
+
((MemoryContext) set)->mem_allocated -= block->blksize;
|
585
|
+
|
586
|
+
#ifdef CLOBBER_FREED_MEMORY
|
587
|
+
wipe_mem(block, block->blksize);
|
588
|
+
#endif
|
589
|
+
|
590
|
+
free(block);
|
591
|
+
}
|
592
|
+
|
593
|
+
/*
|
594
|
+
* GenerationFree
|
595
|
+
* Update number of chunks in the block, and consider freeing the block
|
596
|
+
* if it's become empty.
|
597
|
+
*/
|
598
|
+
void
|
599
|
+
GenerationFree(void *pointer)
|
600
|
+
{
|
601
|
+
MemoryChunk *chunk = PointerGetMemoryChunk(pointer);
|
602
|
+
GenerationBlock *block;
|
603
|
+
GenerationContext *set;
|
604
|
+
#if (defined(MEMORY_CONTEXT_CHECKING) && defined(USE_ASSERT_CHECKING)) \
|
605
|
+
|| defined(CLOBBER_FREED_MEMORY)
|
606
|
+
Size chunksize;
|
607
|
+
#endif
|
608
|
+
|
609
|
+
/* Allow access to the chunk header. */
|
610
|
+
VALGRIND_MAKE_MEM_DEFINED(chunk, Generation_CHUNKHDRSZ);
|
611
|
+
|
612
|
+
if (MemoryChunkIsExternal(chunk))
|
613
|
+
{
|
614
|
+
block = ExternalChunkGetBlock(chunk);
|
615
|
+
|
616
|
+
/*
|
617
|
+
* Try to verify that we have a sane block pointer: the block header
|
618
|
+
* should reference a generation context.
|
619
|
+
*/
|
620
|
+
if (!GenerationBlockIsValid(block))
|
621
|
+
elog(ERROR, "could not find block containing chunk %p", chunk);
|
622
|
+
|
623
|
+
#if (defined(MEMORY_CONTEXT_CHECKING) && defined(USE_ASSERT_CHECKING)) \
|
624
|
+
|| defined(CLOBBER_FREED_MEMORY)
|
625
|
+
chunksize = block->endptr - (char *) pointer;
|
626
|
+
#endif
|
627
|
+
}
|
628
|
+
else
|
629
|
+
{
|
630
|
+
block = MemoryChunkGetBlock(chunk);
|
631
|
+
|
632
|
+
/*
|
633
|
+
* In this path, for speed reasons we just Assert that the referenced
|
634
|
+
* block is good. Future field experience may show that this Assert
|
635
|
+
* had better become a regular runtime test-and-elog check.
|
636
|
+
*/
|
637
|
+
Assert(GenerationBlockIsValid(block));
|
638
|
+
|
639
|
+
#if (defined(MEMORY_CONTEXT_CHECKING) && defined(USE_ASSERT_CHECKING)) \
|
640
|
+
|| defined(CLOBBER_FREED_MEMORY)
|
641
|
+
chunksize = MemoryChunkGetValue(chunk);
|
642
|
+
#endif
|
643
|
+
}
|
644
|
+
|
645
|
+
#ifdef MEMORY_CONTEXT_CHECKING
|
646
|
+
/* Test for someone scribbling on unused space in chunk */
|
647
|
+
Assert(chunk->requested_size < chunksize);
|
648
|
+
if (!sentinel_ok(pointer, chunk->requested_size))
|
649
|
+
elog(WARNING, "detected write past chunk end in %s %p",
|
650
|
+
((MemoryContext) block->context)->name, chunk);
|
651
|
+
#endif
|
652
|
+
|
653
|
+
#ifdef CLOBBER_FREED_MEMORY
|
654
|
+
wipe_mem(pointer, chunksize);
|
655
|
+
#endif
|
656
|
+
|
657
|
+
#ifdef MEMORY_CONTEXT_CHECKING
|
658
|
+
/* Reset requested_size to InvalidAllocSize in freed chunks */
|
659
|
+
chunk->requested_size = InvalidAllocSize;
|
660
|
+
#endif
|
661
|
+
|
662
|
+
block->nfree += 1;
|
663
|
+
|
664
|
+
Assert(block->nchunks > 0);
|
665
|
+
Assert(block->nfree <= block->nchunks);
|
666
|
+
Assert(block != block->context->freeblock);
|
667
|
+
|
668
|
+
/* If there are still allocated chunks in the block, we're done. */
|
669
|
+
if (likely(block->nfree < block->nchunks))
|
670
|
+
return;
|
671
|
+
|
672
|
+
set = block->context;
|
673
|
+
|
674
|
+
/*-----------------------
|
675
|
+
* The block this allocation was on has now become completely empty of
|
676
|
+
* chunks. In the general case, we can now return the memory for this
|
677
|
+
* block back to malloc. However, there are cases where we don't want to
|
678
|
+
* do that:
|
679
|
+
*
|
680
|
+
* 1) If it's the keeper block. This block was malloc'd in the same
|
681
|
+
* allocation as the context itself and can't be free'd without
|
682
|
+
* freeing the context.
|
683
|
+
* 2) If it's the current block. We could free this, but doing so would
|
684
|
+
* leave us nothing to set the current block to, so we just mark the
|
685
|
+
* block as empty so new allocations can reuse it again.
|
686
|
+
* 3) If we have no "freeblock" set, then we save a single block for
|
687
|
+
* future allocations to avoid having to malloc a new block again.
|
688
|
+
* This is useful for FIFO workloads as it avoids continual
|
689
|
+
* free/malloc cycles.
|
690
|
+
*/
|
691
|
+
if (IsKeeperBlock(set, block) || set->block == block)
|
692
|
+
GenerationBlockMarkEmpty(block); /* case 1 and 2 */
|
693
|
+
else if (set->freeblock == NULL)
|
694
|
+
{
|
695
|
+
/* case 3 */
|
696
|
+
GenerationBlockMarkEmpty(block);
|
697
|
+
set->freeblock = block;
|
698
|
+
}
|
699
|
+
else
|
700
|
+
GenerationBlockFree(set, block); /* Otherwise, free it */
|
701
|
+
}
|
702
|
+
|
703
|
+
/*
|
704
|
+
* GenerationRealloc
|
705
|
+
* When handling repalloc, we simply allocate a new chunk, copy the data
|
706
|
+
* and discard the old one. The only exception is when the new size fits
|
707
|
+
* into the old chunk - in that case we just update chunk header.
|
708
|
+
*/
|
709
|
+
void *
|
710
|
+
GenerationRealloc(void *pointer, Size size, int flags)
|
711
|
+
{
|
712
|
+
MemoryChunk *chunk = PointerGetMemoryChunk(pointer);
|
713
|
+
GenerationContext *set;
|
714
|
+
GenerationBlock *block;
|
715
|
+
GenerationPointer newPointer;
|
716
|
+
Size oldsize;
|
717
|
+
|
718
|
+
/* Allow access to the chunk header. */
|
719
|
+
VALGRIND_MAKE_MEM_DEFINED(chunk, Generation_CHUNKHDRSZ);
|
720
|
+
|
721
|
+
if (MemoryChunkIsExternal(chunk))
|
722
|
+
{
|
723
|
+
block = ExternalChunkGetBlock(chunk);
|
724
|
+
|
725
|
+
/*
|
726
|
+
* Try to verify that we have a sane block pointer: the block header
|
727
|
+
* should reference a generation context.
|
728
|
+
*/
|
729
|
+
if (!GenerationBlockIsValid(block))
|
730
|
+
elog(ERROR, "could not find block containing chunk %p", chunk);
|
731
|
+
|
732
|
+
oldsize = block->endptr - (char *) pointer;
|
733
|
+
}
|
734
|
+
else
|
735
|
+
{
|
736
|
+
block = MemoryChunkGetBlock(chunk);
|
737
|
+
|
738
|
+
/*
|
739
|
+
* In this path, for speed reasons we just Assert that the referenced
|
740
|
+
* block is good. Future field experience may show that this Assert
|
741
|
+
* had better become a regular runtime test-and-elog check.
|
742
|
+
*/
|
743
|
+
Assert(GenerationBlockIsValid(block));
|
744
|
+
|
745
|
+
oldsize = MemoryChunkGetValue(chunk);
|
746
|
+
}
|
747
|
+
|
748
|
+
set = block->context;
|
749
|
+
|
750
|
+
#ifdef MEMORY_CONTEXT_CHECKING
|
751
|
+
/* Test for someone scribbling on unused space in chunk */
|
752
|
+
Assert(chunk->requested_size < oldsize);
|
753
|
+
if (!sentinel_ok(pointer, chunk->requested_size))
|
754
|
+
elog(WARNING, "detected write past chunk end in %s %p",
|
755
|
+
((MemoryContext) set)->name, chunk);
|
756
|
+
#endif
|
757
|
+
|
758
|
+
/*
|
759
|
+
* Maybe the allocated area already big enough. (In particular, we always
|
760
|
+
* fall out here if the requested size is a decrease.)
|
761
|
+
*
|
762
|
+
* This memory context does not use power-of-2 chunk sizing and instead
|
763
|
+
* carves the chunks to be as small as possible, so most repalloc() calls
|
764
|
+
* will end up in the palloc/memcpy/pfree branch.
|
765
|
+
*
|
766
|
+
* XXX Perhaps we should annotate this condition with unlikely()?
|
767
|
+
*/
|
768
|
+
#ifdef MEMORY_CONTEXT_CHECKING
|
769
|
+
/* With MEMORY_CONTEXT_CHECKING, we need an extra byte for the sentinel */
|
770
|
+
if (oldsize > size)
|
771
|
+
#else
|
772
|
+
if (oldsize >= size)
|
773
|
+
#endif
|
774
|
+
{
|
775
|
+
#ifdef MEMORY_CONTEXT_CHECKING
|
776
|
+
Size oldrequest = chunk->requested_size;
|
777
|
+
|
778
|
+
#ifdef RANDOMIZE_ALLOCATED_MEMORY
|
779
|
+
/* We can only fill the extra space if we know the prior request */
|
780
|
+
if (size > oldrequest)
|
781
|
+
randomize_mem((char *) pointer + oldrequest,
|
782
|
+
size - oldrequest);
|
783
|
+
#endif
|
784
|
+
|
785
|
+
chunk->requested_size = size;
|
786
|
+
|
787
|
+
/*
|
788
|
+
* If this is an increase, mark any newly-available part UNDEFINED.
|
789
|
+
* Otherwise, mark the obsolete part NOACCESS.
|
790
|
+
*/
|
791
|
+
if (size > oldrequest)
|
792
|
+
VALGRIND_MAKE_MEM_UNDEFINED((char *) pointer + oldrequest,
|
793
|
+
size - oldrequest);
|
794
|
+
else
|
795
|
+
VALGRIND_MAKE_MEM_NOACCESS((char *) pointer + size,
|
796
|
+
oldsize - size);
|
797
|
+
|
798
|
+
/* set mark to catch clobber of "unused" space */
|
799
|
+
set_sentinel(pointer, size);
|
800
|
+
#else /* !MEMORY_CONTEXT_CHECKING */
|
801
|
+
|
802
|
+
/*
|
803
|
+
* We don't have the information to determine whether we're growing
|
804
|
+
* the old request or shrinking it, so we conservatively mark the
|
805
|
+
* entire new allocation DEFINED.
|
806
|
+
*/
|
807
|
+
VALGRIND_MAKE_MEM_NOACCESS(pointer, oldsize);
|
808
|
+
VALGRIND_MAKE_MEM_DEFINED(pointer, size);
|
809
|
+
#endif
|
810
|
+
|
811
|
+
/* Disallow access to the chunk header. */
|
812
|
+
VALGRIND_MAKE_MEM_NOACCESS(chunk, Generation_CHUNKHDRSZ);
|
813
|
+
|
814
|
+
return pointer;
|
815
|
+
}
|
816
|
+
|
817
|
+
/* allocate new chunk (this also checks size is valid) */
|
818
|
+
newPointer = GenerationAlloc((MemoryContext) set, size, flags);
|
819
|
+
|
820
|
+
/* leave immediately if request was not completed */
|
821
|
+
if (newPointer == NULL)
|
822
|
+
{
|
823
|
+
/* Disallow access to the chunk header. */
|
824
|
+
VALGRIND_MAKE_MEM_NOACCESS(chunk, Generation_CHUNKHDRSZ);
|
825
|
+
return MemoryContextAllocationFailure((MemoryContext) set, size, flags);
|
826
|
+
}
|
827
|
+
|
828
|
+
/*
|
829
|
+
* GenerationAlloc() may have returned a region that is still NOACCESS.
|
830
|
+
* Change it to UNDEFINED for the moment; memcpy() will then transfer
|
831
|
+
* definedness from the old allocation to the new. If we know the old
|
832
|
+
* allocation, copy just that much. Otherwise, make the entire old chunk
|
833
|
+
* defined to avoid errors as we copy the currently-NOACCESS trailing
|
834
|
+
* bytes.
|
835
|
+
*/
|
836
|
+
VALGRIND_MAKE_MEM_UNDEFINED(newPointer, size);
|
837
|
+
#ifdef MEMORY_CONTEXT_CHECKING
|
838
|
+
oldsize = chunk->requested_size;
|
839
|
+
#else
|
840
|
+
VALGRIND_MAKE_MEM_DEFINED(pointer, oldsize);
|
841
|
+
#endif
|
842
|
+
|
843
|
+
/* transfer existing data (certain to fit) */
|
844
|
+
memcpy(newPointer, pointer, oldsize);
|
845
|
+
|
846
|
+
/* free old chunk */
|
847
|
+
GenerationFree(pointer);
|
848
|
+
|
849
|
+
return newPointer;
|
850
|
+
}
|
851
|
+
|
852
|
+
/*
|
853
|
+
* GenerationGetChunkContext
|
854
|
+
* Return the MemoryContext that 'pointer' belongs to.
|
855
|
+
*/
|
856
|
+
MemoryContext
|
857
|
+
GenerationGetChunkContext(void *pointer)
|
858
|
+
{
|
859
|
+
MemoryChunk *chunk = PointerGetMemoryChunk(pointer);
|
860
|
+
GenerationBlock *block;
|
861
|
+
|
862
|
+
/* Allow access to the chunk header. */
|
863
|
+
VALGRIND_MAKE_MEM_DEFINED(chunk, Generation_CHUNKHDRSZ);
|
864
|
+
|
865
|
+
if (MemoryChunkIsExternal(chunk))
|
866
|
+
block = ExternalChunkGetBlock(chunk);
|
867
|
+
else
|
868
|
+
block = (GenerationBlock *) MemoryChunkGetBlock(chunk);
|
869
|
+
|
870
|
+
/* Disallow access to the chunk header. */
|
871
|
+
VALGRIND_MAKE_MEM_NOACCESS(chunk, Generation_CHUNKHDRSZ);
|
872
|
+
|
873
|
+
Assert(GenerationBlockIsValid(block));
|
874
|
+
return &block->context->header;
|
875
|
+
}
|
876
|
+
|
877
|
+
/*
|
878
|
+
* GenerationGetChunkSpace
|
879
|
+
* Given a currently-allocated chunk, determine the total space
|
880
|
+
* it occupies (including all memory-allocation overhead).
|
881
|
+
*/
|
882
|
+
Size
|
883
|
+
GenerationGetChunkSpace(void *pointer)
|
884
|
+
{
|
885
|
+
MemoryChunk *chunk = PointerGetMemoryChunk(pointer);
|
886
|
+
Size chunksize;
|
887
|
+
|
888
|
+
/* Allow access to the chunk header. */
|
889
|
+
VALGRIND_MAKE_MEM_DEFINED(chunk, Generation_CHUNKHDRSZ);
|
890
|
+
|
891
|
+
if (MemoryChunkIsExternal(chunk))
|
892
|
+
{
|
893
|
+
GenerationBlock *block = ExternalChunkGetBlock(chunk);
|
894
|
+
|
895
|
+
Assert(GenerationBlockIsValid(block));
|
896
|
+
chunksize = block->endptr - (char *) pointer;
|
897
|
+
}
|
898
|
+
else
|
899
|
+
chunksize = MemoryChunkGetValue(chunk);
|
900
|
+
|
901
|
+
/* Disallow access to the chunk header. */
|
902
|
+
VALGRIND_MAKE_MEM_NOACCESS(chunk, Generation_CHUNKHDRSZ);
|
903
|
+
|
904
|
+
return Generation_CHUNKHDRSZ + chunksize;
|
905
|
+
}
|
906
|
+
|
907
|
+
/*
|
908
|
+
* GenerationIsEmpty
|
909
|
+
* Is a GenerationContext empty of any allocated space?
|
910
|
+
*/
|
911
|
+
bool
|
912
|
+
GenerationIsEmpty(MemoryContext context)
|
913
|
+
{
|
914
|
+
GenerationContext *set = (GenerationContext *) context;
|
915
|
+
dlist_iter iter;
|
916
|
+
|
917
|
+
Assert(GenerationIsValid(set));
|
918
|
+
|
919
|
+
dlist_foreach(iter, &set->blocks)
|
920
|
+
{
|
921
|
+
GenerationBlock *block = dlist_container(GenerationBlock, node, iter.cur);
|
922
|
+
|
923
|
+
if (block->nchunks > 0)
|
924
|
+
return false;
|
925
|
+
}
|
926
|
+
|
927
|
+
return true;
|
928
|
+
}
|
929
|
+
|
930
|
+
/*
|
931
|
+
* GenerationStats
|
932
|
+
* Compute stats about memory consumption of a Generation context.
|
933
|
+
*
|
934
|
+
* printfunc: if not NULL, pass a human-readable stats string to this.
|
935
|
+
* passthru: pass this pointer through to printfunc.
|
936
|
+
* totals: if not NULL, add stats about this context into *totals.
|
937
|
+
* print_to_stderr: print stats to stderr if true, elog otherwise.
|
938
|
+
*
|
939
|
+
* XXX freespace only accounts for empty space at the end of the block, not
|
940
|
+
* space of freed chunks (which is unknown).
|
941
|
+
*/
|
942
|
+
void
|
943
|
+
GenerationStats(MemoryContext context,
|
944
|
+
MemoryStatsPrintFunc printfunc, void *passthru,
|
945
|
+
MemoryContextCounters *totals, bool print_to_stderr)
|
946
|
+
{
|
947
|
+
GenerationContext *set = (GenerationContext *) context;
|
948
|
+
Size nblocks = 0;
|
949
|
+
Size nchunks = 0;
|
950
|
+
Size nfreechunks = 0;
|
951
|
+
Size totalspace;
|
952
|
+
Size freespace = 0;
|
953
|
+
dlist_iter iter;
|
954
|
+
|
955
|
+
Assert(GenerationIsValid(set));
|
956
|
+
|
957
|
+
/* Include context header in totalspace */
|
958
|
+
totalspace = MAXALIGN(sizeof(GenerationContext));
|
959
|
+
|
960
|
+
dlist_foreach(iter, &set->blocks)
|
961
|
+
{
|
962
|
+
GenerationBlock *block = dlist_container(GenerationBlock, node, iter.cur);
|
963
|
+
|
964
|
+
nblocks++;
|
965
|
+
nchunks += block->nchunks;
|
966
|
+
nfreechunks += block->nfree;
|
967
|
+
totalspace += block->blksize;
|
968
|
+
freespace += (block->endptr - block->freeptr);
|
969
|
+
}
|
970
|
+
|
971
|
+
if (printfunc)
|
972
|
+
{
|
973
|
+
char stats_string[200];
|
974
|
+
|
975
|
+
snprintf(stats_string, sizeof(stats_string),
|
976
|
+
"%zu total in %zu blocks (%zu chunks); %zu free (%zu chunks); %zu used",
|
977
|
+
totalspace, nblocks, nchunks, freespace,
|
978
|
+
nfreechunks, totalspace - freespace);
|
979
|
+
printfunc(context, passthru, stats_string, print_to_stderr);
|
980
|
+
}
|
981
|
+
|
982
|
+
if (totals)
|
983
|
+
{
|
984
|
+
totals->nblocks += nblocks;
|
985
|
+
totals->freechunks += nfreechunks;
|
986
|
+
totals->totalspace += totalspace;
|
987
|
+
totals->freespace += freespace;
|
988
|
+
}
|
989
|
+
}
|
990
|
+
|
991
|
+
|
992
|
+
#ifdef MEMORY_CONTEXT_CHECKING
|
993
|
+
|
994
|
+
/*
|
995
|
+
* GenerationCheck
|
996
|
+
* Walk through chunks and check consistency of memory.
|
997
|
+
*
|
998
|
+
* NOTE: report errors as WARNING, *not* ERROR or FATAL. Otherwise you'll
|
999
|
+
* find yourself in an infinite loop when trouble occurs, because this
|
1000
|
+
* routine will be entered again when elog cleanup tries to release memory!
|
1001
|
+
*/
|
1002
|
+
void
|
1003
|
+
GenerationCheck(MemoryContext context)
|
1004
|
+
{
|
1005
|
+
GenerationContext *gen = (GenerationContext *) context;
|
1006
|
+
const char *name = context->name;
|
1007
|
+
dlist_iter iter;
|
1008
|
+
Size total_allocated = 0;
|
1009
|
+
|
1010
|
+
/* walk all blocks in this context */
|
1011
|
+
dlist_foreach(iter, &gen->blocks)
|
1012
|
+
{
|
1013
|
+
GenerationBlock *block = dlist_container(GenerationBlock, node, iter.cur);
|
1014
|
+
int nfree,
|
1015
|
+
nchunks;
|
1016
|
+
char *ptr;
|
1017
|
+
bool has_external_chunk = false;
|
1018
|
+
|
1019
|
+
total_allocated += block->blksize;
|
1020
|
+
|
1021
|
+
/*
|
1022
|
+
* nfree > nchunks is surely wrong. Equality is allowed as the block
|
1023
|
+
* might completely empty if it's the freeblock.
|
1024
|
+
*/
|
1025
|
+
if (block->nfree > block->nchunks)
|
1026
|
+
elog(WARNING, "problem in Generation %s: number of free chunks %d in block %p exceeds %d allocated",
|
1027
|
+
name, block->nfree, block, block->nchunks);
|
1028
|
+
|
1029
|
+
/* check block belongs to the correct context */
|
1030
|
+
if (block->context != gen)
|
1031
|
+
elog(WARNING, "problem in Generation %s: bogus context link in block %p",
|
1032
|
+
name, block);
|
1033
|
+
|
1034
|
+
/* Now walk through the chunks and count them. */
|
1035
|
+
nfree = 0;
|
1036
|
+
nchunks = 0;
|
1037
|
+
ptr = ((char *) block) + Generation_BLOCKHDRSZ;
|
1038
|
+
|
1039
|
+
while (ptr < block->freeptr)
|
1040
|
+
{
|
1041
|
+
MemoryChunk *chunk = (MemoryChunk *) ptr;
|
1042
|
+
GenerationBlock *chunkblock;
|
1043
|
+
Size chunksize;
|
1044
|
+
|
1045
|
+
/* Allow access to the chunk header. */
|
1046
|
+
VALGRIND_MAKE_MEM_DEFINED(chunk, Generation_CHUNKHDRSZ);
|
1047
|
+
|
1048
|
+
if (MemoryChunkIsExternal(chunk))
|
1049
|
+
{
|
1050
|
+
chunkblock = ExternalChunkGetBlock(chunk);
|
1051
|
+
chunksize = block->endptr - (char *) MemoryChunkGetPointer(chunk);
|
1052
|
+
has_external_chunk = true;
|
1053
|
+
}
|
1054
|
+
else
|
1055
|
+
{
|
1056
|
+
chunkblock = MemoryChunkGetBlock(chunk);
|
1057
|
+
chunksize = MemoryChunkGetValue(chunk);
|
1058
|
+
}
|
1059
|
+
|
1060
|
+
/* move to the next chunk */
|
1061
|
+
ptr += (chunksize + Generation_CHUNKHDRSZ);
|
1062
|
+
|
1063
|
+
nchunks += 1;
|
1064
|
+
|
1065
|
+
/* chunks have both block and context pointers, so check both */
|
1066
|
+
if (chunkblock != block)
|
1067
|
+
elog(WARNING, "problem in Generation %s: bogus block link in block %p, chunk %p",
|
1068
|
+
name, block, chunk);
|
1069
|
+
|
1070
|
+
|
1071
|
+
/* is chunk allocated? */
|
1072
|
+
if (chunk->requested_size != InvalidAllocSize)
|
1073
|
+
{
|
1074
|
+
/* now make sure the chunk size is correct */
|
1075
|
+
if (chunksize < chunk->requested_size ||
|
1076
|
+
chunksize != MAXALIGN(chunksize))
|
1077
|
+
elog(WARNING, "problem in Generation %s: bogus chunk size in block %p, chunk %p",
|
1078
|
+
name, block, chunk);
|
1079
|
+
|
1080
|
+
/* check sentinel */
|
1081
|
+
Assert(chunk->requested_size < chunksize);
|
1082
|
+
if (!sentinel_ok(chunk, Generation_CHUNKHDRSZ + chunk->requested_size))
|
1083
|
+
elog(WARNING, "problem in Generation %s: detected write past chunk end in block %p, chunk %p",
|
1084
|
+
name, block, chunk);
|
1085
|
+
}
|
1086
|
+
else
|
1087
|
+
nfree += 1;
|
1088
|
+
|
1089
|
+
/* if chunk is allocated, disallow access to the chunk header */
|
1090
|
+
if (chunk->requested_size != InvalidAllocSize)
|
1091
|
+
VALGRIND_MAKE_MEM_NOACCESS(chunk, Generation_CHUNKHDRSZ);
|
1092
|
+
}
|
1093
|
+
|
1094
|
+
/*
|
1095
|
+
* Make sure we got the expected number of allocated and free chunks
|
1096
|
+
* (as tracked in the block header).
|
1097
|
+
*/
|
1098
|
+
if (nchunks != block->nchunks)
|
1099
|
+
elog(WARNING, "problem in Generation %s: number of allocated chunks %d in block %p does not match header %d",
|
1100
|
+
name, nchunks, block, block->nchunks);
|
1101
|
+
|
1102
|
+
if (nfree != block->nfree)
|
1103
|
+
elog(WARNING, "problem in Generation %s: number of free chunks %d in block %p does not match header %d",
|
1104
|
+
name, nfree, block, block->nfree);
|
1105
|
+
|
1106
|
+
if (has_external_chunk && nchunks > 1)
|
1107
|
+
elog(WARNING, "problem in Generation %s: external chunk on non-dedicated block %p",
|
1108
|
+
name, block);
|
1109
|
+
|
1110
|
+
}
|
1111
|
+
|
1112
|
+
Assert(total_allocated == context->mem_allocated);
|
1113
|
+
}
|
1114
|
+
|
1115
|
+
#endif /* MEMORY_CONTEXT_CHECKING */
|