pg_query 2.0.3 → 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 +165 -0
- data/README.md +67 -29
- data/Rakefile +8 -23
- data/ext/pg_query/extconf.rb +21 -3
- data/ext/pg_query/include/pg_query.h +29 -4
- data/ext/pg_query/include/pg_query_enum_defs.c +551 -272
- data/ext/pg_query/include/pg_query_fingerprint_conds.c +563 -470
- data/ext/pg_query/include/pg_query_fingerprint_defs.c +5403 -3945
- data/ext/pg_query/include/pg_query_outfuncs_conds.c +402 -330
- data/ext/pg_query/include/pg_query_outfuncs_defs.c +1319 -1059
- data/ext/pg_query/include/pg_query_readfuncs_conds.c +141 -118
- data/ext/pg_query/include/pg_query_readfuncs_defs.c +1685 -1379
- data/ext/pg_query/include/{access → postgres/access}/amapi.h +47 -1
- data/ext/pg_query/include/{access → postgres/access}/attmap.h +5 -3
- data/ext/pg_query/include/{access → postgres/access}/attnum.h +2 -2
- data/ext/pg_query/include/{access → postgres/access}/clog.h +4 -2
- data/ext/pg_query/include/{access → postgres/access}/commit_ts.h +6 -9
- data/ext/pg_query/include/{access → postgres/access}/detoast.h +1 -11
- data/ext/pg_query/include/{access → postgres/access}/genam.h +21 -16
- data/ext/pg_query/include/{access → postgres/access}/gin.h +17 -4
- data/ext/pg_query/include/{access → postgres/access}/htup.h +1 -1
- data/ext/pg_query/include/{access → postgres/access}/htup_details.h +80 -88
- data/ext/pg_query/include/{access → postgres/access}/itup.h +61 -52
- 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 +17 -2
- data/ext/pg_query/include/postgres/access/rmgr.h +62 -0
- data/ext/pg_query/include/{access → postgres/access}/rmgrlist.h +24 -24
- 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 +4 -2
- data/ext/pg_query/include/{access → postgres/access}/sysattr.h +1 -1
- data/ext/pg_query/include/{access → postgres/access}/table.h +2 -1
- data/ext/pg_query/include/{access → postgres/access}/tableam.h +337 -62
- data/ext/pg_query/include/postgres/access/toast_compression.h +73 -0
- data/ext/pg_query/include/{access → postgres/access}/transam.h +123 -13
- 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 +60 -100
- data/ext/pg_query/include/{access → postgres/access}/twophase.h +5 -1
- data/ext/pg_query/include/{access → postgres/access}/xact.h +99 -32
- data/ext/pg_query/include/{access → postgres/access}/xlog.h +69 -165
- data/ext/pg_query/include/{access → postgres/access}/xlog_internal.h +147 -73
- data/ext/pg_query/include/postgres/access/xlogbackup.h +41 -0
- data/ext/pg_query/include/{access → postgres/access}/xlogdefs.h +13 -40
- data/ext/pg_query/include/postgres/access/xlogprefetcher.h +55 -0
- data/ext/pg_query/include/{access → postgres/access}/xlogreader.h +154 -37
- data/ext/pg_query/include/{access → postgres/access}/xlogrecord.h +34 -13
- data/ext/pg_query/include/postgres/access/xlogrecovery.h +158 -0
- data/ext/pg_query/include/postgres/archive/archive_module.h +59 -0
- data/ext/pg_query/include/{c.h → postgres/c.h} +245 -188
- data/ext/pg_query/include/{catalog → postgres/catalog}/catalog.h +6 -3
- data/ext/pg_query/include/{catalog → postgres/catalog}/catversion.h +6 -2
- data/ext/pg_query/include/{catalog → postgres/catalog}/dependency.h +14 -19
- data/ext/pg_query/include/postgres/catalog/genbki.h +143 -0
- data/ext/pg_query/include/{catalog → postgres/catalog}/index.h +20 -5
- data/ext/pg_query/include/postgres/catalog/indexing.h +54 -0
- data/ext/pg_query/include/{catalog → postgres/catalog}/namespace.h +5 -3
- data/ext/pg_query/include/{catalog → postgres/catalog}/objectaccess.h +73 -3
- data/ext/pg_query/include/{catalog → postgres/catalog}/objectaddress.h +12 -7
- data/ext/pg_query/include/{catalog → postgres/catalog}/pg_aggregate.h +14 -10
- data/ext/pg_query/include/{catalog → postgres/catalog}/pg_aggregate_d.h +2 -1
- data/ext/pg_query/include/{catalog → postgres/catalog}/pg_am.h +4 -1
- data/ext/pg_query/include/{catalog → postgres/catalog}/pg_am_d.h +3 -1
- data/ext/pg_query/include/{catalog → postgres/catalog}/pg_attribute.h +45 -26
- data/ext/pg_query/include/{catalog → postgres/catalog}/pg_attribute_d.h +19 -16
- data/ext/pg_query/include/{catalog → postgres/catalog}/pg_authid.h +7 -2
- data/ext/pg_query/include/{catalog → postgres/catalog}/pg_authid_d.h +19 -9
- data/ext/pg_query/include/{catalog → postgres/catalog}/pg_class.h +45 -15
- data/ext/pg_query/include/{catalog → postgres/catalog}/pg_class_d.h +31 -2
- data/ext/pg_query/include/{catalog → postgres/catalog}/pg_collation.h +35 -8
- data/ext/pg_query/include/{catalog → postgres/catalog}/pg_collation_d.h +21 -3
- data/ext/pg_query/include/{catalog → postgres/catalog}/pg_constraint.h +39 -13
- data/ext/pg_query/include/{catalog → postgres/catalog}/pg_constraint_d.h +10 -4
- data/ext/pg_query/include/{catalog → postgres/catalog}/pg_control.h +13 -5
- data/ext/pg_query/include/{catalog → postgres/catalog}/pg_conversion.h +8 -5
- data/ext/pg_query/include/{catalog → postgres/catalog}/pg_conversion_d.h +4 -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 +11 -7
- data/ext/pg_query/include/{catalog → postgres/catalog}/pg_depend_d.h +3 -1
- data/ext/pg_query/include/{catalog → postgres/catalog}/pg_event_trigger.h +9 -3
- data/ext/pg_query/include/{catalog → postgres/catalog}/pg_event_trigger_d.h +3 -1
- data/ext/pg_query/include/{catalog → postgres/catalog}/pg_index.h +17 -7
- data/ext/pg_query/include/{catalog → postgres/catalog}/pg_index_d.h +20 -17
- data/ext/pg_query/include/{catalog → postgres/catalog}/pg_language.h +10 -5
- data/ext/pg_query/include/{catalog → postgres/catalog}/pg_language_d.h +3 -1
- data/ext/pg_query/include/{catalog → postgres/catalog}/pg_namespace.h +7 -2
- data/ext/pg_query/include/{catalog → postgres/catalog}/pg_namespace_d.h +3 -1
- data/ext/pg_query/include/{catalog → postgres/catalog}/pg_opclass.h +8 -5
- data/ext/pg_query/include/{catalog → postgres/catalog}/pg_opclass_d.h +3 -1
- data/ext/pg_query/include/{catalog → postgres/catalog}/pg_operator.h +21 -16
- data/ext/pg_query/include/{catalog → postgres/catalog}/pg_operator_d.h +37 -1
- data/ext/pg_query/include/{catalog → postgres/catalog}/pg_opfamily.h +8 -4
- data/ext/pg_query/include/{catalog → postgres/catalog}/pg_opfamily_d.h +6 -2
- data/ext/pg_query/include/{catalog → postgres/catalog}/pg_partitioned_table.h +20 -9
- data/ext/pg_query/include/{catalog → postgres/catalog}/pg_partitioned_table_d.h +2 -1
- data/ext/pg_query/include/{catalog → postgres/catalog}/pg_proc.h +20 -11
- data/ext/pg_query/include/{catalog → postgres/catalog}/pg_proc_d.h +10 -8
- data/ext/pg_query/include/{catalog → postgres/catalog}/pg_publication.h +49 -6
- data/ext/pg_query/include/{catalog → postgres/catalog}/pg_publication_d.h +3 -1
- data/ext/pg_query/include/{catalog → postgres/catalog}/pg_replication_origin.h +6 -1
- data/ext/pg_query/include/{catalog → postgres/catalog}/pg_replication_origin_d.h +5 -1
- data/ext/pg_query/include/{catalog → postgres/catalog}/pg_statistic.h +19 -12
- data/ext/pg_query/include/{catalog → postgres/catalog}/pg_statistic_d.h +2 -1
- data/ext/pg_query/include/{catalog → postgres/catalog}/pg_statistic_ext.h +19 -5
- data/ext/pg_query/include/{catalog → postgres/catalog}/pg_statistic_ext_d.h +7 -2
- data/ext/pg_query/include/{catalog → postgres/catalog}/pg_transform.h +8 -5
- data/ext/pg_query/include/{catalog → postgres/catalog}/pg_transform_d.h +3 -1
- data/ext/pg_query/include/{catalog → postgres/catalog}/pg_trigger.h +24 -8
- data/ext/pg_query/include/{catalog → postgres/catalog}/pg_trigger_d.h +4 -1
- data/ext/pg_query/include/{catalog → postgres/catalog}/pg_ts_config.h +6 -3
- data/ext/pg_query/include/{catalog → postgres/catalog}/pg_ts_config_d.h +3 -1
- data/ext/pg_query/include/{catalog → postgres/catalog}/pg_ts_dict.h +8 -3
- data/ext/pg_query/include/{catalog → postgres/catalog}/pg_ts_dict_d.h +3 -1
- data/ext/pg_query/include/{catalog → postgres/catalog}/pg_ts_parser.h +6 -3
- data/ext/pg_query/include/{catalog → postgres/catalog}/pg_ts_parser_d.h +3 -1
- data/ext/pg_query/include/{catalog → postgres/catalog}/pg_ts_template.h +6 -3
- data/ext/pg_query/include/{catalog → postgres/catalog}/pg_ts_template_d.h +3 -1
- data/ext/pg_query/include/{catalog → postgres/catalog}/pg_type.h +56 -24
- data/ext/pg_query/include/{catalog → postgres/catalog}/pg_type_d.h +70 -31
- data/ext/pg_query/include/{catalog → postgres/catalog}/storage.h +9 -7
- data/ext/pg_query/include/{commands → postgres/commands}/async.h +4 -5
- data/ext/pg_query/include/{commands → postgres/commands}/dbcommands.h +3 -1
- data/ext/pg_query/include/{commands → postgres/commands}/defrem.h +12 -24
- data/ext/pg_query/include/{commands → postgres/commands}/event_trigger.h +2 -2
- 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 +6 -4
- data/ext/pg_query/include/{commands → postgres/commands}/trigger.h +36 -25
- data/ext/pg_query/include/{commands → postgres/commands}/user.h +10 -4
- data/ext/pg_query/include/{commands → postgres/commands}/vacuum.h +140 -47
- data/ext/pg_query/include/postgres/common/cryptohash.h +39 -0
- data/ext/pg_query/include/{common → postgres/common}/file_perm.h +4 -4
- 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 +2 -6
- data/ext/pg_query/include/{common → postgres/common}/kwlookup.h +2 -2
- data/ext/pg_query/include/postgres/common/pg_prng.h +61 -0
- data/ext/pg_query/include/{common → postgres/common}/relpath.h +21 -14
- 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 +125 -0
- data/ext/pg_query/include/{common/unicode_combining_table.h → postgres/common/unicode_nonspacing_table.h} +138 -8
- 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 +50 -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 +98 -32
- data/ext/pg_query/include/{executor → postgres/executor}/functions.h +17 -3
- data/ext/pg_query/include/{executor → postgres/executor}/instrument.h +33 -16
- data/ext/pg_query/include/{executor → postgres/executor}/spi.h +42 -4
- 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} +33 -8
- data/ext/pg_query/include/postgres/foreign/fdwapi.h +294 -0
- data/ext/pg_query/include/{funcapi.h → postgres/funcapi.h} +22 -10
- 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 +12 -12
- data/ext/pg_query/include/postgres/kwlist_d.h +1119 -0
- data/ext/pg_query/include/postgres/lib/dshash.h +115 -0
- data/ext/pg_query/include/{lib → postgres/lib}/ilist.h +454 -22
- data/ext/pg_query/include/{lib → postgres/lib}/pairingheap.h +1 -1
- data/ext/pg_query/include/{lib → postgres/lib}/simplehash.h +158 -33
- data/ext/pg_query/include/postgres/lib/sort_template.h +432 -0
- data/ext/pg_query/include/{lib → postgres/lib}/stringinfo.h +3 -3
- data/ext/pg_query/include/{libpq → postgres/libpq}/auth.h +12 -4
- data/ext/pg_query/include/{libpq → postgres/libpq}/crypt.h +5 -4
- data/ext/pg_query/include/{libpq → postgres/libpq}/hba.h +54 -8
- data/ext/pg_query/include/{libpq → postgres/libpq}/libpq-be.h +45 -17
- data/ext/pg_query/include/{libpq → postgres/libpq}/libpq.h +31 -20
- data/ext/pg_query/include/{libpq → postgres/libpq}/pqcomm.h +26 -71
- data/ext/pg_query/include/{libpq → postgres/libpq}/pqformat.h +2 -2
- data/ext/pg_query/include/{libpq → postgres/libpq}/pqsignal.h +25 -13
- 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 +125 -25
- data/ext/pg_query/include/{mb → postgres/mb}/stringinfo_mb.h +1 -1
- data/ext/pg_query/include/{miscadmin.h → postgres/miscadmin.h} +96 -65
- data/ext/pg_query/include/{nodes → postgres/nodes}/bitmapset.h +11 -7
- data/ext/pg_query/include/{nodes → postgres/nodes}/execnodes.h +351 -103
- data/ext/pg_query/include/{nodes → postgres/nodes}/extensible.h +8 -4
- data/ext/pg_query/include/{nodes → postgres/nodes}/lockoptions.h +1 -1
- data/ext/pg_query/include/{nodes → postgres/nodes}/makefuncs.h +19 -6
- data/ext/pg_query/include/{nodes → postgres/nodes}/memnodes.h +11 -6
- 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 +100 -496
- 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 +678 -207
- data/ext/pg_query/include/{nodes → postgres/nodes}/pathnodes.h +1282 -454
- data/ext/pg_query/include/{nodes → postgres/nodes}/pg_list.h +103 -73
- data/ext/pg_query/include/{nodes → postgres/nodes}/plannodes.h +474 -133
- data/ext/pg_query/include/{nodes → postgres/nodes}/primnodes.h +754 -254
- data/ext/pg_query/include/{nodes → postgres/nodes}/print.h +1 -1
- data/ext/pg_query/include/postgres/nodes/queryjumble.h +86 -0
- 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/postgres/nodes/value.h +90 -0
- data/ext/pg_query/include/{optimizer → postgres/optimizer}/cost.h +14 -5
- data/ext/pg_query/include/{optimizer → postgres/optimizer}/geqo.h +9 -7
- data/ext/pg_query/include/{optimizer → postgres/optimizer}/geqo_gene.h +1 -1
- data/ext/pg_query/include/{optimizer → postgres/optimizer}/optimizer.h +31 -28
- data/ext/pg_query/include/{optimizer → postgres/optimizer}/paths.h +29 -12
- data/ext/pg_query/include/{optimizer → postgres/optimizer}/planmain.h +15 -17
- data/ext/pg_query/include/{parser → postgres/parser}/analyze.h +20 -5
- data/ext/pg_query/include/postgres/parser/kwlist.h +498 -0
- data/ext/pg_query/include/{parser → postgres/parser}/parse_agg.h +5 -8
- data/ext/pg_query/include/{parser → postgres/parser}/parse_coerce.h +6 -1
- data/ext/pg_query/include/{parser → postgres/parser}/parse_expr.h +2 -3
- data/ext/pg_query/include/{parser → postgres/parser}/parse_func.h +2 -1
- data/ext/pg_query/include/{parser → postgres/parser}/parse_node.h +41 -11
- data/ext/pg_query/include/{parser → postgres/parser}/parse_oper.h +3 -5
- data/ext/pg_query/include/{parser → postgres/parser}/parse_relation.h +11 -5
- data/ext/pg_query/include/{parser → postgres/parser}/parse_type.h +4 -3
- data/ext/pg_query/include/postgres/parser/parser.h +68 -0
- 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 +2 -5
- data/ext/pg_query/include/{partitioning → postgres/partitioning}/partdefs.h +1 -1
- data/ext/pg_query/include/{pg_config.h → postgres/pg_config.h} +216 -228
- data/ext/pg_query/include/{pg_config_manual.h → postgres/pg_config_manual.h} +80 -58
- data/ext/pg_query/include/postgres/pg_config_os.h +8 -0
- data/ext/pg_query/include/{pg_getopt.h → postgres/pg_getopt.h} +6 -6
- data/ext/pg_query/include/{pg_trace.h → postgres/pg_trace.h} +1 -1
- data/ext/pg_query/include/postgres/pgstat.h +778 -0
- data/ext/pg_query/include/{pgtime.h → postgres/pgtime.h} +16 -6
- data/ext/pg_query/include/{pl_gram.h → postgres/pl_gram.h} +116 -116
- 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} +10 -10
- data/ext/pg_query/include/{pl_unreserved_kwlist.h → postgres/pl_unreserved_kwlist.h} +3 -3
- data/ext/pg_query/include/{pl_unreserved_kwlist_d.h → postgres/pl_unreserved_kwlist_d.h} +60 -60
- data/ext/pg_query/include/{plerrcodes.h → postgres/plerrcodes.h} +9 -1
- data/ext/pg_query/include/{plpgsql.h → postgres/plpgsql.h} +79 -86
- data/ext/pg_query/include/{port → postgres/port}/atomics/arch-arm.h +9 -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 +3 -3
- 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 +129 -16
- 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} +107 -111
- 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 +17 -20
- data/ext/pg_query/include/{postmaster → postgres/postmaster}/bgworker.h +3 -2
- data/ext/pg_query/include/{postmaster → postgres/postmaster}/bgworker_internals.h +2 -2
- data/ext/pg_query/include/{postmaster → postgres/postmaster}/bgwriter.h +6 -6
- data/ext/pg_query/include/{postmaster → postgres/postmaster}/interrupt.h +1 -1
- data/ext/pg_query/include/{postmaster → postgres/postmaster}/pgarch.h +7 -10
- data/ext/pg_query/include/{postmaster → postgres/postmaster}/postmaster.h +21 -17
- data/ext/pg_query/include/postgres/postmaster/startup.h +41 -0
- data/ext/pg_query/include/{postmaster → postgres/postmaster}/syslogger.h +16 -11
- data/ext/pg_query/include/{postmaster → postgres/postmaster}/walwriter.h +5 -3
- data/ext/pg_query/include/{regex → postgres/regex}/regex.h +27 -22
- data/ext/pg_query/include/{replication → postgres/replication}/logicallauncher.h +8 -5
- data/ext/pg_query/include/postgres/replication/logicalproto.h +274 -0
- data/ext/pg_query/include/postgres/replication/logicalworker.h +32 -0
- data/ext/pg_query/include/{replication → postgres/replication}/origin.h +8 -8
- data/ext/pg_query/include/postgres/replication/reorderbuffer.h +753 -0
- data/ext/pg_query/include/{replication → postgres/replication}/slot.h +42 -12
- data/ext/pg_query/include/{replication → postgres/replication}/syncrep.h +6 -12
- data/ext/pg_query/include/{replication → postgres/replication}/walreceiver.h +158 -20
- data/ext/pg_query/include/{replication → postgres/replication}/walsender.h +20 -20
- data/ext/pg_query/include/{rewrite → postgres/rewrite}/prs2lock.h +1 -1
- data/ext/pg_query/include/{rewrite → postgres/rewrite}/rewriteHandler.h +1 -6
- 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 +3 -3
- data/ext/pg_query/include/{storage → postgres/storage}/block.h +24 -37
- data/ext/pg_query/include/{storage → postgres/storage}/buf.h +1 -1
- data/ext/pg_query/include/{storage → postgres/storage}/bufmgr.h +196 -95
- data/ext/pg_query/include/{storage → postgres/storage}/bufpage.h +152 -101
- data/ext/pg_query/include/{storage → postgres/storage}/condition_variable.h +14 -3
- data/ext/pg_query/include/{storage → postgres/storage}/dsm.h +6 -6
- data/ext/pg_query/include/{storage → postgres/storage}/dsm_impl.h +6 -2
- data/ext/pg_query/include/{storage → postgres/storage}/fd.h +48 -14
- data/ext/pg_query/include/postgres/storage/fileset.h +40 -0
- data/ext/pg_query/include/{storage → postgres/storage}/ipc.h +5 -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 +96 -57
- data/ext/pg_query/include/{storage → postgres/storage}/large_object.h +2 -2
- data/ext/pg_query/include/{storage → postgres/storage}/latch.h +17 -13
- data/ext/pg_query/include/{storage → postgres/storage}/lmgr.h +7 -1
- data/ext/pg_query/include/{storage → postgres/storage}/lock.h +37 -25
- data/ext/pg_query/include/{storage → postgres/storage}/lockdefs.h +4 -4
- data/ext/pg_query/include/{storage → postgres/storage}/lwlock.h +21 -33
- data/ext/pg_query/include/{storage → postgres/storage}/lwlocknames.h +0 -1
- 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 +9 -7
- data/ext/pg_query/include/{storage → postgres/storage}/pmsignal.h +15 -4
- data/ext/pg_query/include/{storage → postgres/storage}/predicate.h +5 -5
- data/ext/pg_query/include/{storage → postgres/storage}/proc.h +200 -67
- data/ext/pg_query/include/postgres/storage/procarray.h +99 -0
- data/ext/pg_query/include/{storage → postgres/storage}/proclist_types.h +1 -1
- data/ext/pg_query/include/{storage → postgres/storage}/procsignal.h +5 -7
- data/ext/pg_query/include/postgres/storage/relfilelocator.h +99 -0
- data/ext/pg_query/include/{storage → postgres/storage}/s_lock.h +118 -298
- data/ext/pg_query/include/{storage → postgres/storage}/sharedfileset.h +3 -11
- data/ext/pg_query/include/{storage → postgres/storage}/shm_mq.h +5 -4
- 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 +5 -5
- data/ext/pg_query/include/{storage → postgres/storage}/sinvaladt.h +4 -2
- data/ext/pg_query/include/{storage → postgres/storage}/smgr.h +21 -17
- data/ext/pg_query/include/{storage → postgres/storage}/spin.h +2 -2
- data/ext/pg_query/include/{storage → postgres/storage}/standby.h +17 -9
- data/ext/pg_query/include/{storage → postgres/storage}/standbydefs.h +2 -2
- data/ext/pg_query/include/{storage → postgres/storage}/sync.h +9 -5
- data/ext/pg_query/include/{tcop → postgres/tcop}/cmdtag.h +7 -2
- data/ext/pg_query/include/{tcop → postgres/tcop}/cmdtaglist.h +3 -2
- 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 -2
- data/ext/pg_query/include/{tcop → postgres/tcop}/pquery.h +7 -1
- data/ext/pg_query/include/{tcop → postgres/tcop}/tcopprot.h +19 -14
- data/ext/pg_query/include/{tcop → postgres/tcop}/utility.h +7 -3
- data/ext/pg_query/include/{tsearch → postgres/tsearch}/ts_cache.h +3 -5
- data/ext/pg_query/include/{utils → postgres/utils}/acl.h +37 -71
- data/ext/pg_query/include/{utils → postgres/utils}/aclchk_internal.h +1 -1
- data/ext/pg_query/include/{utils → postgres/utils}/array.h +26 -2
- data/ext/pg_query/include/postgres/utils/backend_progress.h +45 -0
- data/ext/pg_query/include/postgres/utils/backend_status.h +342 -0
- data/ext/pg_query/include/{utils → postgres/utils}/builtins.h +20 -11
- data/ext/pg_query/include/{utils → postgres/utils}/bytea.h +3 -2
- 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 +48 -27
- data/ext/pg_query/include/{utils → postgres/utils}/datum.h +9 -1
- data/ext/pg_query/include/{utils → postgres/utils}/dsa.h +5 -1
- data/ext/pg_query/include/{utils → postgres/utils}/elog.h +154 -48
- data/ext/pg_query/include/{utils → postgres/utils}/errcodes.h +2 -0
- 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 +13 -12
- data/ext/pg_query/include/{utils → postgres/utils}/fmgroids.h +1353 -696
- data/ext/pg_query/include/{utils → postgres/utils}/fmgrprotos.h +243 -18
- data/ext/pg_query/include/{utils → postgres/utils}/fmgrtab.h +6 -5
- data/ext/pg_query/include/{utils → postgres/utils}/guc.h +120 -121
- data/ext/pg_query/include/postgres/utils/guc_hooks.h +163 -0
- data/ext/pg_query/include/{utils → postgres/utils}/guc_tables.h +71 -21
- data/ext/pg_query/include/{utils → postgres/utils}/hsearch.h +15 -11
- data/ext/pg_query/include/{utils → postgres/utils}/inval.h +7 -3
- data/ext/pg_query/include/postgres/utils/logtape.h +77 -0
- data/ext/pg_query/include/{utils → postgres/utils}/lsyscache.h +16 -1
- data/ext/pg_query/include/{utils → postgres/utils}/memdebug.h +1 -1
- data/ext/pg_query/include/{utils → postgres/utils}/memutils.h +14 -53
- 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 +38 -9
- data/ext/pg_query/include/{utils → postgres/utils}/palloc.h +33 -4
- data/ext/pg_query/include/{utils → postgres/utils}/partcache.h +3 -2
- data/ext/pg_query/include/{utils → postgres/utils}/pg_locale.h +37 -21
- data/ext/pg_query/include/postgres/utils/pgstat_internal.h +814 -0
- data/ext/pg_query/include/{utils → postgres/utils}/plancache.h +6 -5
- data/ext/pg_query/include/{utils → postgres/utils}/portal.h +12 -1
- data/ext/pg_query/include/{utils → postgres/utils}/probes.h +59 -59
- 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/postgres/utils/regproc.h +39 -0
- data/ext/pg_query/include/{utils → postgres/utils}/rel.h +129 -61
- data/ext/pg_query/include/{utils → postgres/utils}/relcache.h +21 -14
- 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 +9 -1
- data/ext/pg_query/include/{utils → postgres/utils}/sharedtuplestore.h +1 -1
- data/ext/pg_query/include/{utils → postgres/utils}/snapmgr.h +38 -15
- data/ext/pg_query/include/{utils → postgres/utils}/snapshot.h +14 -1
- data/ext/pg_query/include/{utils → postgres/utils}/sortsupport.h +117 -2
- data/ext/pg_query/include/{utils → postgres/utils}/syscache.h +9 -1
- data/ext/pg_query/include/{utils → postgres/utils}/timeout.h +11 -4
- data/ext/pg_query/include/{utils → postgres/utils}/timestamp.h +46 -15
- data/ext/pg_query/include/{utils → postgres/utils}/tuplesort.h +209 -41
- data/ext/pg_query/include/{utils → postgres/utils}/tuplestore.h +2 -2
- data/ext/pg_query/include/{utils → postgres/utils}/typcache.h +24 -17
- data/ext/pg_query/include/{utils → postgres/utils}/varlena.h +17 -3
- data/ext/pg_query/include/postgres/utils/wait_event.h +294 -0
- data/ext/pg_query/include/{utils → postgres/utils}/xml.h +18 -8
- data/ext/pg_query/include/{postgres.h → postgres/varatt.h} +65 -471
- data/ext/pg_query/include/protobuf/pg_query.pb-c.h +7494 -6382
- data/ext/pg_query/include/protobuf/pg_query.pb.h +116922 -84792
- data/ext/pg_query/include/protobuf-c/protobuf-c.h +7 -3
- data/ext/pg_query/include/protobuf-c.h +7 -3
- data/ext/pg_query/pg_query.c +10 -1
- data/ext/pg_query/pg_query.pb-c.c +21026 -17002
- data/ext/pg_query/pg_query_deparse.c +1 -9896
- data/ext/pg_query/pg_query_fingerprint.c +162 -50
- data/ext/pg_query/pg_query_fingerprint.h +3 -1
- data/ext/pg_query/pg_query_internal.h +1 -1
- data/ext/pg_query/pg_query_json_plpgsql.c +56 -12
- data/ext/pg_query/pg_query_normalize.c +259 -64
- data/ext/pg_query/pg_query_outfuncs.h +1 -0
- data/ext/pg_query/pg_query_outfuncs_json.c +71 -16
- data/ext/pg_query/pg_query_outfuncs_protobuf.c +73 -12
- data/ext/pg_query/pg_query_parse.c +47 -5
- data/ext/pg_query/pg_query_parse_plpgsql.c +86 -21
- data/ext/pg_query/pg_query_readfuncs_protobuf.c +43 -8
- data/ext/pg_query/pg_query_ruby.c +6 -1
- data/ext/pg_query/pg_query_ruby_freebsd.sym +2 -0
- data/ext/pg_query/pg_query_scan.c +3 -2
- data/ext/pg_query/pg_query_split.c +6 -5
- data/ext/pg_query/postgres_deparse.c +11067 -0
- data/ext/pg_query/postgres_deparse.h +9 -0
- data/ext/pg_query/protobuf-c.c +34 -27
- data/ext/pg_query/src_backend_catalog_namespace.c +27 -10
- data/ext/pg_query/src_backend_catalog_pg_proc.c +4 -1
- data/ext/pg_query/src_backend_commands_define.c +11 -1
- data/ext/pg_query/src_backend_nodes_bitmapset.c +13 -70
- data/ext/pg_query/src_backend_nodes_copyfuncs.c +103 -5894
- data/ext/pg_query/src_backend_nodes_equalfuncs.c +102 -3830
- data/ext/pg_query/src_backend_nodes_extensible.c +6 -29
- data/ext/pg_query/src_backend_nodes_list.c +99 -12
- data/ext/pg_query/src_backend_nodes_makefuncs.c +99 -4
- data/ext/pg_query/src_backend_nodes_nodeFuncs.c +325 -131
- data/ext/pg_query/src_backend_nodes_nodes.c +38 -0
- data/ext/pg_query/src_backend_nodes_value.c +28 -19
- data/ext/pg_query/src_backend_parser_gram.c +36104 -32074
- data/ext/pg_query/src_backend_parser_parser.c +53 -8
- data/ext/pg_query/src_backend_parser_scan.c +4893 -3701
- data/ext/pg_query/src_backend_parser_scansup.c +4 -28
- data/ext/pg_query/src_backend_storage_ipc_ipc.c +13 -4
- data/ext/pg_query/src_backend_tcop_postgres.c +133 -105
- data/ext/pg_query/src_backend_utils_activity_pgstat_database.c +140 -0
- data/ext/pg_query/src_backend_utils_adt_datum.c +17 -7
- data/ext/pg_query/src_backend_utils_adt_expandeddatum.c +1 -1
- data/ext/pg_query/src_backend_utils_adt_format_type.c +6 -2
- data/ext/pg_query/src_backend_utils_adt_numutils.c +489 -0
- data/ext/pg_query/src_backend_utils_adt_ruleutils.c +187 -19
- data/ext/pg_query/src_backend_utils_error_assert.c +17 -18
- data/ext/pg_query/src_backend_utils_error_elog.c +513 -318
- data/ext/pg_query/src_backend_utils_fmgr_fmgr.c +44 -17
- data/ext/pg_query/src_backend_utils_init_globals.c +9 -6
- data/ext/pg_query/src_backend_utils_mb_mbutils.c +74 -131
- 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 +453 -314
- data/ext/pg_query/src_backend_utils_mmgr_generation.c +1039 -0
- data/ext/pg_query/src_backend_utils_mmgr_mcxt.c +549 -76
- 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 +420 -0
- data/ext/pg_query/src_common_keywords.c +15 -2
- data/ext/pg_query/src_common_kwlist_d.h +545 -498
- 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 +717 -113
- data/ext/pg_query/src_pl_plpgsql_src_pl_comp.c +49 -22
- data/ext/pg_query/src_pl_plpgsql_src_pl_funcs.c +3 -18
- data/ext/pg_query/src_pl_plpgsql_src_pl_gram.c +1136 -1195
- data/ext/pg_query/src_pl_plpgsql_src_pl_handler.c +1 -1
- data/ext/pg_query/src_pl_plpgsql_src_pl_reserved_kwlist_d.h +10 -10
- data/ext/pg_query/src_pl_plpgsql_src_pl_scanner.c +2 -2
- data/ext/pg_query/src_pl_plpgsql_src_pl_unreserved_kwlist_d.h +60 -60
- data/ext/pg_query/src_port_pg_bitutils.c +103 -40
- data/ext/pg_query/src_port_pgstrcasecmp.c +29 -1
- data/ext/pg_query/src_port_qsort.c +12 -224
- data/ext/pg_query/src_port_snprintf.c +51 -29
- data/ext/pg_query/src_port_strerror.c +9 -19
- data/ext/pg_query/src_port_strlcpy.c +79 -0
- data/lib/pg_query/deparse.rb +7 -1
- data/lib/pg_query/filter_columns.rb +7 -5
- data/lib/pg_query/fingerprint.rb +21 -9
- data/lib/pg_query/node.rb +18 -13
- data/lib/pg_query/param_refs.rb +1 -1
- data/lib/pg_query/parse.rb +141 -50
- data/lib/pg_query/pg_query_pb.rb +175 -3031
- data/lib/pg_query/treewalker.rb +26 -2
- data/lib/pg_query/truncate.rb +54 -8
- data/lib/pg_query/version.rb +1 -1
- data/lib/pg_query.rb +0 -1
- metadata +443 -380
- data/ext/pg_query/guc-file.c +0 -0
- data/ext/pg_query/include/access/rmgr.h +0 -35
- data/ext/pg_query/include/access/xloginsert.h +0 -64
- data/ext/pg_query/include/bootstrap/bootstrap.h +0 -62
- data/ext/pg_query/include/catalog/genbki.h +0 -64
- data/ext/pg_query/include/catalog/indexing.h +0 -366
- data/ext/pg_query/include/commands/variable.h +0 -38
- data/ext/pg_query/include/common/ip.h +0 -37
- data/ext/pg_query/include/common/string.h +0 -19
- data/ext/pg_query/include/getaddrinfo.h +0 -162
- data/ext/pg_query/include/kwlist_d.h +0 -1072
- data/ext/pg_query/include/nodes/value.h +0 -61
- data/ext/pg_query/include/parser/gram.h +0 -1067
- data/ext/pg_query/include/parser/kwlist.h +0 -477
- data/ext/pg_query/include/parser/parse_clause.h +0 -54
- data/ext/pg_query/include/parser/parse_collate.h +0 -27
- data/ext/pg_query/include/parser/parse_target.h +0 -46
- data/ext/pg_query/include/parser/parser.h +0 -41
- data/ext/pg_query/include/pg_config_os.h +0 -8
- data/ext/pg_query/include/pgstat.h +0 -1487
- data/ext/pg_query/include/portability/instr_time.h +0 -256
- data/ext/pg_query/include/postmaster/fork_process.h +0 -17
- data/ext/pg_query/include/replication/logicalproto.h +0 -110
- data/ext/pg_query/include/replication/logicalworker.h +0 -19
- data/ext/pg_query/include/replication/reorderbuffer.h +0 -467
- data/ext/pg_query/include/storage/relfilenode.h +0 -99
- data/ext/pg_query/include/utils/dynahash.h +0 -19
- 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/regproc.h +0 -28
- 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_libpq_pqcomm.c +0 -651
- data/ext/pg_query/src_backend_parser_parse_expr.c +0 -313
- data/ext/pg_query/src_backend_postmaster_postmaster.c +0 -2230
- data/ext/pg_query/src_backend_storage_lmgr_s_lock.c +0 -370
- data/ext/pg_query/src_backend_utils_hash_dynahash.c +0 -1086
- data/ext/pg_query/src_backend_utils_misc_guc.c +0 -1831
- data/ext/pg_query/src_common_string.c +0 -86
- data/ext/pg_query/src_port_erand48.c +0 -127
- data/ext/pg_query/src_port_pgsleep.c +0 -69
- data/ext/pg_query/src_port_random.c +0 -31
- data/ext/pg_query/src_port_strnlen.c +0 -39
- data/lib/pg_query/json_field_names.rb +0 -1402
- /data/ext/pg_query/include/{pg_config_ext.h → postgres/pg_config_ext.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
|
|
@@ -28,6 +39,7 @@
|
|
|
28
39
|
* - CurrentMemoryContext
|
|
29
40
|
* - MemoryContextDelete
|
|
30
41
|
* - palloc0
|
|
42
|
+
* - MemoryContextAllocExtended
|
|
31
43
|
*--------------------------------------------------------------------
|
|
32
44
|
*/
|
|
33
45
|
|
|
@@ -42,7 +54,7 @@
|
|
|
42
54
|
* context's MemoryContextMethods struct.
|
|
43
55
|
*
|
|
44
56
|
*
|
|
45
|
-
* Portions Copyright (c) 1996-
|
|
57
|
+
* Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group
|
|
46
58
|
* Portions Copyright (c) 1994, Regents of the University of California
|
|
47
59
|
*
|
|
48
60
|
*
|
|
@@ -56,14 +68,111 @@
|
|
|
56
68
|
|
|
57
69
|
#include "mb/pg_wchar.h"
|
|
58
70
|
#include "miscadmin.h"
|
|
71
|
+
#include "storage/proc.h"
|
|
72
|
+
#include "storage/procarray.h"
|
|
73
|
+
#include "storage/procsignal.h"
|
|
74
|
+
#include "utils/fmgrprotos.h"
|
|
59
75
|
#include "utils/memdebug.h"
|
|
60
76
|
#include "utils/memutils.h"
|
|
77
|
+
#include "utils/memutils_internal.h"
|
|
78
|
+
#include "utils/memutils_memorychunk.h"
|
|
61
79
|
|
|
62
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);
|
|
85
|
+
|
|
63
86
|
/*****************************************************************************
|
|
64
87
|
* GLOBAL MEMORY *
|
|
65
88
|
*****************************************************************************/
|
|
66
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
|
+
|
|
67
176
|
/*
|
|
68
177
|
* CurrentMemoryContext
|
|
69
178
|
* Default memory context for allocations.
|
|
@@ -91,9 +200,11 @@ __thread MemoryContext ErrorContext = NULL;
|
|
|
91
200
|
static void MemoryContextCallResetCallbacks(MemoryContext context);
|
|
92
201
|
static void MemoryContextStatsInternal(MemoryContext context, int level,
|
|
93
202
|
bool print, int max_children,
|
|
94
|
-
MemoryContextCounters *totals
|
|
203
|
+
MemoryContextCounters *totals,
|
|
204
|
+
bool print_to_stderr);
|
|
95
205
|
static void MemoryContextStatsPrint(MemoryContext context, void *passthru,
|
|
96
|
-
const char *stats_string
|
|
206
|
+
const char *stats_string,
|
|
207
|
+
bool print_to_stderr);
|
|
97
208
|
|
|
98
209
|
/*
|
|
99
210
|
* You should not do memory allocations within a critical section, because
|
|
@@ -103,6 +214,101 @@ static void MemoryContextStatsPrint(MemoryContext context, void *passthru,
|
|
|
103
214
|
#define AssertNotInCriticalSection(context) \
|
|
104
215
|
Assert(CritSectionCount == 0 || (context)->allowInCritSection)
|
|
105
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
|
+
|
|
311
|
+
|
|
106
312
|
/*****************************************************************************
|
|
107
313
|
* EXPORTED ROUTINES *
|
|
108
314
|
*****************************************************************************/
|
|
@@ -127,7 +333,7 @@ static void MemoryContextStatsPrint(MemoryContext context, void *passthru,
|
|
|
127
333
|
void
|
|
128
334
|
MemoryContextInit(void)
|
|
129
335
|
{
|
|
130
|
-
|
|
336
|
+
Assert(TopMemoryContext == NULL);
|
|
131
337
|
|
|
132
338
|
/*
|
|
133
339
|
* First, initialize TopMemoryContext, which is the parent of all others.
|
|
@@ -171,7 +377,7 @@ MemoryContextInit(void)
|
|
|
171
377
|
void
|
|
172
378
|
MemoryContextReset(MemoryContext context)
|
|
173
379
|
{
|
|
174
|
-
|
|
380
|
+
Assert(MemoryContextIsValid(context));
|
|
175
381
|
|
|
176
382
|
/* save a function call in common case where there are no children */
|
|
177
383
|
if (context->firstchild != NULL)
|
|
@@ -190,7 +396,7 @@ MemoryContextReset(MemoryContext context)
|
|
|
190
396
|
void
|
|
191
397
|
MemoryContextResetOnly(MemoryContext context)
|
|
192
398
|
{
|
|
193
|
-
|
|
399
|
+
Assert(MemoryContextIsValid(context));
|
|
194
400
|
|
|
195
401
|
/* Nothing to do if no pallocs since startup or last reset */
|
|
196
402
|
if (!context->isReset)
|
|
@@ -201,10 +407,8 @@ MemoryContextResetOnly(MemoryContext context)
|
|
|
201
407
|
* If context->ident points into the context's memory, it will become
|
|
202
408
|
* a dangling pointer. We could prevent that by setting it to NULL
|
|
203
409
|
* here, but that would break valid coding patterns that keep the
|
|
204
|
-
* ident elsewhere, e.g. in a parent context.
|
|
205
|
-
*
|
|
206
|
-
* in separately-palloc'd chunks, so that risks false positives. So
|
|
207
|
-
* 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.
|
|
208
412
|
*/
|
|
209
413
|
|
|
210
414
|
context->methods->reset(context);
|
|
@@ -234,7 +438,7 @@ MemoryContextResetOnly(MemoryContext context)
|
|
|
234
438
|
void
|
|
235
439
|
MemoryContextDelete(MemoryContext context)
|
|
236
440
|
{
|
|
237
|
-
|
|
441
|
+
Assert(MemoryContextIsValid(context));
|
|
238
442
|
/* We had better not be deleting TopMemoryContext ... */
|
|
239
443
|
Assert(context != TopMemoryContext);
|
|
240
444
|
/* And not CurrentMemoryContext, either */
|
|
@@ -279,7 +483,7 @@ MemoryContextDelete(MemoryContext context)
|
|
|
279
483
|
void
|
|
280
484
|
MemoryContextDeleteChildren(MemoryContext context)
|
|
281
485
|
{
|
|
282
|
-
|
|
486
|
+
Assert(MemoryContextIsValid(context));
|
|
283
487
|
|
|
284
488
|
/*
|
|
285
489
|
* MemoryContextDelete will delink the child from me, so just iterate as
|
|
@@ -361,8 +565,8 @@ MemoryContextCallResetCallbacks(MemoryContext context)
|
|
|
361
565
|
void
|
|
362
566
|
MemoryContextSetParent(MemoryContext context, MemoryContext new_parent)
|
|
363
567
|
{
|
|
364
|
-
|
|
365
|
-
|
|
568
|
+
Assert(MemoryContextIsValid(context));
|
|
569
|
+
Assert(context != new_parent);
|
|
366
570
|
|
|
367
571
|
/* Fast path if it's got correct parent already */
|
|
368
572
|
if (new_parent == context->parent)
|
|
@@ -388,7 +592,7 @@ MemoryContextSetParent(MemoryContext context, MemoryContext new_parent)
|
|
|
388
592
|
/* And relink */
|
|
389
593
|
if (new_parent)
|
|
390
594
|
{
|
|
391
|
-
|
|
595
|
+
Assert(MemoryContextIsValid(new_parent));
|
|
392
596
|
context->parent = new_parent;
|
|
393
597
|
context->prevchild = NULL;
|
|
394
598
|
context->nextchild = new_parent->firstchild;
|
|
@@ -418,11 +622,22 @@ MemoryContextSetParent(MemoryContext context, MemoryContext new_parent)
|
|
|
418
622
|
void
|
|
419
623
|
MemoryContextAllowInCriticalSection(MemoryContext context, bool allow)
|
|
420
624
|
{
|
|
421
|
-
|
|
625
|
+
Assert(MemoryContextIsValid(context));
|
|
422
626
|
|
|
423
627
|
context->allowInCritSection = allow;
|
|
424
628
|
}
|
|
425
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
|
+
|
|
426
641
|
/*
|
|
427
642
|
* GetMemoryChunkSpace
|
|
428
643
|
* Given a currently-allocated chunk, determine the total space
|
|
@@ -431,7 +646,11 @@ MemoryContextAllowInCriticalSection(MemoryContext context, bool allow)
|
|
|
431
646
|
* This is useful for measuring the total space occupied by a set of
|
|
432
647
|
* allocated chunks.
|
|
433
648
|
*/
|
|
434
|
-
|
|
649
|
+
Size
|
|
650
|
+
GetMemoryChunkSpace(void *pointer)
|
|
651
|
+
{
|
|
652
|
+
return MCXT_METHOD(pointer, get_chunk_space) (pointer);
|
|
653
|
+
}
|
|
435
654
|
|
|
436
655
|
/*
|
|
437
656
|
* MemoryContextGetParent
|
|
@@ -463,28 +682,52 @@ void
|
|
|
463
682
|
MemoryContextStats(MemoryContext context)
|
|
464
683
|
{
|
|
465
684
|
/* A hard-wired limit on the number of children is usually good enough */
|
|
466
|
-
MemoryContextStatsDetail(context, 100);
|
|
685
|
+
MemoryContextStatsDetail(context, 100, true);
|
|
467
686
|
}
|
|
468
687
|
|
|
469
688
|
/*
|
|
470
689
|
* MemoryContextStatsDetail
|
|
471
690
|
*
|
|
472
691
|
* Entry point for use if you want to vary the number of child contexts shown.
|
|
692
|
+
*
|
|
693
|
+
* If print_to_stderr is true, print statistics about the memory contexts
|
|
694
|
+
* with fprintf(stderr), otherwise use ereport().
|
|
473
695
|
*/
|
|
474
696
|
void
|
|
475
|
-
MemoryContextStatsDetail(MemoryContext context, int max_children
|
|
697
|
+
MemoryContextStatsDetail(MemoryContext context, int max_children,
|
|
698
|
+
bool print_to_stderr)
|
|
476
699
|
{
|
|
477
700
|
MemoryContextCounters grand_totals;
|
|
478
701
|
|
|
479
702
|
memset(&grand_totals, 0, sizeof(grand_totals));
|
|
480
703
|
|
|
481
|
-
MemoryContextStatsInternal(context, 0, true, max_children, &grand_totals);
|
|
704
|
+
MemoryContextStatsInternal(context, 0, true, max_children, &grand_totals, print_to_stderr);
|
|
482
705
|
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
|
|
706
|
+
if (print_to_stderr)
|
|
707
|
+
fprintf(stderr,
|
|
708
|
+
"Grand total: %zu bytes in %zu blocks; %zu free (%zu chunks); %zu used\n",
|
|
709
|
+
grand_totals.totalspace, grand_totals.nblocks,
|
|
710
|
+
grand_totals.freespace, grand_totals.freechunks,
|
|
711
|
+
grand_totals.totalspace - grand_totals.freespace);
|
|
712
|
+
else
|
|
713
|
+
|
|
714
|
+
/*
|
|
715
|
+
* Use LOG_SERVER_ONLY to prevent the memory contexts from being sent
|
|
716
|
+
* to the connected client.
|
|
717
|
+
*
|
|
718
|
+
* We don't buffer the information about all memory contexts in a
|
|
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.
|
|
723
|
+
*/
|
|
724
|
+
ereport(LOG_SERVER_ONLY,
|
|
725
|
+
(errhidestmt(true),
|
|
726
|
+
errhidecontext(true),
|
|
727
|
+
errmsg_internal("Grand total: %zu bytes in %zu blocks; %zu free (%zu chunks); %zu used",
|
|
728
|
+
grand_totals.totalspace, grand_totals.nblocks,
|
|
729
|
+
grand_totals.freespace, grand_totals.freechunks,
|
|
730
|
+
grand_totals.totalspace - grand_totals.freespace)));
|
|
488
731
|
}
|
|
489
732
|
|
|
490
733
|
/*
|
|
@@ -497,19 +740,20 @@ MemoryContextStatsDetail(MemoryContext context, int max_children)
|
|
|
497
740
|
static void
|
|
498
741
|
MemoryContextStatsInternal(MemoryContext context, int level,
|
|
499
742
|
bool print, int max_children,
|
|
500
|
-
MemoryContextCounters *totals
|
|
743
|
+
MemoryContextCounters *totals,
|
|
744
|
+
bool print_to_stderr)
|
|
501
745
|
{
|
|
502
746
|
MemoryContextCounters local_totals;
|
|
503
747
|
MemoryContext child;
|
|
504
748
|
int ichild;
|
|
505
749
|
|
|
506
|
-
|
|
750
|
+
Assert(MemoryContextIsValid(context));
|
|
507
751
|
|
|
508
752
|
/* Examine the context itself */
|
|
509
753
|
context->methods->stats(context,
|
|
510
754
|
print ? MemoryContextStatsPrint : NULL,
|
|
511
755
|
(void *) &level,
|
|
512
|
-
totals);
|
|
756
|
+
totals, print_to_stderr);
|
|
513
757
|
|
|
514
758
|
/*
|
|
515
759
|
* Examine children. If there are more than max_children of them, we do
|
|
@@ -524,11 +768,13 @@ MemoryContextStatsInternal(MemoryContext context, int level,
|
|
|
524
768
|
if (ichild < max_children)
|
|
525
769
|
MemoryContextStatsInternal(child, level + 1,
|
|
526
770
|
print, max_children,
|
|
527
|
-
totals
|
|
771
|
+
totals,
|
|
772
|
+
print_to_stderr);
|
|
528
773
|
else
|
|
529
774
|
MemoryContextStatsInternal(child, level + 1,
|
|
530
775
|
false, max_children,
|
|
531
|
-
&local_totals
|
|
776
|
+
&local_totals,
|
|
777
|
+
print_to_stderr);
|
|
532
778
|
}
|
|
533
779
|
|
|
534
780
|
/* Deal with excess children */
|
|
@@ -536,18 +782,33 @@ MemoryContextStatsInternal(MemoryContext context, int level,
|
|
|
536
782
|
{
|
|
537
783
|
if (print)
|
|
538
784
|
{
|
|
539
|
-
|
|
540
|
-
|
|
541
|
-
|
|
542
|
-
|
|
543
|
-
|
|
544
|
-
|
|
545
|
-
|
|
546
|
-
|
|
547
|
-
|
|
548
|
-
|
|
549
|
-
|
|
550
|
-
|
|
785
|
+
if (print_to_stderr)
|
|
786
|
+
{
|
|
787
|
+
int i;
|
|
788
|
+
|
|
789
|
+
for (i = 0; i <= level; i++)
|
|
790
|
+
fprintf(stderr, " ");
|
|
791
|
+
fprintf(stderr,
|
|
792
|
+
"%d more child contexts containing %zu total in %zu blocks; %zu free (%zu chunks); %zu used\n",
|
|
793
|
+
ichild - max_children,
|
|
794
|
+
local_totals.totalspace,
|
|
795
|
+
local_totals.nblocks,
|
|
796
|
+
local_totals.freespace,
|
|
797
|
+
local_totals.freechunks,
|
|
798
|
+
local_totals.totalspace - local_totals.freespace);
|
|
799
|
+
}
|
|
800
|
+
else
|
|
801
|
+
ereport(LOG_SERVER_ONLY,
|
|
802
|
+
(errhidestmt(true),
|
|
803
|
+
errhidecontext(true),
|
|
804
|
+
errmsg_internal("level: %d; %d more child contexts containing %zu total in %zu blocks; %zu free (%zu chunks); %zu used",
|
|
805
|
+
level,
|
|
806
|
+
ichild - max_children,
|
|
807
|
+
local_totals.totalspace,
|
|
808
|
+
local_totals.nblocks,
|
|
809
|
+
local_totals.freespace,
|
|
810
|
+
local_totals.freechunks,
|
|
811
|
+
local_totals.totalspace - local_totals.freespace)));
|
|
551
812
|
}
|
|
552
813
|
|
|
553
814
|
if (totals)
|
|
@@ -569,11 +830,13 @@ MemoryContextStatsInternal(MemoryContext context, int level,
|
|
|
569
830
|
*/
|
|
570
831
|
static void
|
|
571
832
|
MemoryContextStatsPrint(MemoryContext context, void *passthru,
|
|
572
|
-
const char *stats_string
|
|
833
|
+
const char *stats_string,
|
|
834
|
+
bool print_to_stderr)
|
|
573
835
|
{
|
|
574
836
|
int level = *(int *) passthru;
|
|
575
837
|
const char *name = context->name;
|
|
576
838
|
const char *ident = context->ident;
|
|
839
|
+
char truncated_ident[110];
|
|
577
840
|
int i;
|
|
578
841
|
|
|
579
842
|
/*
|
|
@@ -587,9 +850,8 @@ MemoryContextStatsPrint(MemoryContext context, void *passthru,
|
|
|
587
850
|
ident = NULL;
|
|
588
851
|
}
|
|
589
852
|
|
|
590
|
-
|
|
591
|
-
|
|
592
|
-
fprintf(stderr, "%s: %s", name, stats_string);
|
|
853
|
+
truncated_ident[0] = '\0';
|
|
854
|
+
|
|
593
855
|
if (ident)
|
|
594
856
|
{
|
|
595
857
|
/*
|
|
@@ -601,24 +863,41 @@ MemoryContextStatsPrint(MemoryContext context, void *passthru,
|
|
|
601
863
|
int idlen = strlen(ident);
|
|
602
864
|
bool truncated = false;
|
|
603
865
|
|
|
866
|
+
strcpy(truncated_ident, ": ");
|
|
867
|
+
i = strlen(truncated_ident);
|
|
868
|
+
|
|
604
869
|
if (idlen > 100)
|
|
605
870
|
{
|
|
606
871
|
idlen = pg_mbcliplen(ident, idlen, 100);
|
|
607
872
|
truncated = true;
|
|
608
873
|
}
|
|
609
|
-
|
|
874
|
+
|
|
610
875
|
while (idlen-- > 0)
|
|
611
876
|
{
|
|
612
877
|
unsigned char c = *ident++;
|
|
613
878
|
|
|
614
879
|
if (c < ' ')
|
|
615
880
|
c = ' ';
|
|
616
|
-
|
|
881
|
+
truncated_ident[i++] = c;
|
|
617
882
|
}
|
|
883
|
+
truncated_ident[i] = '\0';
|
|
884
|
+
|
|
618
885
|
if (truncated)
|
|
619
|
-
|
|
886
|
+
strcat(truncated_ident, "...");
|
|
887
|
+
}
|
|
888
|
+
|
|
889
|
+
if (print_to_stderr)
|
|
890
|
+
{
|
|
891
|
+
for (i = 0; i < level; i++)
|
|
892
|
+
fprintf(stderr, " ");
|
|
893
|
+
fprintf(stderr, "%s: %s%s\n", name, stats_string, truncated_ident);
|
|
620
894
|
}
|
|
621
|
-
|
|
895
|
+
else
|
|
896
|
+
ereport(LOG_SERVER_ONLY,
|
|
897
|
+
(errhidestmt(true),
|
|
898
|
+
errhidecontext(true),
|
|
899
|
+
errmsg_internal("level: %d; %s: %s%s",
|
|
900
|
+
level, name, stats_string, truncated_ident)));
|
|
622
901
|
}
|
|
623
902
|
|
|
624
903
|
/*
|
|
@@ -631,19 +910,6 @@ MemoryContextStatsPrint(MemoryContext context, void *passthru,
|
|
|
631
910
|
|
|
632
911
|
#endif
|
|
633
912
|
|
|
634
|
-
/*
|
|
635
|
-
* MemoryContextContains
|
|
636
|
-
* Detect whether an allocated chunk of memory belongs to a given
|
|
637
|
-
* context or not.
|
|
638
|
-
*
|
|
639
|
-
* Caution: this test is reliable as long as 'pointer' does point to
|
|
640
|
-
* a chunk of memory allocated from *some* context. If 'pointer' points
|
|
641
|
-
* at memory obtained in some other way, there is a small chance of a
|
|
642
|
-
* false-positive result, since the bits right before it might look like
|
|
643
|
-
* a valid chunk header by chance.
|
|
644
|
-
*/
|
|
645
|
-
|
|
646
|
-
|
|
647
913
|
/*
|
|
648
914
|
* MemoryContextCreate
|
|
649
915
|
* Context-type-independent part of context creation.
|
|
@@ -669,7 +935,7 @@ MemoryContextStatsPrint(MemoryContext context, void *passthru,
|
|
|
669
935
|
*
|
|
670
936
|
* node: the as-yet-uninitialized common part of the context header node.
|
|
671
937
|
* tag: NodeTag code identifying the memory context type.
|
|
672
|
-
*
|
|
938
|
+
* method_id: MemoryContextMethodID of the context-type being created.
|
|
673
939
|
* parent: parent context, or NULL if this will be a top-level context.
|
|
674
940
|
* name: name of context (must be statically allocated).
|
|
675
941
|
*
|
|
@@ -679,7 +945,7 @@ MemoryContextStatsPrint(MemoryContext context, void *passthru,
|
|
|
679
945
|
void
|
|
680
946
|
MemoryContextCreate(MemoryContext node,
|
|
681
947
|
NodeTag tag,
|
|
682
|
-
|
|
948
|
+
MemoryContextMethodID method_id,
|
|
683
949
|
MemoryContext parent,
|
|
684
950
|
const char *name)
|
|
685
951
|
{
|
|
@@ -689,7 +955,7 @@ MemoryContextCreate(MemoryContext node,
|
|
|
689
955
|
/* Initialize all standard fields of memory context header */
|
|
690
956
|
node->type = tag;
|
|
691
957
|
node->isReset = true;
|
|
692
|
-
node->methods =
|
|
958
|
+
node->methods = &mcxt_methods[method_id];
|
|
693
959
|
node->parent = parent;
|
|
694
960
|
node->firstchild = NULL;
|
|
695
961
|
node->mem_allocated = 0;
|
|
@@ -729,7 +995,7 @@ MemoryContextAlloc(MemoryContext context, Size size)
|
|
|
729
995
|
{
|
|
730
996
|
void *ret;
|
|
731
997
|
|
|
732
|
-
|
|
998
|
+
Assert(MemoryContextIsValid(context));
|
|
733
999
|
AssertNotInCriticalSection(context);
|
|
734
1000
|
|
|
735
1001
|
if (!AllocSizeIsValid(size))
|
|
@@ -772,7 +1038,7 @@ MemoryContextAllocZero(MemoryContext context, Size size)
|
|
|
772
1038
|
{
|
|
773
1039
|
void *ret;
|
|
774
1040
|
|
|
775
|
-
|
|
1041
|
+
Assert(MemoryContextIsValid(context));
|
|
776
1042
|
AssertNotInCriticalSection(context);
|
|
777
1043
|
|
|
778
1044
|
if (!AllocSizeIsValid(size))
|
|
@@ -810,7 +1076,7 @@ MemoryContextAllocZeroAligned(MemoryContext context, Size size)
|
|
|
810
1076
|
{
|
|
811
1077
|
void *ret;
|
|
812
1078
|
|
|
813
|
-
|
|
1079
|
+
Assert(MemoryContextIsValid(context));
|
|
814
1080
|
AssertNotInCriticalSection(context);
|
|
815
1081
|
|
|
816
1082
|
if (!AllocSizeIsValid(size))
|
|
@@ -840,6 +1106,62 @@ MemoryContextAllocZeroAligned(MemoryContext context, Size size)
|
|
|
840
1106
|
* MemoryContextAllocExtended
|
|
841
1107
|
* Allocate space within the specified context using the given flags.
|
|
842
1108
|
*/
|
|
1109
|
+
void *
|
|
1110
|
+
MemoryContextAllocExtended(MemoryContext context, Size size, int flags)
|
|
1111
|
+
{
|
|
1112
|
+
void *ret;
|
|
1113
|
+
|
|
1114
|
+
Assert(MemoryContextIsValid(context));
|
|
1115
|
+
AssertNotInCriticalSection(context);
|
|
1116
|
+
|
|
1117
|
+
if (!((flags & MCXT_ALLOC_HUGE) != 0 ? AllocHugeSizeIsValid(size) :
|
|
1118
|
+
AllocSizeIsValid(size)))
|
|
1119
|
+
elog(ERROR, "invalid memory alloc request size %zu", size);
|
|
1120
|
+
|
|
1121
|
+
context->isReset = false;
|
|
1122
|
+
|
|
1123
|
+
ret = context->methods->alloc(context, size);
|
|
1124
|
+
if (unlikely(ret == NULL))
|
|
1125
|
+
{
|
|
1126
|
+
if ((flags & MCXT_ALLOC_NO_OOM) == 0)
|
|
1127
|
+
{
|
|
1128
|
+
MemoryContextStats(TopMemoryContext);
|
|
1129
|
+
ereport(ERROR,
|
|
1130
|
+
(errcode(ERRCODE_OUT_OF_MEMORY),
|
|
1131
|
+
errmsg("out of memory"),
|
|
1132
|
+
errdetail("Failed on request of size %zu in memory context \"%s\".",
|
|
1133
|
+
size, context->name)));
|
|
1134
|
+
}
|
|
1135
|
+
return NULL;
|
|
1136
|
+
}
|
|
1137
|
+
|
|
1138
|
+
VALGRIND_MEMPOOL_ALLOC(context, ret, size);
|
|
1139
|
+
|
|
1140
|
+
if ((flags & MCXT_ALLOC_ZERO) != 0)
|
|
1141
|
+
MemSetAligned(ret, 0, size);
|
|
1142
|
+
|
|
1143
|
+
return ret;
|
|
1144
|
+
}
|
|
1145
|
+
|
|
1146
|
+
/*
|
|
1147
|
+
* HandleLogMemoryContextInterrupt
|
|
1148
|
+
* Handle receipt of an interrupt indicating logging of memory
|
|
1149
|
+
* contexts.
|
|
1150
|
+
*
|
|
1151
|
+
* All the actual work is deferred to ProcessLogMemoryContextInterrupt(),
|
|
1152
|
+
* because we cannot safely emit a log message inside the signal handler.
|
|
1153
|
+
*/
|
|
1154
|
+
|
|
1155
|
+
|
|
1156
|
+
/*
|
|
1157
|
+
* ProcessLogMemoryContextInterrupt
|
|
1158
|
+
* Perform logging of memory contexts of this backend process.
|
|
1159
|
+
*
|
|
1160
|
+
* Any backend that participates in ProcSignal signaling must arrange
|
|
1161
|
+
* to call this function if we see LogMemoryContextPending set.
|
|
1162
|
+
* It is called from CHECK_FOR_INTERRUPTS(), which is enough because
|
|
1163
|
+
* the target process for logging of memory contexts is a backend.
|
|
1164
|
+
*/
|
|
843
1165
|
|
|
844
1166
|
|
|
845
1167
|
void *
|
|
@@ -849,7 +1171,7 @@ palloc(Size size)
|
|
|
849
1171
|
void *ret;
|
|
850
1172
|
MemoryContext context = CurrentMemoryContext;
|
|
851
1173
|
|
|
852
|
-
|
|
1174
|
+
Assert(MemoryContextIsValid(context));
|
|
853
1175
|
AssertNotInCriticalSection(context);
|
|
854
1176
|
|
|
855
1177
|
if (!AllocSizeIsValid(size))
|
|
@@ -880,7 +1202,7 @@ palloc0(Size size)
|
|
|
880
1202
|
void *ret;
|
|
881
1203
|
MemoryContext context = CurrentMemoryContext;
|
|
882
1204
|
|
|
883
|
-
|
|
1205
|
+
Assert(MemoryContextIsValid(context));
|
|
884
1206
|
AssertNotInCriticalSection(context);
|
|
885
1207
|
|
|
886
1208
|
if (!AllocSizeIsValid(size))
|
|
@@ -908,6 +1230,125 @@ palloc0(Size size)
|
|
|
908
1230
|
|
|
909
1231
|
|
|
910
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
|
+
|
|
911
1352
|
/*
|
|
912
1353
|
* pfree
|
|
913
1354
|
* Release an allocated chunk.
|
|
@@ -915,10 +1356,17 @@ palloc0(Size size)
|
|
|
915
1356
|
void
|
|
916
1357
|
pfree(void *pointer)
|
|
917
1358
|
{
|
|
1359
|
+
#ifdef USE_VALGRIND
|
|
1360
|
+
MemoryContextMethodID method = GetMemoryChunkMethodID(pointer);
|
|
918
1361
|
MemoryContext context = GetMemoryChunkContext(pointer);
|
|
1362
|
+
#endif
|
|
919
1363
|
|
|
920
|
-
|
|
921
|
-
|
|
1364
|
+
MCXT_METHOD(pointer, free_p) (pointer);
|
|
1365
|
+
|
|
1366
|
+
#ifdef USE_VALGRIND
|
|
1367
|
+
if (method != MCTX_ALIGNED_REDIRECT_ID)
|
|
1368
|
+
VALGRIND_MEMPOOL_FREE(context, pointer);
|
|
1369
|
+
#endif
|
|
922
1370
|
}
|
|
923
1371
|
|
|
924
1372
|
/*
|
|
@@ -928,7 +1376,12 @@ pfree(void *pointer)
|
|
|
928
1376
|
void *
|
|
929
1377
|
repalloc(void *pointer, Size size)
|
|
930
1378
|
{
|
|
1379
|
+
#ifdef USE_VALGRIND
|
|
1380
|
+
MemoryContextMethodID method = GetMemoryChunkMethodID(pointer);
|
|
1381
|
+
#endif
|
|
1382
|
+
#if defined(USE_ASSERT_CHECKING) || defined(USE_VALGRIND)
|
|
931
1383
|
MemoryContext context = GetMemoryChunkContext(pointer);
|
|
1384
|
+
#endif
|
|
932
1385
|
void *ret;
|
|
933
1386
|
|
|
934
1387
|
if (!AllocSizeIsValid(size))
|
|
@@ -939,22 +1392,42 @@ repalloc(void *pointer, Size size)
|
|
|
939
1392
|
/* isReset must be false already */
|
|
940
1393
|
Assert(!context->isReset);
|
|
941
1394
|
|
|
942
|
-
ret =
|
|
1395
|
+
ret = MCXT_METHOD(pointer, realloc) (pointer, size);
|
|
943
1396
|
if (unlikely(ret == NULL))
|
|
944
1397
|
{
|
|
1398
|
+
MemoryContext cxt = GetMemoryChunkContext(pointer);
|
|
1399
|
+
|
|
945
1400
|
MemoryContextStats(TopMemoryContext);
|
|
946
1401
|
ereport(ERROR,
|
|
947
1402
|
(errcode(ERRCODE_OUT_OF_MEMORY),
|
|
948
1403
|
errmsg("out of memory"),
|
|
949
1404
|
errdetail("Failed on request of size %zu in memory context \"%s\".",
|
|
950
|
-
size,
|
|
1405
|
+
size, cxt->name)));
|
|
951
1406
|
}
|
|
952
1407
|
|
|
953
|
-
|
|
1408
|
+
#ifdef USE_VALGRIND
|
|
1409
|
+
if (method != MCTX_ALIGNED_REDIRECT_ID)
|
|
1410
|
+
VALGRIND_MEMPOOL_CHANGE(context, pointer, ret, size);
|
|
1411
|
+
#endif
|
|
954
1412
|
|
|
955
1413
|
return ret;
|
|
956
1414
|
}
|
|
957
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
|
+
|
|
958
1431
|
/*
|
|
959
1432
|
* MemoryContextAllocHuge
|
|
960
1433
|
* Allocate (possibly-expansive) space within the specified context.
|