pg_query 4.2.1 → 5.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 +31 -0
- data/README.md +6 -8
- data/Rakefile +5 -6
- data/ext/pg_query/extconf.rb +14 -4
- data/ext/pg_query/include/pg_query.h +27 -3
- data/ext/pg_query/include/pg_query_enum_defs.c +311 -149
- data/ext/pg_query/include/pg_query_fingerprint_conds.c +545 -489
- data/ext/pg_query/include/pg_query_fingerprint_defs.c +5092 -4432
- data/ext/pg_query/include/pg_query_outfuncs_conds.c +385 -343
- data/ext/pg_query/include/pg_query_outfuncs_defs.c +1294 -1161
- data/ext/pg_query/include/pg_query_readfuncs_conds.c +137 -123
- data/ext/pg_query/include/pg_query_readfuncs_defs.c +1657 -1496
- data/ext/pg_query/include/{access → postgres/access}/amapi.h +3 -1
- data/ext/pg_query/include/{access → postgres/access}/attmap.h +5 -3
- data/ext/pg_query/include/{access → postgres/access}/attnum.h +1 -1
- data/ext/pg_query/include/{access → postgres/access}/clog.h +1 -1
- data/ext/pg_query/include/{access → postgres/access}/commit_ts.h +1 -1
- data/ext/pg_query/include/{access → postgres/access}/detoast.h +1 -1
- data/ext/pg_query/include/{access → postgres/access}/genam.h +7 -5
- data/ext/pg_query/include/{access → postgres/access}/gin.h +16 -3
- data/ext/pg_query/include/{access → postgres/access}/htup.h +1 -1
- data/ext/pg_query/include/{access → postgres/access}/htup_details.h +6 -2
- data/ext/pg_query/include/{access → postgres/access}/itup.h +61 -58
- data/ext/pg_query/include/{access → postgres/access}/parallel.h +2 -2
- data/ext/pg_query/include/{access → postgres/access}/printtup.h +1 -1
- data/ext/pg_query/include/{access → postgres/access}/relation.h +1 -1
- data/ext/pg_query/include/{access → postgres/access}/relscan.h +1 -1
- data/ext/pg_query/include/{access → postgres/access}/rmgrlist.h +2 -2
- data/ext/pg_query/include/{access → postgres/access}/sdir.h +12 -3
- data/ext/pg_query/include/{access → postgres/access}/skey.h +1 -1
- data/ext/pg_query/include/{access → postgres/access}/stratnum.h +1 -1
- data/ext/pg_query/include/{access → postgres/access}/sysattr.h +1 -1
- data/ext/pg_query/include/{access → postgres/access}/table.h +1 -1
- data/ext/pg_query/include/{access → postgres/access}/tableam.h +68 -45
- data/ext/pg_query/include/{access → postgres/access}/toast_compression.h +1 -1
- data/ext/pg_query/include/{access → postgres/access}/transam.h +1 -1
- data/ext/pg_query/include/postgres/access/tsmapi.h +82 -0
- data/ext/pg_query/include/{access → postgres/access}/tupconvert.h +5 -2
- data/ext/pg_query/include/{access → postgres/access}/tupdesc.h +2 -2
- data/ext/pg_query/include/{access → postgres/access}/tupmacs.h +58 -98
- data/ext/pg_query/include/{access → postgres/access}/twophase.h +2 -2
- data/ext/pg_query/include/{access → postgres/access}/xact.h +25 -18
- data/ext/pg_query/include/{access → postgres/access}/xlog.h +15 -16
- data/ext/pg_query/include/{access → postgres/access}/xlog_internal.h +100 -62
- data/ext/pg_query/include/postgres/access/xlogbackup.h +41 -0
- data/ext/pg_query/include/{access → postgres/access}/xlogdefs.h +6 -25
- data/ext/pg_query/include/{access → postgres/access}/xlogprefetcher.h +1 -1
- data/ext/pg_query/include/{access → postgres/access}/xlogreader.h +7 -6
- data/ext/pg_query/include/{access → postgres/access}/xlogrecord.h +17 -5
- data/ext/pg_query/include/{access → postgres/access}/xlogrecovery.h +4 -3
- data/ext/pg_query/include/postgres/archive/archive_module.h +59 -0
- data/ext/pg_query/include/{c.h → postgres/c.h} +144 -156
- data/ext/pg_query/include/{catalog → postgres/catalog}/catalog.h +4 -3
- data/ext/pg_query/include/{catalog → postgres/catalog}/catversion.h +6 -2
- data/ext/pg_query/include/{catalog → postgres/catalog}/dependency.h +5 -4
- data/ext/pg_query/include/{catalog → postgres/catalog}/genbki.h +7 -6
- data/ext/pg_query/include/{catalog → postgres/catalog}/index.h +4 -4
- data/ext/pg_query/include/{catalog → postgres/catalog}/indexing.h +1 -1
- data/ext/pg_query/include/{catalog → postgres/catalog}/namespace.h +2 -2
- data/ext/pg_query/include/{catalog → postgres/catalog}/objectaccess.h +10 -8
- data/ext/pg_query/include/{catalog → postgres/catalog}/objectaddress.h +3 -3
- data/ext/pg_query/include/{catalog → postgres/catalog}/pg_aggregate.h +1 -1
- data/ext/pg_query/include/{catalog → postgres/catalog}/pg_aggregate_d.h +1 -1
- data/ext/pg_query/include/{catalog → postgres/catalog}/pg_am.h +1 -1
- data/ext/pg_query/include/{catalog → postgres/catalog}/pg_am_d.h +1 -1
- data/ext/pg_query/include/{catalog → postgres/catalog}/pg_attribute.h +19 -17
- data/ext/pg_query/include/{catalog → postgres/catalog}/pg_attribute_d.h +19 -19
- data/ext/pg_query/include/{catalog → postgres/catalog}/pg_authid.h +1 -1
- data/ext/pg_query/include/{catalog → postgres/catalog}/pg_authid_d.h +3 -1
- data/ext/pg_query/include/{catalog → postgres/catalog}/pg_class.h +1 -1
- data/ext/pg_query/include/{catalog → postgres/catalog}/pg_class_d.h +1 -1
- data/ext/pg_query/include/{catalog → postgres/catalog}/pg_collation.h +3 -1
- data/ext/pg_query/include/{catalog → postgres/catalog}/pg_collation_d.h +4 -3
- data/ext/pg_query/include/{catalog → postgres/catalog}/pg_constraint.h +2 -2
- data/ext/pg_query/include/{catalog → postgres/catalog}/pg_constraint_d.h +1 -1
- data/ext/pg_query/include/{catalog → postgres/catalog}/pg_control.h +9 -1
- data/ext/pg_query/include/{catalog → postgres/catalog}/pg_conversion.h +2 -2
- data/ext/pg_query/include/{catalog → postgres/catalog}/pg_conversion_d.h +1 -1
- data/ext/pg_query/include/postgres/catalog/pg_database.h +124 -0
- data/ext/pg_query/include/postgres/catalog/pg_database_d.h +52 -0
- data/ext/pg_query/include/{catalog → postgres/catalog}/pg_depend.h +1 -1
- data/ext/pg_query/include/{catalog → postgres/catalog}/pg_depend_d.h +1 -1
- data/ext/pg_query/include/{catalog → postgres/catalog}/pg_event_trigger.h +1 -1
- data/ext/pg_query/include/{catalog → postgres/catalog}/pg_event_trigger_d.h +1 -1
- data/ext/pg_query/include/{catalog → postgres/catalog}/pg_index.h +1 -1
- data/ext/pg_query/include/{catalog → postgres/catalog}/pg_index_d.h +1 -1
- data/ext/pg_query/include/{catalog → postgres/catalog}/pg_language.h +1 -1
- data/ext/pg_query/include/{catalog → postgres/catalog}/pg_language_d.h +1 -1
- data/ext/pg_query/include/{catalog → postgres/catalog}/pg_namespace.h +1 -1
- data/ext/pg_query/include/{catalog → postgres/catalog}/pg_namespace_d.h +1 -1
- data/ext/pg_query/include/{catalog → postgres/catalog}/pg_opclass.h +1 -1
- data/ext/pg_query/include/{catalog → postgres/catalog}/pg_opclass_d.h +1 -1
- data/ext/pg_query/include/{catalog → postgres/catalog}/pg_operator.h +1 -1
- data/ext/pg_query/include/{catalog → postgres/catalog}/pg_operator_d.h +1 -1
- data/ext/pg_query/include/{catalog → postgres/catalog}/pg_opfamily.h +3 -2
- data/ext/pg_query/include/{catalog → postgres/catalog}/pg_opfamily_d.h +4 -2
- data/ext/pg_query/include/{catalog → postgres/catalog}/pg_partitioned_table.h +1 -1
- data/ext/pg_query/include/{catalog → postgres/catalog}/pg_partitioned_table_d.h +1 -1
- data/ext/pg_query/include/{catalog → postgres/catalog}/pg_proc.h +1 -1
- data/ext/pg_query/include/{catalog → postgres/catalog}/pg_proc_d.h +1 -1
- data/ext/pg_query/include/{catalog → postgres/catalog}/pg_publication.h +2 -5
- data/ext/pg_query/include/{catalog → postgres/catalog}/pg_publication_d.h +1 -1
- data/ext/pg_query/include/{catalog → postgres/catalog}/pg_replication_origin.h +1 -1
- data/ext/pg_query/include/{catalog → postgres/catalog}/pg_replication_origin_d.h +1 -1
- data/ext/pg_query/include/{catalog → postgres/catalog}/pg_statistic.h +1 -1
- data/ext/pg_query/include/{catalog → postgres/catalog}/pg_statistic_d.h +1 -1
- data/ext/pg_query/include/{catalog → postgres/catalog}/pg_statistic_ext.h +1 -1
- data/ext/pg_query/include/{catalog → postgres/catalog}/pg_statistic_ext_d.h +1 -1
- data/ext/pg_query/include/{catalog → postgres/catalog}/pg_transform.h +1 -1
- data/ext/pg_query/include/{catalog → postgres/catalog}/pg_transform_d.h +1 -1
- data/ext/pg_query/include/{catalog → postgres/catalog}/pg_trigger.h +1 -1
- data/ext/pg_query/include/{catalog → postgres/catalog}/pg_trigger_d.h +1 -1
- data/ext/pg_query/include/{catalog → postgres/catalog}/pg_ts_config.h +1 -1
- data/ext/pg_query/include/{catalog → postgres/catalog}/pg_ts_config_d.h +1 -1
- data/ext/pg_query/include/{catalog → postgres/catalog}/pg_ts_dict.h +1 -1
- data/ext/pg_query/include/{catalog → postgres/catalog}/pg_ts_dict_d.h +1 -1
- data/ext/pg_query/include/{catalog → postgres/catalog}/pg_ts_parser.h +1 -1
- data/ext/pg_query/include/{catalog → postgres/catalog}/pg_ts_parser_d.h +1 -1
- data/ext/pg_query/include/{catalog → postgres/catalog}/pg_ts_template.h +1 -1
- data/ext/pg_query/include/{catalog → postgres/catalog}/pg_ts_template_d.h +1 -1
- data/ext/pg_query/include/{catalog → postgres/catalog}/pg_type.h +1 -1
- data/ext/pg_query/include/{catalog → postgres/catalog}/pg_type_d.h +1 -1
- data/ext/pg_query/include/{catalog → postgres/catalog}/storage.h +6 -6
- data/ext/pg_query/include/{commands → postgres/commands}/async.h +1 -1
- data/ext/pg_query/include/{commands → postgres/commands}/dbcommands.h +2 -1
- data/ext/pg_query/include/{commands → postgres/commands}/defrem.h +2 -1
- data/ext/pg_query/include/{commands → postgres/commands}/event_trigger.h +1 -1
- data/ext/pg_query/include/{commands → postgres/commands}/explain.h +3 -1
- data/ext/pg_query/include/{commands → postgres/commands}/prepare.h +1 -1
- data/ext/pg_query/include/{commands → postgres/commands}/tablespace.h +4 -4
- data/ext/pg_query/include/{commands → postgres/commands}/trigger.h +15 -14
- data/ext/pg_query/include/{commands → postgres/commands}/user.h +9 -3
- data/ext/pg_query/include/{commands → postgres/commands}/vacuum.h +60 -14
- data/ext/pg_query/include/postgres/common/cryptohash.h +39 -0
- data/ext/pg_query/include/{common → postgres/common}/file_perm.h +1 -1
- data/ext/pg_query/include/{common → postgres/common}/hashfn.h +1 -1
- data/ext/pg_query/include/postgres/common/int.h +437 -0
- data/ext/pg_query/include/{common → postgres/common}/keywords.h +1 -1
- data/ext/pg_query/include/{common → postgres/common}/kwlookup.h +2 -2
- data/ext/pg_query/include/{common → postgres/common}/pg_prng.h +3 -2
- data/ext/pg_query/include/{common → postgres/common}/relpath.h +20 -13
- 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/{common → postgres/common}/string.h +5 -3
- data/ext/pg_query/include/{common → postgres/common}/unicode_east_asian_fw_table.h +10 -10
- data/ext/pg_query/include/{common/unicode_combining_table.h → postgres/common/unicode_nonspacing_table.h} +31 -13
- data/ext/pg_query/include/postgres/copyfuncs.funcs.c +5013 -0
- data/ext/pg_query/include/postgres/copyfuncs.switch.c +938 -0
- data/ext/pg_query/include/{datatype → postgres/datatype}/timestamp.h +11 -4
- data/ext/pg_query/include/postgres/equalfuncs.funcs.c +3097 -0
- data/ext/pg_query/include/postgres/equalfuncs.switch.c +785 -0
- data/ext/pg_query/include/{executor → postgres/executor}/execdesc.h +1 -1
- data/ext/pg_query/include/{executor → postgres/executor}/executor.h +34 -17
- data/ext/pg_query/include/{executor → postgres/executor}/functions.h +1 -1
- data/ext/pg_query/include/{executor → postgres/executor}/instrument.h +1 -1
- data/ext/pg_query/include/{executor → postgres/executor}/spi.h +2 -2
- data/ext/pg_query/include/{executor → postgres/executor}/tablefunc.h +1 -1
- data/ext/pg_query/include/{executor → postgres/executor}/tuptable.h +18 -11
- data/ext/pg_query/include/{fmgr.h → postgres/fmgr.h} +21 -2
- data/ext/pg_query/include/postgres/foreign/fdwapi.h +294 -0
- data/ext/pg_query/include/{funcapi.h → postgres/funcapi.h} +12 -12
- data/ext/pg_query/include/postgres/gram.h +1127 -0
- data/ext/pg_query/include/{parser → postgres}/gramparse.h +4 -4
- data/ext/pg_query/include/{jit → postgres/jit}/jit.h +2 -2
- data/ext/pg_query/include/postgres/kwlist_d.h +1119 -0
- data/ext/pg_query/include/{lib → postgres/lib}/dshash.h +4 -1
- data/ext/pg_query/include/{lib → postgres/lib}/ilist.h +435 -22
- data/ext/pg_query/include/{lib → postgres/lib}/pairingheap.h +1 -1
- data/ext/pg_query/include/{lib → postgres/lib}/simplehash.h +9 -9
- data/ext/pg_query/include/{lib → postgres/lib}/sort_template.h +1 -1
- data/ext/pg_query/include/{lib → postgres/lib}/stringinfo.h +3 -3
- data/ext/pg_query/include/{libpq → postgres/libpq}/auth.h +8 -2
- data/ext/pg_query/include/{libpq → postgres/libpq}/crypt.h +1 -1
- data/ext/pg_query/include/{libpq → postgres/libpq}/hba.h +24 -17
- data/ext/pg_query/include/{libpq → postgres/libpq}/libpq-be.h +36 -25
- data/ext/pg_query/include/{libpq → postgres/libpq}/libpq.h +1 -1
- data/ext/pg_query/include/{libpq → postgres/libpq}/pqcomm.h +10 -41
- data/ext/pg_query/include/{libpq → postgres/libpq}/pqformat.h +2 -2
- data/ext/pg_query/include/{libpq → postgres/libpq}/pqsignal.h +22 -10
- 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/{mb → postgres/mb}/pg_wchar.h +35 -18
- data/ext/pg_query/include/{mb → postgres/mb}/stringinfo_mb.h +1 -1
- data/ext/pg_query/include/{miscadmin.h → postgres/miscadmin.h} +27 -15
- data/ext/pg_query/include/{nodes → postgres/nodes}/bitmapset.h +11 -7
- data/ext/pg_query/include/{nodes → postgres/nodes}/execnodes.h +83 -30
- data/ext/pg_query/include/{nodes → postgres/nodes}/extensible.h +5 -3
- data/ext/pg_query/include/{nodes → postgres/nodes}/lockoptions.h +1 -1
- data/ext/pg_query/include/{nodes → postgres/nodes}/makefuncs.h +14 -2
- data/ext/pg_query/include/{nodes → postgres/nodes}/memnodes.h +7 -4
- data/ext/pg_query/include/postgres/nodes/miscnodes.h +56 -0
- data/ext/pg_query/include/{nodes → postgres/nodes}/nodeFuncs.h +89 -29
- data/ext/pg_query/include/{nodes → postgres/nodes}/nodes.h +96 -511
- data/ext/pg_query/include/postgres/nodes/nodetags.h +471 -0
- data/ext/pg_query/include/{nodes → postgres/nodes}/params.h +3 -3
- data/ext/pg_query/include/{nodes → postgres/nodes}/parsenodes.h +377 -139
- data/ext/pg_query/include/{nodes → postgres/nodes}/pathnodes.h +1090 -440
- data/ext/pg_query/include/{nodes → postgres/nodes}/pg_list.h +30 -7
- data/ext/pg_query/include/{nodes → postgres/nodes}/plannodes.h +367 -124
- data/ext/pg_query/include/{nodes → postgres/nodes}/primnodes.h +670 -222
- data/ext/pg_query/include/{nodes → postgres/nodes}/print.h +1 -1
- data/ext/pg_query/include/{utils → postgres/nodes}/queryjumble.h +5 -7
- data/ext/pg_query/include/postgres/nodes/replnodes.h +111 -0
- data/ext/pg_query/include/postgres/nodes/supportnodes.h +346 -0
- data/ext/pg_query/include/{nodes → postgres/nodes}/tidbitmap.h +1 -1
- data/ext/pg_query/include/{nodes → postgres/nodes}/value.h +12 -2
- data/ext/pg_query/include/{optimizer → postgres/optimizer}/cost.h +6 -4
- data/ext/pg_query/include/{optimizer → postgres/optimizer}/geqo.h +1 -1
- data/ext/pg_query/include/{optimizer → postgres/optimizer}/geqo_gene.h +1 -1
- data/ext/pg_query/include/{optimizer → postgres/optimizer}/optimizer.h +8 -8
- data/ext/pg_query/include/{optimizer → postgres/optimizer}/paths.h +16 -7
- data/ext/pg_query/include/{optimizer → postgres/optimizer}/planmain.h +3 -6
- data/ext/pg_query/include/{parser → postgres/parser}/analyze.h +4 -3
- data/ext/pg_query/include/{parser → postgres/parser}/kwlist.h +12 -1
- data/ext/pg_query/include/{parser → postgres/parser}/parse_agg.h +4 -2
- data/ext/pg_query/include/{parser → postgres/parser}/parse_coerce.h +3 -1
- data/ext/pg_query/include/{parser → postgres/parser}/parse_expr.h +1 -1
- data/ext/pg_query/include/{parser → postgres/parser}/parse_func.h +1 -1
- data/ext/pg_query/include/{parser → postgres/parser}/parse_node.h +22 -4
- data/ext/pg_query/include/{parser → postgres/parser}/parse_oper.h +3 -3
- data/ext/pg_query/include/{parser → postgres/parser}/parse_relation.h +8 -3
- data/ext/pg_query/include/{parser → postgres/parser}/parse_type.h +4 -3
- data/ext/pg_query/include/{parser → postgres/parser}/parser.h +4 -4
- data/ext/pg_query/include/{parser → postgres/parser}/parsetree.h +1 -1
- data/ext/pg_query/include/{parser → postgres/parser}/scanner.h +2 -2
- data/ext/pg_query/include/{parser → postgres/parser}/scansup.h +1 -1
- data/ext/pg_query/include/{partitioning → postgres/partitioning}/partdefs.h +1 -1
- data/ext/pg_query/include/{pg_config.h → postgres/pg_config.h} +158 -218
- data/ext/pg_query/include/{pg_config_manual.h → postgres/pg_config_manual.h} +8 -46
- data/ext/pg_query/include/postgres/pg_config_os.h +8 -0
- data/ext/pg_query/include/{pg_getopt.h → postgres/pg_getopt.h} +1 -1
- data/ext/pg_query/include/{pg_trace.h → postgres/pg_trace.h} +1 -1
- data/ext/pg_query/include/{pgstat.h → postgres/pgstat.h} +173 -94
- data/ext/pg_query/include/{pgtime.h → postgres/pgtime.h} +3 -3
- data/ext/pg_query/include/{pl_gram.h → postgres/pl_gram.h} +66 -64
- data/ext/pg_query/include/{pl_reserved_kwlist.h → postgres/pl_reserved_kwlist.h} +1 -1
- data/ext/pg_query/include/{pl_reserved_kwlist_d.h → postgres/pl_reserved_kwlist_d.h} +1 -1
- data/ext/pg_query/include/{pl_unreserved_kwlist.h → postgres/pl_unreserved_kwlist.h} +2 -1
- data/ext/pg_query/include/{pl_unreserved_kwlist_d.h → postgres/pl_unreserved_kwlist_d.h} +48 -46
- data/ext/pg_query/include/{plpgsql.h → postgres/plpgsql.h} +28 -33
- data/ext/pg_query/include/{port → postgres/port}/atomics/arch-arm.h +3 -3
- data/ext/pg_query/include/postgres/port/atomics/arch-hppa.h +17 -0
- data/ext/pg_query/include/{port → postgres/port}/atomics/arch-ppc.h +21 -21
- data/ext/pg_query/include/{port → postgres/port}/atomics/arch-x86.h +2 -2
- data/ext/pg_query/include/{port → postgres/port}/atomics/fallback.h +3 -3
- data/ext/pg_query/include/{port → postgres/port}/atomics/generic-gcc.h +1 -1
- data/ext/pg_query/include/postgres/port/atomics/generic-msvc.h +101 -0
- data/ext/pg_query/include/postgres/port/atomics/generic-sunpro.h +106 -0
- data/ext/pg_query/include/{port → postgres/port}/atomics/generic.h +1 -1
- data/ext/pg_query/include/{port → postgres/port}/atomics.h +2 -7
- data/ext/pg_query/include/{port → postgres/port}/pg_bitutils.h +62 -25
- data/ext/pg_query/include/{port → postgres/port}/pg_bswap.h +1 -1
- data/ext/pg_query/include/{port → postgres/port}/pg_crc32c.h +1 -1
- data/ext/pg_query/include/postgres/port/simd.h +375 -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 +26 -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 +594 -0
- data/ext/pg_query/include/{port.h → postgres/port.h} +42 -75
- 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_ext.h → postgres/postgres_ext.h} +0 -1
- data/ext/pg_query/include/{postmaster → postgres/postmaster}/autovacuum.h +1 -4
- data/ext/pg_query/include/{postmaster → postgres/postmaster}/bgworker.h +2 -2
- data/ext/pg_query/include/{postmaster → postgres/postmaster}/bgworker_internals.h +1 -1
- data/ext/pg_query/include/{postmaster → postgres/postmaster}/bgwriter.h +2 -2
- data/ext/pg_query/include/{postmaster → postgres/postmaster}/interrupt.h +1 -1
- data/ext/pg_query/include/postgres/postmaster/pgarch.h +36 -0
- data/ext/pg_query/include/{postmaster → postgres/postmaster}/postmaster.h +6 -3
- data/ext/pg_query/include/{postmaster → postgres/postmaster}/startup.h +3 -1
- data/ext/pg_query/include/{postmaster → postgres/postmaster}/syslogger.h +2 -2
- data/ext/pg_query/include/{postmaster → postgres/postmaster}/walwriter.h +3 -1
- data/ext/pg_query/include/{regex → postgres/regex}/regex.h +9 -6
- data/ext/pg_query/include/{replication → postgres/replication}/logicallauncher.h +6 -1
- data/ext/pg_query/include/{replication → postgres/replication}/logicalproto.h +30 -10
- data/ext/pg_query/include/postgres/replication/logicalworker.h +32 -0
- data/ext/pg_query/include/{replication → postgres/replication}/origin.h +4 -4
- data/ext/pg_query/include/{replication → postgres/replication}/reorderbuffer.h +113 -45
- data/ext/pg_query/include/{replication → postgres/replication}/slot.h +25 -6
- data/ext/pg_query/include/{replication → postgres/replication}/syncrep.h +2 -8
- data/ext/pg_query/include/{replication → postgres/replication}/walreceiver.h +15 -9
- data/ext/pg_query/include/{replication → postgres/replication}/walsender.h +13 -13
- data/ext/pg_query/include/{rewrite → postgres/rewrite}/prs2lock.h +1 -1
- data/ext/pg_query/include/{rewrite → postgres/rewrite}/rewriteHandler.h +1 -4
- data/ext/pg_query/include/{rewrite → postgres/rewrite}/rewriteManip.h +11 -2
- data/ext/pg_query/include/{rewrite → postgres/rewrite}/rewriteSupport.h +1 -1
- data/ext/pg_query/include/{storage → postgres/storage}/backendid.h +1 -1
- data/ext/pg_query/include/{storage → postgres/storage}/block.h +24 -31
- data/ext/pg_query/include/{storage → postgres/storage}/buf.h +1 -1
- data/ext/pg_query/include/{storage → postgres/storage}/bufmgr.h +183 -87
- data/ext/pg_query/include/{storage → postgres/storage}/bufpage.h +146 -93
- data/ext/pg_query/include/{storage → postgres/storage}/condition_variable.h +2 -2
- data/ext/pg_query/include/{storage → postgres/storage}/dsm.h +3 -6
- data/ext/pg_query/include/{storage → postgres/storage}/dsm_impl.h +4 -1
- data/ext/pg_query/include/{storage → postgres/storage}/fd.h +24 -20
- data/ext/pg_query/include/{storage → postgres/storage}/fileset.h +1 -1
- data/ext/pg_query/include/{storage → postgres/storage}/ipc.h +2 -2
- data/ext/pg_query/include/{storage → postgres/storage}/item.h +1 -1
- data/ext/pg_query/include/{storage → postgres/storage}/itemid.h +1 -1
- data/ext/pg_query/include/{storage → postgres/storage}/itemptr.h +94 -57
- data/ext/pg_query/include/{storage → postgres/storage}/large_object.h +1 -1
- data/ext/pg_query/include/{storage → postgres/storage}/latch.h +9 -1
- data/ext/pg_query/include/{storage → postgres/storage}/lmgr.h +6 -1
- data/ext/pg_query/include/{storage → postgres/storage}/lock.h +21 -13
- data/ext/pg_query/include/{storage → postgres/storage}/lockdefs.h +3 -3
- data/ext/pg_query/include/{storage → postgres/storage}/lwlock.h +16 -2
- data/ext/pg_query/include/{storage → postgres/storage}/off.h +1 -1
- data/ext/pg_query/include/{storage → postgres/storage}/pg_sema.h +1 -1
- data/ext/pg_query/include/{storage → postgres/storage}/pg_shmem.h +1 -1
- data/ext/pg_query/include/{storage → postgres/storage}/pmsignal.h +1 -1
- data/ext/pg_query/include/{storage → postgres/storage}/predicate.h +2 -2
- data/ext/pg_query/include/{storage → postgres/storage}/proc.h +22 -17
- data/ext/pg_query/include/{storage → postgres/storage}/procarray.h +3 -2
- data/ext/pg_query/include/{storage → postgres/storage}/proclist_types.h +1 -1
- data/ext/pg_query/include/{storage → postgres/storage}/procsignal.h +3 -1
- data/ext/pg_query/include/postgres/storage/relfilelocator.h +99 -0
- data/ext/pg_query/include/{storage → postgres/storage}/s_lock.h +66 -309
- data/ext/pg_query/include/{storage → postgres/storage}/sharedfileset.h +1 -1
- data/ext/pg_query/include/{storage → postgres/storage}/shm_mq.h +1 -1
- data/ext/pg_query/include/{storage → postgres/storage}/shm_toc.h +1 -1
- data/ext/pg_query/include/{storage → postgres/storage}/shmem.h +1 -23
- data/ext/pg_query/include/{storage → postgres/storage}/sinval.h +3 -3
- data/ext/pg_query/include/{storage → postgres/storage}/sinvaladt.h +4 -2
- data/ext/pg_query/include/{storage → postgres/storage}/smgr.h +12 -10
- data/ext/pg_query/include/{storage → postgres/storage}/spin.h +1 -1
- data/ext/pg_query/include/{storage → postgres/storage}/standby.h +9 -8
- data/ext/pg_query/include/{storage → postgres/storage}/standbydefs.h +1 -1
- data/ext/pg_query/include/{storage → postgres/storage}/sync.h +3 -3
- data/ext/pg_query/include/{tcop → postgres/tcop}/cmdtag.h +7 -2
- data/ext/pg_query/include/{tcop → postgres/tcop}/cmdtaglist.h +1 -1
- data/ext/pg_query/include/{tcop → postgres/tcop}/deparse_utility.h +1 -1
- data/ext/pg_query/include/{tcop → postgres/tcop}/dest.h +1 -3
- data/ext/pg_query/include/{tcop → postgres/tcop}/fastpath.h +1 -1
- data/ext/pg_query/include/{tcop → postgres/tcop}/pquery.h +1 -1
- data/ext/pg_query/include/{tcop → postgres/tcop}/tcopprot.h +3 -6
- data/ext/pg_query/include/{tcop → postgres/tcop}/utility.h +1 -1
- data/ext/pg_query/include/{tsearch → postgres/tsearch}/ts_cache.h +2 -4
- data/ext/pg_query/include/{utils → postgres/utils}/acl.h +26 -81
- data/ext/pg_query/include/{utils → postgres/utils}/aclchk_internal.h +1 -1
- data/ext/pg_query/include/{utils → postgres/utils}/array.h +19 -1
- data/ext/pg_query/include/{utils → postgres/utils}/backend_progress.h +2 -1
- data/ext/pg_query/include/{utils → postgres/utils}/backend_status.h +24 -3
- data/ext/pg_query/include/{utils → postgres/utils}/builtins.h +15 -6
- data/ext/pg_query/include/{utils → postgres/utils}/bytea.h +1 -1
- data/ext/pg_query/include/{utils → postgres/utils}/catcache.h +1 -1
- data/ext/pg_query/include/{utils → postgres/utils}/date.h +37 -9
- data/ext/pg_query/include/{utils → postgres/utils}/datetime.h +41 -21
- data/ext/pg_query/include/{utils → postgres/utils}/datum.h +1 -1
- data/ext/pg_query/include/{utils → postgres/utils}/dsa.h +5 -1
- data/ext/pg_query/include/{utils → postgres/utils}/elog.h +104 -29
- data/ext/pg_query/include/{utils → postgres/utils}/expandeddatum.h +14 -3
- data/ext/pg_query/include/{utils → postgres/utils}/expandedrecord.h +14 -4
- data/ext/pg_query/include/{utils → postgres/utils}/float.h +7 -6
- data/ext/pg_query/include/{utils → postgres/utils}/fmgroids.h +54 -1
- data/ext/pg_query/include/{utils → postgres/utils}/fmgrprotos.h +45 -3
- data/ext/pg_query/include/{utils → postgres/utils}/fmgrtab.h +1 -1
- data/ext/pg_query/include/{utils → postgres/utils}/guc.h +59 -86
- data/ext/pg_query/include/postgres/utils/guc_hooks.h +163 -0
- data/ext/pg_query/include/{utils → postgres/utils}/guc_tables.h +49 -3
- data/ext/pg_query/include/{utils → postgres/utils}/hsearch.h +1 -1
- data/ext/pg_query/include/{utils → postgres/utils}/inval.h +3 -3
- data/ext/pg_query/include/postgres/utils/logtape.h +77 -0
- data/ext/pg_query/include/{utils → postgres/utils}/lsyscache.h +5 -1
- data/ext/pg_query/include/{utils → postgres/utils}/memdebug.h +1 -1
- data/ext/pg_query/include/{utils → postgres/utils}/memutils.h +7 -51
- data/ext/pg_query/include/postgres/utils/memutils_internal.h +136 -0
- data/ext/pg_query/include/postgres/utils/memutils_memorychunk.h +237 -0
- data/ext/pg_query/include/{utils → postgres/utils}/numeric.h +20 -5
- data/ext/pg_query/include/{utils → postgres/utils}/palloc.h +9 -2
- data/ext/pg_query/include/{utils → postgres/utils}/partcache.h +3 -2
- data/ext/pg_query/include/{utils → postgres/utils}/pg_locale.h +22 -14
- data/ext/pg_query/include/{utils → postgres/utils}/pgstat_internal.h +37 -7
- data/ext/pg_query/include/{utils → postgres/utils}/plancache.h +1 -1
- data/ext/pg_query/include/{utils → postgres/utils}/portal.h +1 -1
- data/ext/pg_query/include/{utils → postgres/utils}/probes.h +6 -6
- data/ext/pg_query/include/postgres/utils/ps_status.h +47 -0
- data/ext/pg_query/include/{utils → postgres/utils}/queryenvironment.h +1 -1
- data/ext/pg_query/include/{utils → postgres/utils}/regproc.h +3 -3
- data/ext/pg_query/include/{utils → postgres/utils}/rel.h +60 -43
- data/ext/pg_query/include/{utils → postgres/utils}/relcache.h +13 -8
- data/ext/pg_query/include/{utils → postgres/utils}/reltrigger.h +1 -1
- data/ext/pg_query/include/{utils → postgres/utils}/resowner.h +1 -1
- data/ext/pg_query/include/{utils → postgres/utils}/ruleutils.h +6 -1
- data/ext/pg_query/include/{utils → postgres/utils}/sharedtuplestore.h +1 -1
- data/ext/pg_query/include/{utils → postgres/utils}/snapmgr.h +4 -2
- data/ext/pg_query/include/{utils → postgres/utils}/snapshot.h +1 -1
- data/ext/pg_query/include/{utils → postgres/utils}/sortsupport.h +2 -2
- data/ext/pg_query/include/{utils → postgres/utils}/syscache.h +4 -1
- data/ext/pg_query/include/{utils → postgres/utils}/timeout.h +1 -1
- data/ext/pg_query/include/{utils → postgres/utils}/timestamp.h +41 -11
- data/ext/pg_query/include/{utils → postgres/utils}/tuplesort.h +189 -35
- data/ext/pg_query/include/{utils → postgres/utils}/tuplestore.h +1 -1
- data/ext/pg_query/include/{utils → postgres/utils}/typcache.h +1 -1
- data/ext/pg_query/include/{utils → postgres/utils}/varlena.h +13 -1
- data/ext/pg_query/include/{utils → postgres/utils}/wait_event.h +9 -4
- data/ext/pg_query/include/{utils → postgres/utils}/xml.h +15 -5
- data/ext/pg_query/include/{postgres.h → postgres/varatt.h} +7 -457
- data/ext/pg_query/include/protobuf/pg_query.pb-c.h +6186 -5585
- data/ext/pg_query/include/protobuf/pg_query.pb.h +112443 -91222
- data/ext/pg_query/pg_query.c +10 -1
- data/ext/pg_query/pg_query.pb-c.c +19755 -17757
- 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 +1 -1
- data/ext/pg_query/pg_query_outfuncs_json.c +6 -0
- 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 +7 -5
- data/ext/pg_query/pg_query_readfuncs_protobuf.c +1 -0
- data/ext/pg_query/pg_query_ruby.c +5 -0
- data/ext/pg_query/pg_query_ruby_freebsd.sym +2 -0
- data/ext/pg_query/pg_query_scan.c +1 -1
- data/ext/pg_query/pg_query_split.c +3 -3
- data/ext/pg_query/postgres_deparse.c +11067 -0
- data/ext/pg_query/postgres_deparse.h +9 -0
- data/ext/pg_query/src_backend_catalog_namespace.c +7 -2
- data/ext/pg_query/src_backend_catalog_pg_proc.c +1 -1
- data/ext/pg_query/src_backend_commands_define.c +1 -1
- data/ext/pg_query/src_backend_nodes_bitmapset.c +11 -70
- 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 +14 -2
- data/ext/pg_query/src_backend_nodes_makefuncs.c +95 -1
- data/ext/pg_query/src_backend_nodes_nodeFuncs.c +283 -132
- data/ext/pg_query/src_backend_nodes_nodes.c +38 -0
- data/ext/pg_query/src_backend_nodes_value.c +1 -1
- data/ext/pg_query/src_backend_parser_gram.c +33208 -31806
- data/ext/pg_query/src_backend_parser_parser.c +28 -2
- data/ext/pg_query/src_backend_parser_scan.c +4318 -3329
- data/ext/pg_query/src_backend_parser_scansup.c +1 -1
- data/ext/pg_query/src_backend_storage_ipc_ipc.c +1 -1
- data/ext/pg_query/src_backend_tcop_postgres.c +66 -87
- data/ext/pg_query/src_backend_utils_activity_pgstat_database.c +1 -1
- data/ext/pg_query/src_backend_utils_adt_datum.c +5 -7
- 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 +489 -0
- data/ext/pg_query/src_backend_utils_adt_ruleutils.c +79 -5
- data/ext/pg_query/src_backend_utils_error_assert.c +4 -7
- data/ext/pg_query/src_backend_utils_error_elog.c +371 -249
- data/ext/pg_query/src_backend_utils_fmgr_fmgr.c +33 -1
- data/ext/pg_query/src_backend_utils_init_globals.c +6 -3
- data/ext/pg_query/src_backend_utils_mb_mbutils.c +21 -67
- data/ext/pg_query/src_backend_utils_misc_guc_tables.c +492 -0
- data/ext/pg_query/src_backend_utils_mmgr_alignedalloc.c +163 -0
- data/ext/pg_query/src_backend_utils_mmgr_aset.c +449 -312
- data/ext/pg_query/src_backend_utils_mmgr_generation.c +1039 -0
- data/ext/pg_query/src_backend_utils_mmgr_mcxt.c +398 -49
- data/ext/pg_query/src_backend_utils_mmgr_slab.c +1021 -0
- data/ext/pg_query/src_common_encnames.c +4 -1
- 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 +534 -510
- data/ext/pg_query/src_common_kwlookup.c +1 -1
- data/ext/pg_query/src_common_psprintf.c +1 -1
- data/ext/pg_query/src_common_stringinfo.c +4 -4
- data/ext/pg_query/src_common_wchar.c +9 -8
- data/ext/pg_query/src_pl_plpgsql_src_pl_comp.c +1 -1
- data/ext/pg_query/src_pl_plpgsql_src_pl_funcs.c +3 -1
- data/ext/pg_query/src_pl_plpgsql_src_pl_gram.c +661 -694
- 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 +1 -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 +79 -5
- data/ext/pg_query/src_port_pgstrcasecmp.c +29 -1
- data/ext/pg_query/src_port_snprintf.c +6 -10
- data/ext/pg_query/src_port_strerror.c +1 -1
- data/ext/pg_query/src_port_strlcpy.c +79 -0
- data/lib/pg_query/fingerprint.rb +2 -3
- data/lib/pg_query/node.rb +16 -11
- data/lib/pg_query/parse.rb +1 -1
- data/lib/pg_query/pg_query_pb.rb +166 -3191
- data/lib/pg_query/treewalker.rb +23 -5
- data/lib/pg_query/version.rb +1 -1
- metadata +432 -380
- data/ext/pg_query/guc-file.c +0 -0
- 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/commands/variable.h +0 -38
- data/ext/pg_query/include/common/ip.h +0 -31
- data/ext/pg_query/include/getaddrinfo.h +0 -162
- data/ext/pg_query/include/kwlist_d.h +0 -1095
- data/ext/pg_query/include/parser/gram.h +0 -1101
- data/ext/pg_query/include/pg_config_os.h +0 -8
- data/ext/pg_query/include/portability/instr_time.h +0 -256
- data/ext/pg_query/include/postmaster/auxprocess.h +0 -20
- data/ext/pg_query/include/postmaster/fork_process.h +0 -17
- data/ext/pg_query/include/postmaster/pgarch.h +0 -73
- data/ext/pg_query/include/replication/logicalworker.h +0 -19
- data/ext/pg_query/include/storage/relfilenode.h +0 -99
- data/ext/pg_query/include/utils/dynahash.h +0 -20
- data/ext/pg_query/include/utils/pg_lsn.h +0 -29
- data/ext/pg_query/include/utils/pidfile.h +0 -56
- data/ext/pg_query/include/utils/ps_status.h +0 -25
- data/ext/pg_query/include/utils/rls.h +0 -50
- data/ext/pg_query/include/utils/tzparser.h +0 -39
- 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/include/{access → postgres/access}/rmgr.h +0 -0
- /data/ext/pg_query/include/{pg_config_ext.h → postgres/pg_config_ext.h} +0 -0
- /data/ext/pg_query/include/{plerrcodes.h → postgres/plerrcodes.h} +0 -0
- /data/ext/pg_query/include/{storage → postgres/storage}/lwlocknames.h +0 -0
- /data/ext/pg_query/include/{utils → postgres/utils}/errcodes.h +0 -0
|
@@ -10,10 +10,21 @@
|
|
|
10
10
|
* - MemoryContextCallResetCallbacks
|
|
11
11
|
* - MemoryContextResetOnly
|
|
12
12
|
* - repalloc
|
|
13
|
+
* - GetMemoryChunkContext
|
|
13
14
|
* - MemoryContextStats
|
|
14
15
|
* - MemoryContextStatsDetail
|
|
15
16
|
* - MemoryContextStatsInternal
|
|
16
17
|
* - MemoryContextStatsPrint
|
|
18
|
+
* - mcxt_methods
|
|
19
|
+
* - GetMemoryChunkSpace
|
|
20
|
+
* - MemoryContextAllocAligned
|
|
21
|
+
* - MemoryContextAllocExtended
|
|
22
|
+
* - BogusFree
|
|
23
|
+
* - GetMemoryChunkHeader
|
|
24
|
+
* - BogusRealloc
|
|
25
|
+
* - BogusGetChunkContext
|
|
26
|
+
* - BogusGetChunkSpace
|
|
27
|
+
* - GetMemoryChunkMethodID
|
|
17
28
|
* - pfree
|
|
18
29
|
* - pstrdup
|
|
19
30
|
* - MemoryContextStrdup
|
|
@@ -43,7 +54,7 @@
|
|
|
43
54
|
* context's MemoryContextMethods struct.
|
|
44
55
|
*
|
|
45
56
|
*
|
|
46
|
-
* Portions Copyright (c) 1996-
|
|
57
|
+
* Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group
|
|
47
58
|
* Portions Copyright (c) 1994, Regents of the University of California
|
|
48
59
|
*
|
|
49
60
|
*
|
|
@@ -63,12 +74,105 @@
|
|
|
63
74
|
#include "utils/fmgrprotos.h"
|
|
64
75
|
#include "utils/memdebug.h"
|
|
65
76
|
#include "utils/memutils.h"
|
|
77
|
+
#include "utils/memutils_internal.h"
|
|
78
|
+
#include "utils/memutils_memorychunk.h"
|
|
79
|
+
|
|
66
80
|
|
|
81
|
+
static void BogusFree(void *pointer);
|
|
82
|
+
static void *BogusRealloc(void *pointer, Size size);
|
|
83
|
+
static MemoryContext BogusGetChunkContext(void *pointer);
|
|
84
|
+
static Size BogusGetChunkSpace(void *pointer);
|
|
67
85
|
|
|
68
86
|
/*****************************************************************************
|
|
69
87
|
* GLOBAL MEMORY *
|
|
70
88
|
*****************************************************************************/
|
|
71
89
|
|
|
90
|
+
static const MemoryContextMethods mcxt_methods[] = {
|
|
91
|
+
/* aset.c */
|
|
92
|
+
[MCTX_ASET_ID].alloc = AllocSetAlloc,
|
|
93
|
+
[MCTX_ASET_ID].free_p = AllocSetFree,
|
|
94
|
+
[MCTX_ASET_ID].realloc = AllocSetRealloc,
|
|
95
|
+
[MCTX_ASET_ID].reset = AllocSetReset,
|
|
96
|
+
[MCTX_ASET_ID].delete_context = AllocSetDelete,
|
|
97
|
+
[MCTX_ASET_ID].get_chunk_context = AllocSetGetChunkContext,
|
|
98
|
+
[MCTX_ASET_ID].get_chunk_space = AllocSetGetChunkSpace,
|
|
99
|
+
[MCTX_ASET_ID].is_empty = AllocSetIsEmpty,
|
|
100
|
+
[MCTX_ASET_ID].stats = AllocSetStats,
|
|
101
|
+
#ifdef MEMORY_CONTEXT_CHECKING
|
|
102
|
+
[MCTX_ASET_ID].check = AllocSetCheck,
|
|
103
|
+
#endif
|
|
104
|
+
|
|
105
|
+
/* generation.c */
|
|
106
|
+
[MCTX_GENERATION_ID].alloc = GenerationAlloc,
|
|
107
|
+
[MCTX_GENERATION_ID].free_p = GenerationFree,
|
|
108
|
+
[MCTX_GENERATION_ID].realloc = GenerationRealloc,
|
|
109
|
+
[MCTX_GENERATION_ID].reset = GenerationReset,
|
|
110
|
+
[MCTX_GENERATION_ID].delete_context = GenerationDelete,
|
|
111
|
+
[MCTX_GENERATION_ID].get_chunk_context = GenerationGetChunkContext,
|
|
112
|
+
[MCTX_GENERATION_ID].get_chunk_space = GenerationGetChunkSpace,
|
|
113
|
+
[MCTX_GENERATION_ID].is_empty = GenerationIsEmpty,
|
|
114
|
+
[MCTX_GENERATION_ID].stats = GenerationStats,
|
|
115
|
+
#ifdef MEMORY_CONTEXT_CHECKING
|
|
116
|
+
[MCTX_GENERATION_ID].check = GenerationCheck,
|
|
117
|
+
#endif
|
|
118
|
+
|
|
119
|
+
/* slab.c */
|
|
120
|
+
[MCTX_SLAB_ID].alloc = SlabAlloc,
|
|
121
|
+
[MCTX_SLAB_ID].free_p = SlabFree,
|
|
122
|
+
[MCTX_SLAB_ID].realloc = SlabRealloc,
|
|
123
|
+
[MCTX_SLAB_ID].reset = SlabReset,
|
|
124
|
+
[MCTX_SLAB_ID].delete_context = SlabDelete,
|
|
125
|
+
[MCTX_SLAB_ID].get_chunk_context = SlabGetChunkContext,
|
|
126
|
+
[MCTX_SLAB_ID].get_chunk_space = SlabGetChunkSpace,
|
|
127
|
+
[MCTX_SLAB_ID].is_empty = SlabIsEmpty,
|
|
128
|
+
[MCTX_SLAB_ID].stats = SlabStats,
|
|
129
|
+
#ifdef MEMORY_CONTEXT_CHECKING
|
|
130
|
+
[MCTX_SLAB_ID].check = SlabCheck,
|
|
131
|
+
#endif
|
|
132
|
+
|
|
133
|
+
/* alignedalloc.c */
|
|
134
|
+
[MCTX_ALIGNED_REDIRECT_ID].alloc = NULL, /* not required */
|
|
135
|
+
[MCTX_ALIGNED_REDIRECT_ID].free_p = AlignedAllocFree,
|
|
136
|
+
[MCTX_ALIGNED_REDIRECT_ID].realloc = AlignedAllocRealloc,
|
|
137
|
+
[MCTX_ALIGNED_REDIRECT_ID].reset = NULL, /* not required */
|
|
138
|
+
[MCTX_ALIGNED_REDIRECT_ID].delete_context = NULL, /* not required */
|
|
139
|
+
[MCTX_ALIGNED_REDIRECT_ID].get_chunk_context = AlignedAllocGetChunkContext,
|
|
140
|
+
[MCTX_ALIGNED_REDIRECT_ID].get_chunk_space = AlignedAllocGetChunkSpace,
|
|
141
|
+
[MCTX_ALIGNED_REDIRECT_ID].is_empty = NULL, /* not required */
|
|
142
|
+
[MCTX_ALIGNED_REDIRECT_ID].stats = NULL, /* not required */
|
|
143
|
+
#ifdef MEMORY_CONTEXT_CHECKING
|
|
144
|
+
[MCTX_ALIGNED_REDIRECT_ID].check = NULL, /* not required */
|
|
145
|
+
#endif
|
|
146
|
+
|
|
147
|
+
|
|
148
|
+
/*
|
|
149
|
+
* Unused (as yet) IDs should have dummy entries here. This allows us to
|
|
150
|
+
* fail cleanly if a bogus pointer is passed to pfree or the like. It
|
|
151
|
+
* seems sufficient to provide routines for the methods that might get
|
|
152
|
+
* invoked from inspection of a chunk (see MCXT_METHOD calls below).
|
|
153
|
+
*/
|
|
154
|
+
|
|
155
|
+
[MCTX_UNUSED1_ID].free_p = BogusFree,
|
|
156
|
+
[MCTX_UNUSED1_ID].realloc = BogusRealloc,
|
|
157
|
+
[MCTX_UNUSED1_ID].get_chunk_context = BogusGetChunkContext,
|
|
158
|
+
[MCTX_UNUSED1_ID].get_chunk_space = BogusGetChunkSpace,
|
|
159
|
+
|
|
160
|
+
[MCTX_UNUSED2_ID].free_p = BogusFree,
|
|
161
|
+
[MCTX_UNUSED2_ID].realloc = BogusRealloc,
|
|
162
|
+
[MCTX_UNUSED2_ID].get_chunk_context = BogusGetChunkContext,
|
|
163
|
+
[MCTX_UNUSED2_ID].get_chunk_space = BogusGetChunkSpace,
|
|
164
|
+
|
|
165
|
+
[MCTX_UNUSED3_ID].free_p = BogusFree,
|
|
166
|
+
[MCTX_UNUSED3_ID].realloc = BogusRealloc,
|
|
167
|
+
[MCTX_UNUSED3_ID].get_chunk_context = BogusGetChunkContext,
|
|
168
|
+
[MCTX_UNUSED3_ID].get_chunk_space = BogusGetChunkSpace,
|
|
169
|
+
|
|
170
|
+
[MCTX_UNUSED4_ID].free_p = BogusFree,
|
|
171
|
+
[MCTX_UNUSED4_ID].realloc = BogusRealloc,
|
|
172
|
+
[MCTX_UNUSED4_ID].get_chunk_context = BogusGetChunkContext,
|
|
173
|
+
[MCTX_UNUSED4_ID].get_chunk_space = BogusGetChunkSpace,
|
|
174
|
+
};
|
|
175
|
+
|
|
72
176
|
/*
|
|
73
177
|
* CurrentMemoryContext
|
|
74
178
|
* Default memory context for allocations.
|
|
@@ -110,6 +214,100 @@ static void MemoryContextStatsPrint(MemoryContext context, void *passthru,
|
|
|
110
214
|
#define AssertNotInCriticalSection(context) \
|
|
111
215
|
Assert(CritSectionCount == 0 || (context)->allowInCritSection)
|
|
112
216
|
|
|
217
|
+
/*
|
|
218
|
+
* Call the given function in the MemoryContextMethods for the memory context
|
|
219
|
+
* type that 'pointer' belongs to.
|
|
220
|
+
*/
|
|
221
|
+
#define MCXT_METHOD(pointer, method) \
|
|
222
|
+
mcxt_methods[GetMemoryChunkMethodID(pointer)].method
|
|
223
|
+
|
|
224
|
+
/*
|
|
225
|
+
* GetMemoryChunkMethodID
|
|
226
|
+
* Return the MemoryContextMethodID from the uint64 chunk header which
|
|
227
|
+
* directly precedes 'pointer'.
|
|
228
|
+
*/
|
|
229
|
+
static inline MemoryContextMethodID
|
|
230
|
+
GetMemoryChunkMethodID(const void *pointer)
|
|
231
|
+
{
|
|
232
|
+
uint64 header;
|
|
233
|
+
|
|
234
|
+
/*
|
|
235
|
+
* Try to detect bogus pointers handed to us, poorly though we can.
|
|
236
|
+
* Presumably, a pointer that isn't MAXALIGNED isn't pointing at an
|
|
237
|
+
* allocated chunk.
|
|
238
|
+
*/
|
|
239
|
+
Assert(pointer == (const void *) MAXALIGN(pointer));
|
|
240
|
+
|
|
241
|
+
/* Allow access to the uint64 header */
|
|
242
|
+
VALGRIND_MAKE_MEM_DEFINED((char *) pointer - sizeof(uint64), sizeof(uint64));
|
|
243
|
+
|
|
244
|
+
header = *((const uint64 *) ((const char *) pointer - sizeof(uint64)));
|
|
245
|
+
|
|
246
|
+
/* Disallow access to the uint64 header */
|
|
247
|
+
VALGRIND_MAKE_MEM_NOACCESS((char *) pointer - sizeof(uint64), sizeof(uint64));
|
|
248
|
+
|
|
249
|
+
return (MemoryContextMethodID) (header & MEMORY_CONTEXT_METHODID_MASK);
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
/*
|
|
253
|
+
* GetMemoryChunkHeader
|
|
254
|
+
* Return the uint64 chunk header which directly precedes 'pointer'.
|
|
255
|
+
*
|
|
256
|
+
* This is only used after GetMemoryChunkMethodID, so no need for error checks.
|
|
257
|
+
*/
|
|
258
|
+
static inline uint64
|
|
259
|
+
GetMemoryChunkHeader(const void *pointer)
|
|
260
|
+
{
|
|
261
|
+
uint64 header;
|
|
262
|
+
|
|
263
|
+
/* Allow access to the uint64 header */
|
|
264
|
+
VALGRIND_MAKE_MEM_DEFINED((char *) pointer - sizeof(uint64), sizeof(uint64));
|
|
265
|
+
|
|
266
|
+
header = *((const uint64 *) ((const char *) pointer - sizeof(uint64)));
|
|
267
|
+
|
|
268
|
+
/* Disallow access to the uint64 header */
|
|
269
|
+
VALGRIND_MAKE_MEM_NOACCESS((char *) pointer - sizeof(uint64), sizeof(uint64));
|
|
270
|
+
|
|
271
|
+
return header;
|
|
272
|
+
}
|
|
273
|
+
|
|
274
|
+
/*
|
|
275
|
+
* Support routines to trap use of invalid memory context method IDs
|
|
276
|
+
* (from calling pfree or the like on a bogus pointer). As a possible
|
|
277
|
+
* aid in debugging, we report the header word along with the pointer
|
|
278
|
+
* address (if we got here, there must be an accessible header word).
|
|
279
|
+
*/
|
|
280
|
+
static void
|
|
281
|
+
BogusFree(void *pointer)
|
|
282
|
+
{
|
|
283
|
+
elog(ERROR, "pfree called with invalid pointer %p (header 0x%016llx)",
|
|
284
|
+
pointer, (unsigned long long) GetMemoryChunkHeader(pointer));
|
|
285
|
+
}
|
|
286
|
+
|
|
287
|
+
static void *
|
|
288
|
+
BogusRealloc(void *pointer, Size size)
|
|
289
|
+
{
|
|
290
|
+
elog(ERROR, "repalloc called with invalid pointer %p (header 0x%016llx)",
|
|
291
|
+
pointer, (unsigned long long) GetMemoryChunkHeader(pointer));
|
|
292
|
+
return NULL; /* keep compiler quiet */
|
|
293
|
+
}
|
|
294
|
+
|
|
295
|
+
static MemoryContext
|
|
296
|
+
BogusGetChunkContext(void *pointer)
|
|
297
|
+
{
|
|
298
|
+
elog(ERROR, "GetMemoryChunkContext called with invalid pointer %p (header 0x%016llx)",
|
|
299
|
+
pointer, (unsigned long long) GetMemoryChunkHeader(pointer));
|
|
300
|
+
return NULL; /* keep compiler quiet */
|
|
301
|
+
}
|
|
302
|
+
|
|
303
|
+
static Size
|
|
304
|
+
BogusGetChunkSpace(void *pointer)
|
|
305
|
+
{
|
|
306
|
+
elog(ERROR, "GetMemoryChunkSpace called with invalid pointer %p (header 0x%016llx)",
|
|
307
|
+
pointer, (unsigned long long) GetMemoryChunkHeader(pointer));
|
|
308
|
+
return 0; /* keep compiler quiet */
|
|
309
|
+
}
|
|
310
|
+
|
|
113
311
|
|
|
114
312
|
/*****************************************************************************
|
|
115
313
|
* EXPORTED ROUTINES *
|
|
@@ -135,7 +333,7 @@ static void MemoryContextStatsPrint(MemoryContext context, void *passthru,
|
|
|
135
333
|
void
|
|
136
334
|
MemoryContextInit(void)
|
|
137
335
|
{
|
|
138
|
-
|
|
336
|
+
Assert(TopMemoryContext == NULL);
|
|
139
337
|
|
|
140
338
|
/*
|
|
141
339
|
* First, initialize TopMemoryContext, which is the parent of all others.
|
|
@@ -179,7 +377,7 @@ MemoryContextInit(void)
|
|
|
179
377
|
void
|
|
180
378
|
MemoryContextReset(MemoryContext context)
|
|
181
379
|
{
|
|
182
|
-
|
|
380
|
+
Assert(MemoryContextIsValid(context));
|
|
183
381
|
|
|
184
382
|
/* save a function call in common case where there are no children */
|
|
185
383
|
if (context->firstchild != NULL)
|
|
@@ -198,7 +396,7 @@ MemoryContextReset(MemoryContext context)
|
|
|
198
396
|
void
|
|
199
397
|
MemoryContextResetOnly(MemoryContext context)
|
|
200
398
|
{
|
|
201
|
-
|
|
399
|
+
Assert(MemoryContextIsValid(context));
|
|
202
400
|
|
|
203
401
|
/* Nothing to do if no pallocs since startup or last reset */
|
|
204
402
|
if (!context->isReset)
|
|
@@ -209,10 +407,8 @@ MemoryContextResetOnly(MemoryContext context)
|
|
|
209
407
|
* If context->ident points into the context's memory, it will become
|
|
210
408
|
* a dangling pointer. We could prevent that by setting it to NULL
|
|
211
409
|
* here, but that would break valid coding patterns that keep the
|
|
212
|
-
* ident elsewhere, e.g. in a parent context.
|
|
213
|
-
*
|
|
214
|
-
* in separately-palloc'd chunks, so that risks false positives. So
|
|
215
|
-
* for now we assume the programmer got it right.
|
|
410
|
+
* ident elsewhere, e.g. in a parent context. So for now we assume
|
|
411
|
+
* the programmer got it right.
|
|
216
412
|
*/
|
|
217
413
|
|
|
218
414
|
context->methods->reset(context);
|
|
@@ -242,7 +438,7 @@ MemoryContextResetOnly(MemoryContext context)
|
|
|
242
438
|
void
|
|
243
439
|
MemoryContextDelete(MemoryContext context)
|
|
244
440
|
{
|
|
245
|
-
|
|
441
|
+
Assert(MemoryContextIsValid(context));
|
|
246
442
|
/* We had better not be deleting TopMemoryContext ... */
|
|
247
443
|
Assert(context != TopMemoryContext);
|
|
248
444
|
/* And not CurrentMemoryContext, either */
|
|
@@ -287,7 +483,7 @@ MemoryContextDelete(MemoryContext context)
|
|
|
287
483
|
void
|
|
288
484
|
MemoryContextDeleteChildren(MemoryContext context)
|
|
289
485
|
{
|
|
290
|
-
|
|
486
|
+
Assert(MemoryContextIsValid(context));
|
|
291
487
|
|
|
292
488
|
/*
|
|
293
489
|
* MemoryContextDelete will delink the child from me, so just iterate as
|
|
@@ -369,8 +565,8 @@ MemoryContextCallResetCallbacks(MemoryContext context)
|
|
|
369
565
|
void
|
|
370
566
|
MemoryContextSetParent(MemoryContext context, MemoryContext new_parent)
|
|
371
567
|
{
|
|
372
|
-
|
|
373
|
-
|
|
568
|
+
Assert(MemoryContextIsValid(context));
|
|
569
|
+
Assert(context != new_parent);
|
|
374
570
|
|
|
375
571
|
/* Fast path if it's got correct parent already */
|
|
376
572
|
if (new_parent == context->parent)
|
|
@@ -396,7 +592,7 @@ MemoryContextSetParent(MemoryContext context, MemoryContext new_parent)
|
|
|
396
592
|
/* And relink */
|
|
397
593
|
if (new_parent)
|
|
398
594
|
{
|
|
399
|
-
|
|
595
|
+
Assert(MemoryContextIsValid(new_parent));
|
|
400
596
|
context->parent = new_parent;
|
|
401
597
|
context->prevchild = NULL;
|
|
402
598
|
context->nextchild = new_parent->firstchild;
|
|
@@ -426,11 +622,22 @@ MemoryContextSetParent(MemoryContext context, MemoryContext new_parent)
|
|
|
426
622
|
void
|
|
427
623
|
MemoryContextAllowInCriticalSection(MemoryContext context, bool allow)
|
|
428
624
|
{
|
|
429
|
-
|
|
625
|
+
Assert(MemoryContextIsValid(context));
|
|
430
626
|
|
|
431
627
|
context->allowInCritSection = allow;
|
|
432
628
|
}
|
|
433
629
|
|
|
630
|
+
/*
|
|
631
|
+
* GetMemoryChunkContext
|
|
632
|
+
* Given a currently-allocated chunk, determine the MemoryContext that
|
|
633
|
+
* the chunk belongs to.
|
|
634
|
+
*/
|
|
635
|
+
MemoryContext
|
|
636
|
+
GetMemoryChunkContext(void *pointer)
|
|
637
|
+
{
|
|
638
|
+
return MCXT_METHOD(pointer, get_chunk_context) (pointer);
|
|
639
|
+
}
|
|
640
|
+
|
|
434
641
|
/*
|
|
435
642
|
* GetMemoryChunkSpace
|
|
436
643
|
* Given a currently-allocated chunk, determine the total space
|
|
@@ -439,7 +646,11 @@ MemoryContextAllowInCriticalSection(MemoryContext context, bool allow)
|
|
|
439
646
|
* This is useful for measuring the total space occupied by a set of
|
|
440
647
|
* allocated chunks.
|
|
441
648
|
*/
|
|
442
|
-
|
|
649
|
+
Size
|
|
650
|
+
GetMemoryChunkSpace(void *pointer)
|
|
651
|
+
{
|
|
652
|
+
return MCXT_METHOD(pointer, get_chunk_space) (pointer);
|
|
653
|
+
}
|
|
443
654
|
|
|
444
655
|
/*
|
|
445
656
|
* MemoryContextGetParent
|
|
@@ -505,10 +716,10 @@ MemoryContextStatsDetail(MemoryContext context, int max_children,
|
|
|
505
716
|
* to the connected client.
|
|
506
717
|
*
|
|
507
718
|
* We don't buffer the information about all memory contexts in a
|
|
508
|
-
* backend into StringInfo and log it as one message.
|
|
509
|
-
*
|
|
510
|
-
*
|
|
511
|
-
*
|
|
719
|
+
* backend into StringInfo and log it as one message. That would
|
|
720
|
+
* require the buffer to be enlarged, risking an OOM as there could be
|
|
721
|
+
* a large number of memory contexts in a backend. Instead, we log
|
|
722
|
+
* one message per memory context.
|
|
512
723
|
*/
|
|
513
724
|
ereport(LOG_SERVER_ONLY,
|
|
514
725
|
(errhidestmt(true),
|
|
@@ -536,7 +747,7 @@ MemoryContextStatsInternal(MemoryContext context, int level,
|
|
|
536
747
|
MemoryContext child;
|
|
537
748
|
int ichild;
|
|
538
749
|
|
|
539
|
-
|
|
750
|
+
Assert(MemoryContextIsValid(context));
|
|
540
751
|
|
|
541
752
|
/* Examine the context itself */
|
|
542
753
|
context->methods->stats(context,
|
|
@@ -699,19 +910,6 @@ MemoryContextStatsPrint(MemoryContext context, void *passthru,
|
|
|
699
910
|
|
|
700
911
|
#endif
|
|
701
912
|
|
|
702
|
-
/*
|
|
703
|
-
* MemoryContextContains
|
|
704
|
-
* Detect whether an allocated chunk of memory belongs to a given
|
|
705
|
-
* context or not.
|
|
706
|
-
*
|
|
707
|
-
* Caution: this test is reliable as long as 'pointer' does point to
|
|
708
|
-
* a chunk of memory allocated from *some* context. If 'pointer' points
|
|
709
|
-
* at memory obtained in some other way, there is a small chance of a
|
|
710
|
-
* false-positive result, since the bits right before it might look like
|
|
711
|
-
* a valid chunk header by chance.
|
|
712
|
-
*/
|
|
713
|
-
|
|
714
|
-
|
|
715
913
|
/*
|
|
716
914
|
* MemoryContextCreate
|
|
717
915
|
* Context-type-independent part of context creation.
|
|
@@ -737,7 +935,7 @@ MemoryContextStatsPrint(MemoryContext context, void *passthru,
|
|
|
737
935
|
*
|
|
738
936
|
* node: the as-yet-uninitialized common part of the context header node.
|
|
739
937
|
* tag: NodeTag code identifying the memory context type.
|
|
740
|
-
*
|
|
938
|
+
* method_id: MemoryContextMethodID of the context-type being created.
|
|
741
939
|
* parent: parent context, or NULL if this will be a top-level context.
|
|
742
940
|
* name: name of context (must be statically allocated).
|
|
743
941
|
*
|
|
@@ -747,7 +945,7 @@ MemoryContextStatsPrint(MemoryContext context, void *passthru,
|
|
|
747
945
|
void
|
|
748
946
|
MemoryContextCreate(MemoryContext node,
|
|
749
947
|
NodeTag tag,
|
|
750
|
-
|
|
948
|
+
MemoryContextMethodID method_id,
|
|
751
949
|
MemoryContext parent,
|
|
752
950
|
const char *name)
|
|
753
951
|
{
|
|
@@ -757,7 +955,7 @@ MemoryContextCreate(MemoryContext node,
|
|
|
757
955
|
/* Initialize all standard fields of memory context header */
|
|
758
956
|
node->type = tag;
|
|
759
957
|
node->isReset = true;
|
|
760
|
-
node->methods =
|
|
958
|
+
node->methods = &mcxt_methods[method_id];
|
|
761
959
|
node->parent = parent;
|
|
762
960
|
node->firstchild = NULL;
|
|
763
961
|
node->mem_allocated = 0;
|
|
@@ -797,7 +995,7 @@ MemoryContextAlloc(MemoryContext context, Size size)
|
|
|
797
995
|
{
|
|
798
996
|
void *ret;
|
|
799
997
|
|
|
800
|
-
|
|
998
|
+
Assert(MemoryContextIsValid(context));
|
|
801
999
|
AssertNotInCriticalSection(context);
|
|
802
1000
|
|
|
803
1001
|
if (!AllocSizeIsValid(size))
|
|
@@ -840,7 +1038,7 @@ MemoryContextAllocZero(MemoryContext context, Size size)
|
|
|
840
1038
|
{
|
|
841
1039
|
void *ret;
|
|
842
1040
|
|
|
843
|
-
|
|
1041
|
+
Assert(MemoryContextIsValid(context));
|
|
844
1042
|
AssertNotInCriticalSection(context);
|
|
845
1043
|
|
|
846
1044
|
if (!AllocSizeIsValid(size))
|
|
@@ -878,7 +1076,7 @@ MemoryContextAllocZeroAligned(MemoryContext context, Size size)
|
|
|
878
1076
|
{
|
|
879
1077
|
void *ret;
|
|
880
1078
|
|
|
881
|
-
|
|
1079
|
+
Assert(MemoryContextIsValid(context));
|
|
882
1080
|
AssertNotInCriticalSection(context);
|
|
883
1081
|
|
|
884
1082
|
if (!AllocSizeIsValid(size))
|
|
@@ -913,11 +1111,11 @@ MemoryContextAllocExtended(MemoryContext context, Size size, int flags)
|
|
|
913
1111
|
{
|
|
914
1112
|
void *ret;
|
|
915
1113
|
|
|
916
|
-
|
|
1114
|
+
Assert(MemoryContextIsValid(context));
|
|
917
1115
|
AssertNotInCriticalSection(context);
|
|
918
1116
|
|
|
919
|
-
if (((flags & MCXT_ALLOC_HUGE) != 0
|
|
920
|
-
|
|
1117
|
+
if (!((flags & MCXT_ALLOC_HUGE) != 0 ? AllocHugeSizeIsValid(size) :
|
|
1118
|
+
AllocSizeIsValid(size)))
|
|
921
1119
|
elog(ERROR, "invalid memory alloc request size %zu", size);
|
|
922
1120
|
|
|
923
1121
|
context->isReset = false;
|
|
@@ -973,7 +1171,7 @@ palloc(Size size)
|
|
|
973
1171
|
void *ret;
|
|
974
1172
|
MemoryContext context = CurrentMemoryContext;
|
|
975
1173
|
|
|
976
|
-
|
|
1174
|
+
Assert(MemoryContextIsValid(context));
|
|
977
1175
|
AssertNotInCriticalSection(context);
|
|
978
1176
|
|
|
979
1177
|
if (!AllocSizeIsValid(size))
|
|
@@ -1004,7 +1202,7 @@ palloc0(Size size)
|
|
|
1004
1202
|
void *ret;
|
|
1005
1203
|
MemoryContext context = CurrentMemoryContext;
|
|
1006
1204
|
|
|
1007
|
-
|
|
1205
|
+
Assert(MemoryContextIsValid(context));
|
|
1008
1206
|
AssertNotInCriticalSection(context);
|
|
1009
1207
|
|
|
1010
1208
|
if (!AllocSizeIsValid(size))
|
|
@@ -1032,6 +1230,125 @@ palloc0(Size size)
|
|
|
1032
1230
|
|
|
1033
1231
|
|
|
1034
1232
|
|
|
1233
|
+
/*
|
|
1234
|
+
* MemoryContextAllocAligned
|
|
1235
|
+
* Allocate 'size' bytes of memory in 'context' aligned to 'alignto'
|
|
1236
|
+
* bytes.
|
|
1237
|
+
*
|
|
1238
|
+
* Currently, we align addresses by requesting additional bytes from the
|
|
1239
|
+
* MemoryContext's standard allocator function and then aligning the returned
|
|
1240
|
+
* address by the required alignment. This means that the given MemoryContext
|
|
1241
|
+
* must support providing us with a chunk of memory that's larger than 'size'.
|
|
1242
|
+
* For allocators such as Slab, that's not going to work, as slab only allows
|
|
1243
|
+
* chunks of the size that's specified when the context is created.
|
|
1244
|
+
*
|
|
1245
|
+
* 'alignto' must be a power of 2.
|
|
1246
|
+
* 'flags' may be 0 or set the same as MemoryContextAllocExtended().
|
|
1247
|
+
*/
|
|
1248
|
+
void *
|
|
1249
|
+
MemoryContextAllocAligned(MemoryContext context,
|
|
1250
|
+
Size size, Size alignto, int flags)
|
|
1251
|
+
{
|
|
1252
|
+
MemoryChunk *alignedchunk;
|
|
1253
|
+
Size alloc_size;
|
|
1254
|
+
void *unaligned;
|
|
1255
|
+
void *aligned;
|
|
1256
|
+
|
|
1257
|
+
/* wouldn't make much sense to waste that much space */
|
|
1258
|
+
Assert(alignto < (128 * 1024 * 1024));
|
|
1259
|
+
|
|
1260
|
+
/* ensure alignto is a power of 2 */
|
|
1261
|
+
Assert((alignto & (alignto - 1)) == 0);
|
|
1262
|
+
|
|
1263
|
+
/*
|
|
1264
|
+
* If the alignment requirements are less than what we already guarantee
|
|
1265
|
+
* then just use the standard allocation function.
|
|
1266
|
+
*/
|
|
1267
|
+
if (unlikely(alignto <= MAXIMUM_ALIGNOF))
|
|
1268
|
+
return MemoryContextAllocExtended(context, size, flags);
|
|
1269
|
+
|
|
1270
|
+
/*
|
|
1271
|
+
* We implement aligned pointers by simply allocating enough memory for
|
|
1272
|
+
* the requested size plus the alignment and an additional "redirection"
|
|
1273
|
+
* MemoryChunk. This additional MemoryChunk is required for operations
|
|
1274
|
+
* such as pfree when used on the pointer returned by this function. We
|
|
1275
|
+
* use this redirection MemoryChunk in order to find the pointer to the
|
|
1276
|
+
* memory that was returned by the MemoryContextAllocExtended call below.
|
|
1277
|
+
* We do that by "borrowing" the block offset field and instead of using
|
|
1278
|
+
* that to find the offset into the owning block, we use it to find the
|
|
1279
|
+
* original allocated address.
|
|
1280
|
+
*
|
|
1281
|
+
* Here we must allocate enough extra memory so that we can still align
|
|
1282
|
+
* the pointer returned by MemoryContextAllocExtended and also have enough
|
|
1283
|
+
* space for the redirection MemoryChunk. Since allocations will already
|
|
1284
|
+
* be at least aligned by MAXIMUM_ALIGNOF, we can subtract that amount
|
|
1285
|
+
* from the allocation size to save a little memory.
|
|
1286
|
+
*/
|
|
1287
|
+
alloc_size = size + PallocAlignedExtraBytes(alignto);
|
|
1288
|
+
|
|
1289
|
+
#ifdef MEMORY_CONTEXT_CHECKING
|
|
1290
|
+
/* ensure there's space for a sentinel byte */
|
|
1291
|
+
alloc_size += 1;
|
|
1292
|
+
#endif
|
|
1293
|
+
|
|
1294
|
+
/* perform the actual allocation */
|
|
1295
|
+
unaligned = MemoryContextAllocExtended(context, alloc_size, flags);
|
|
1296
|
+
|
|
1297
|
+
/* set the aligned pointer */
|
|
1298
|
+
aligned = (void *) TYPEALIGN(alignto, (char *) unaligned +
|
|
1299
|
+
sizeof(MemoryChunk));
|
|
1300
|
+
|
|
1301
|
+
alignedchunk = PointerGetMemoryChunk(aligned);
|
|
1302
|
+
|
|
1303
|
+
/*
|
|
1304
|
+
* We set the redirect MemoryChunk so that the block offset calculation is
|
|
1305
|
+
* used to point back to the 'unaligned' allocated chunk. This allows us
|
|
1306
|
+
* to use MemoryChunkGetBlock() to find the unaligned chunk when we need
|
|
1307
|
+
* to perform operations such as pfree() and repalloc().
|
|
1308
|
+
*
|
|
1309
|
+
* We store 'alignto' in the MemoryChunk's 'value' so that we know what
|
|
1310
|
+
* the alignment was set to should we ever be asked to realloc this
|
|
1311
|
+
* pointer.
|
|
1312
|
+
*/
|
|
1313
|
+
MemoryChunkSetHdrMask(alignedchunk, unaligned, alignto,
|
|
1314
|
+
MCTX_ALIGNED_REDIRECT_ID);
|
|
1315
|
+
|
|
1316
|
+
/* double check we produced a correctly aligned pointer */
|
|
1317
|
+
Assert((void *) TYPEALIGN(alignto, aligned) == aligned);
|
|
1318
|
+
|
|
1319
|
+
#ifdef MEMORY_CONTEXT_CHECKING
|
|
1320
|
+
alignedchunk->requested_size = size;
|
|
1321
|
+
/* set mark to catch clobber of "unused" space */
|
|
1322
|
+
set_sentinel(aligned, size);
|
|
1323
|
+
#endif
|
|
1324
|
+
|
|
1325
|
+
/* Mark the bytes before the redirection header as noaccess */
|
|
1326
|
+
VALGRIND_MAKE_MEM_NOACCESS(unaligned,
|
|
1327
|
+
(char *) alignedchunk - (char *) unaligned);
|
|
1328
|
+
|
|
1329
|
+
/* Disallow access to the redirection chunk header. */
|
|
1330
|
+
VALGRIND_MAKE_MEM_NOACCESS(alignedchunk, sizeof(MemoryChunk));
|
|
1331
|
+
|
|
1332
|
+
return aligned;
|
|
1333
|
+
}
|
|
1334
|
+
|
|
1335
|
+
/*
|
|
1336
|
+
* palloc_aligned
|
|
1337
|
+
* Allocate 'size' bytes returning a pointer that's aligned to the
|
|
1338
|
+
* 'alignto' boundary.
|
|
1339
|
+
*
|
|
1340
|
+
* Currently, we align addresses by requesting additional bytes from the
|
|
1341
|
+
* MemoryContext's standard allocator function and then aligning the returned
|
|
1342
|
+
* address by the required alignment. This means that the given MemoryContext
|
|
1343
|
+
* must support providing us with a chunk of memory that's larger than 'size'.
|
|
1344
|
+
* For allocators such as Slab, that's not going to work, as slab only allows
|
|
1345
|
+
* chunks of the size that's specified when the context is created.
|
|
1346
|
+
*
|
|
1347
|
+
* 'alignto' must be a power of 2.
|
|
1348
|
+
* 'flags' may be 0 or set the same as MemoryContextAllocExtended().
|
|
1349
|
+
*/
|
|
1350
|
+
|
|
1351
|
+
|
|
1035
1352
|
/*
|
|
1036
1353
|
* pfree
|
|
1037
1354
|
* Release an allocated chunk.
|
|
@@ -1039,10 +1356,17 @@ palloc0(Size size)
|
|
|
1039
1356
|
void
|
|
1040
1357
|
pfree(void *pointer)
|
|
1041
1358
|
{
|
|
1359
|
+
#ifdef USE_VALGRIND
|
|
1360
|
+
MemoryContextMethodID method = GetMemoryChunkMethodID(pointer);
|
|
1042
1361
|
MemoryContext context = GetMemoryChunkContext(pointer);
|
|
1362
|
+
#endif
|
|
1363
|
+
|
|
1364
|
+
MCXT_METHOD(pointer, free_p) (pointer);
|
|
1043
1365
|
|
|
1044
|
-
|
|
1045
|
-
|
|
1366
|
+
#ifdef USE_VALGRIND
|
|
1367
|
+
if (method != MCTX_ALIGNED_REDIRECT_ID)
|
|
1368
|
+
VALGRIND_MEMPOOL_FREE(context, pointer);
|
|
1369
|
+
#endif
|
|
1046
1370
|
}
|
|
1047
1371
|
|
|
1048
1372
|
/*
|
|
@@ -1052,7 +1376,12 @@ pfree(void *pointer)
|
|
|
1052
1376
|
void *
|
|
1053
1377
|
repalloc(void *pointer, Size size)
|
|
1054
1378
|
{
|
|
1379
|
+
#ifdef USE_VALGRIND
|
|
1380
|
+
MemoryContextMethodID method = GetMemoryChunkMethodID(pointer);
|
|
1381
|
+
#endif
|
|
1382
|
+
#if defined(USE_ASSERT_CHECKING) || defined(USE_VALGRIND)
|
|
1055
1383
|
MemoryContext context = GetMemoryChunkContext(pointer);
|
|
1384
|
+
#endif
|
|
1056
1385
|
void *ret;
|
|
1057
1386
|
|
|
1058
1387
|
if (!AllocSizeIsValid(size))
|
|
@@ -1063,22 +1392,42 @@ repalloc(void *pointer, Size size)
|
|
|
1063
1392
|
/* isReset must be false already */
|
|
1064
1393
|
Assert(!context->isReset);
|
|
1065
1394
|
|
|
1066
|
-
ret =
|
|
1395
|
+
ret = MCXT_METHOD(pointer, realloc) (pointer, size);
|
|
1067
1396
|
if (unlikely(ret == NULL))
|
|
1068
1397
|
{
|
|
1398
|
+
MemoryContext cxt = GetMemoryChunkContext(pointer);
|
|
1399
|
+
|
|
1069
1400
|
MemoryContextStats(TopMemoryContext);
|
|
1070
1401
|
ereport(ERROR,
|
|
1071
1402
|
(errcode(ERRCODE_OUT_OF_MEMORY),
|
|
1072
1403
|
errmsg("out of memory"),
|
|
1073
1404
|
errdetail("Failed on request of size %zu in memory context \"%s\".",
|
|
1074
|
-
size,
|
|
1405
|
+
size, cxt->name)));
|
|
1075
1406
|
}
|
|
1076
1407
|
|
|
1077
|
-
|
|
1408
|
+
#ifdef USE_VALGRIND
|
|
1409
|
+
if (method != MCTX_ALIGNED_REDIRECT_ID)
|
|
1410
|
+
VALGRIND_MEMPOOL_CHANGE(context, pointer, ret, size);
|
|
1411
|
+
#endif
|
|
1078
1412
|
|
|
1079
1413
|
return ret;
|
|
1080
1414
|
}
|
|
1081
1415
|
|
|
1416
|
+
/*
|
|
1417
|
+
* repalloc_extended
|
|
1418
|
+
* Adjust the size of a previously allocated chunk,
|
|
1419
|
+
* with HUGE and NO_OOM options.
|
|
1420
|
+
*/
|
|
1421
|
+
#if defined(USE_ASSERT_CHECKING) || defined(USE_VALGRIND)
|
|
1422
|
+
#endif
|
|
1423
|
+
|
|
1424
|
+
/*
|
|
1425
|
+
* repalloc0
|
|
1426
|
+
* Adjust the size of a previously allocated chunk and zero out the added
|
|
1427
|
+
* space.
|
|
1428
|
+
*/
|
|
1429
|
+
|
|
1430
|
+
|
|
1082
1431
|
/*
|
|
1083
1432
|
* MemoryContextAllocHuge
|
|
1084
1433
|
* Allocate (possibly-expansive) space within the specified context.
|