pg_query 5.1.0 → 6.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG.md +30 -0
- data/README.md +1 -1
- data/Rakefile +4 -4
- data/ext/pg_query/ext_symbols_freebsd.sym +1 -0
- data/ext/pg_query/ext_symbols_freebsd_with_ruby_abi_version.sym +2 -0
- data/ext/pg_query/ext_symbols_openbsd.sym +1 -0
- data/ext/pg_query/ext_symbols_openbsd_with_ruby_abi_version.sym +2 -0
- data/ext/pg_query/ext_symbols_with_ruby_abi_version.sym +2 -0
- data/ext/pg_query/extconf.rb +20 -6
- data/ext/pg_query/include/pg_query.h +4 -3
- data/ext/pg_query/include/pg_query_enum_defs.c +424 -154
- data/ext/pg_query/include/pg_query_fingerprint_conds.c +68 -4
- data/ext/pg_query/include/pg_query_fingerprint_defs.c +2952 -1845
- data/ext/pg_query/include/pg_query_outfuncs_conds.c +51 -3
- data/ext/pg_query/include/pg_query_outfuncs_defs.c +210 -23
- data/ext/pg_query/include/pg_query_readfuncs_conds.c +17 -1
- data/ext/pg_query/include/pg_query_readfuncs_defs.c +271 -52
- data/ext/pg_query/include/postgres/access/amapi.h +14 -3
- data/ext/pg_query/include/postgres/access/attmap.h +1 -1
- data/ext/pg_query/include/postgres/access/attnum.h +1 -1
- data/ext/pg_query/include/postgres/access/brin_internal.h +116 -0
- data/ext/pg_query/include/postgres/access/brin_tuple.h +112 -0
- data/ext/pg_query/include/postgres/access/clog.h +2 -3
- data/ext/pg_query/include/postgres/access/commit_ts.h +2 -3
- data/ext/pg_query/include/postgres/access/detoast.h +1 -1
- data/ext/pg_query/include/postgres/access/genam.h +17 -4
- data/ext/pg_query/include/postgres/access/gin.h +1 -1
- data/ext/pg_query/include/postgres/access/htup.h +1 -1
- data/ext/pg_query/include/postgres/access/htup_details.h +11 -11
- data/ext/pg_query/include/postgres/access/itup.h +3 -3
- data/ext/pg_query/include/postgres/access/parallel.h +1 -2
- data/ext/pg_query/include/postgres/access/printtup.h +1 -1
- data/ext/pg_query/include/postgres/access/relation.h +1 -1
- data/ext/pg_query/include/postgres/access/relscan.h +1 -1
- data/ext/pg_query/include/postgres/access/rmgrlist.h +1 -1
- data/ext/pg_query/include/postgres/access/sdir.h +1 -1
- data/ext/pg_query/include/postgres/access/skey.h +1 -1
- data/ext/pg_query/include/postgres/access/slru.h +218 -0
- data/ext/pg_query/include/postgres/access/stratnum.h +1 -1
- data/ext/pg_query/include/postgres/access/sysattr.h +1 -1
- data/ext/pg_query/include/postgres/access/table.h +1 -1
- data/ext/pg_query/include/postgres/access/tableam.h +35 -25
- data/ext/pg_query/include/postgres/access/tidstore.h +50 -0
- data/ext/pg_query/include/postgres/access/toast_compression.h +2 -2
- data/ext/pg_query/include/postgres/access/transam.h +50 -7
- data/ext/pg_query/include/postgres/access/tsmapi.h +1 -1
- data/ext/pg_query/include/postgres/access/tupconvert.h +1 -1
- data/ext/pg_query/include/postgres/access/tupdesc.h +5 -5
- data/ext/pg_query/include/postgres/access/tupmacs.h +1 -1
- data/ext/pg_query/include/postgres/access/twophase.h +2 -2
- data/ext/pg_query/include/postgres/access/xact.h +5 -5
- data/ext/pg_query/include/postgres/access/xlog.h +20 -12
- data/ext/pg_query/include/postgres/access/xlog_internal.h +4 -3
- data/ext/pg_query/include/postgres/access/xlogbackup.h +3 -1
- data/ext/pg_query/include/postgres/access/xlogdefs.h +5 -5
- data/ext/pg_query/include/postgres/access/xlogprefetcher.h +2 -2
- data/ext/pg_query/include/postgres/access/xlogreader.h +2 -2
- data/ext/pg_query/include/postgres/access/xlogrecord.h +3 -3
- data/ext/pg_query/include/postgres/access/xlogrecovery.h +4 -4
- data/ext/pg_query/include/postgres/archive/archive_module.h +9 -1
- data/ext/pg_query/include/postgres/c.h +32 -37
- data/ext/pg_query/include/postgres/catalog/catalog.h +3 -1
- data/ext/pg_query/include/postgres/catalog/catversion.h +2 -2
- data/ext/pg_query/include/postgres/catalog/dependency.h +17 -59
- data/ext/pg_query/include/postgres/catalog/genbki.h +12 -6
- data/ext/pg_query/include/postgres/catalog/index.h +22 -18
- data/ext/pg_query/include/postgres/catalog/indexing.h +1 -1
- data/ext/pg_query/include/postgres/catalog/namespace.h +18 -19
- data/ext/pg_query/include/postgres/catalog/objectaccess.h +2 -2
- data/ext/pg_query/include/postgres/catalog/objectaddress.h +5 -1
- data/ext/pg_query/include/postgres/catalog/pg_aggregate.h +4 -2
- data/ext/pg_query/include/postgres/catalog/pg_aggregate_d.h +1 -1
- data/ext/pg_query/include/postgres/catalog/pg_am.h +6 -3
- data/ext/pg_query/include/postgres/catalog/pg_am_d.h +1 -1
- data/ext/pg_query/include/postgres/catalog/pg_attribute.h +31 -14
- data/ext/pg_query/include/postgres/catalog/pg_attribute_d.h +3 -3
- data/ext/pg_query/include/postgres/catalog/pg_authid.h +6 -3
- data/ext/pg_query/include/postgres/catalog/pg_authid_d.h +2 -1
- data/ext/pg_query/include/postgres/catalog/pg_class.h +10 -5
- data/ext/pg_query/include/postgres/catalog/pg_class_d.h +4 -2
- data/ext/pg_query/include/postgres/catalog/pg_collation.h +11 -5
- data/ext/pg_query/include/postgres/catalog/pg_collation_d.h +5 -2
- data/ext/pg_query/include/postgres/catalog/pg_constraint.h +15 -10
- data/ext/pg_query/include/postgres/catalog/pg_constraint_d.h +2 -1
- data/ext/pg_query/include/postgres/catalog/pg_control.h +5 -3
- data/ext/pg_query/include/postgres/catalog/pg_conversion.h +8 -4
- data/ext/pg_query/include/postgres/catalog/pg_conversion_d.h +1 -1
- data/ext/pg_query/include/postgres/catalog/pg_database.h +9 -4
- data/ext/pg_query/include/postgres/catalog/pg_database_d.h +13 -12
- data/ext/pg_query/include/postgres/catalog/pg_depend.h +3 -3
- data/ext/pg_query/include/postgres/catalog/pg_depend_d.h +1 -1
- data/ext/pg_query/include/postgres/catalog/pg_event_trigger.h +6 -3
- data/ext/pg_query/include/postgres/catalog/pg_event_trigger_d.h +1 -1
- data/ext/pg_query/include/postgres/catalog/pg_index.h +5 -3
- data/ext/pg_query/include/postgres/catalog/pg_index_d.h +1 -1
- data/ext/pg_query/include/postgres/catalog/pg_language.h +6 -3
- data/ext/pg_query/include/postgres/catalog/pg_language_d.h +1 -1
- data/ext/pg_query/include/postgres/catalog/pg_namespace.h +6 -3
- data/ext/pg_query/include/postgres/catalog/pg_namespace_d.h +1 -1
- data/ext/pg_query/include/postgres/catalog/pg_opclass.h +6 -3
- data/ext/pg_query/include/postgres/catalog/pg_opclass_d.h +1 -1
- data/ext/pg_query/include/postgres/catalog/pg_operator.h +20 -3
- data/ext/pg_query/include/postgres/catalog/pg_operator_d.h +1 -1
- data/ext/pg_query/include/postgres/catalog/pg_opfamily.h +6 -3
- data/ext/pg_query/include/postgres/catalog/pg_opfamily_d.h +1 -1
- data/ext/pg_query/include/postgres/catalog/pg_partitioned_table.h +4 -2
- data/ext/pg_query/include/postgres/catalog/pg_partitioned_table_d.h +1 -1
- data/ext/pg_query/include/postgres/catalog/pg_proc.h +6 -3
- data/ext/pg_query/include/postgres/catalog/pg_proc_d.h +1 -1
- data/ext/pg_query/include/postgres/catalog/pg_publication.h +6 -3
- data/ext/pg_query/include/postgres/catalog/pg_publication_d.h +1 -1
- data/ext/pg_query/include/postgres/catalog/pg_replication_origin.h +6 -3
- data/ext/pg_query/include/postgres/catalog/pg_replication_origin_d.h +1 -1
- data/ext/pg_query/include/postgres/catalog/pg_statistic.h +10 -4
- data/ext/pg_query/include/postgres/catalog/pg_statistic_d.h +7 -3
- data/ext/pg_query/include/postgres/catalog/pg_statistic_ext.h +10 -7
- data/ext/pg_query/include/postgres/catalog/pg_statistic_ext_d.h +3 -3
- data/ext/pg_query/include/postgres/catalog/pg_transform.h +6 -3
- data/ext/pg_query/include/postgres/catalog/pg_transform_d.h +1 -1
- data/ext/pg_query/include/postgres/catalog/pg_trigger.h +4 -4
- data/ext/pg_query/include/postgres/catalog/pg_trigger_d.h +1 -1
- data/ext/pg_query/include/postgres/catalog/pg_ts_config.h +6 -3
- data/ext/pg_query/include/postgres/catalog/pg_ts_config_d.h +1 -1
- data/ext/pg_query/include/postgres/catalog/pg_ts_dict.h +6 -3
- data/ext/pg_query/include/postgres/catalog/pg_ts_dict_d.h +1 -1
- data/ext/pg_query/include/postgres/catalog/pg_ts_parser.h +6 -3
- data/ext/pg_query/include/postgres/catalog/pg_ts_parser_d.h +1 -1
- data/ext/pg_query/include/postgres/catalog/pg_ts_template.h +6 -3
- data/ext/pg_query/include/postgres/catalog/pg_ts_template_d.h +1 -1
- data/ext/pg_query/include/postgres/catalog/pg_type.h +6 -3
- data/ext/pg_query/include/postgres/catalog/pg_type_d.h +1 -1
- data/ext/pg_query/include/postgres/catalog/storage.h +1 -1
- data/ext/pg_query/include/postgres/catalog/syscache_ids.h +104 -0
- data/ext/pg_query/include/postgres/commands/async.h +2 -6
- data/ext/pg_query/include/postgres/commands/dbcommands.h +1 -1
- data/ext/pg_query/include/postgres/commands/defrem.h +6 -6
- data/ext/pg_query/include/postgres/commands/event_trigger.h +11 -2
- data/ext/pg_query/include/postgres/commands/explain.h +19 -3
- data/ext/pg_query/include/postgres/commands/prepare.h +1 -1
- data/ext/pg_query/include/postgres/commands/tablespace.h +1 -1
- data/ext/pg_query/include/postgres/commands/trigger.h +1 -1
- data/ext/pg_query/include/postgres/commands/vacuum.h +28 -26
- data/ext/pg_query/include/postgres/common/cryptohash.h +2 -2
- data/ext/pg_query/include/postgres/common/file_perm.h +1 -1
- data/ext/pg_query/include/postgres/common/file_utils.h +65 -0
- data/ext/pg_query/include/postgres/common/hashfn.h +16 -1
- data/ext/pg_query/include/postgres/common/hashfn_unstable.h +407 -0
- data/ext/pg_query/include/postgres/common/int.h +79 -4
- data/ext/pg_query/include/postgres/common/keywords.h +1 -1
- data/ext/pg_query/include/postgres/common/kwlookup.h +1 -1
- data/ext/pg_query/include/postgres/common/pg_prng.h +2 -1
- data/ext/pg_query/include/postgres/common/relpath.h +4 -4
- data/ext/pg_query/include/postgres/common/scram-common.h +1 -1
- data/ext/pg_query/include/postgres/common/sha2.h +1 -1
- data/ext/pg_query/include/postgres/common/string.h +1 -1
- data/ext/pg_query/include/postgres/common/unicode_east_asian_fw_table.h +2 -3
- data/ext/pg_query/include/postgres/copyfuncs.funcs.c +278 -30
- data/ext/pg_query/include/postgres/copyfuncs.switch.c +55 -4
- data/ext/pg_query/include/postgres/datatype/timestamp.h +29 -3
- data/ext/pg_query/include/postgres/equalfuncs.funcs.c +239 -26
- data/ext/pg_query/include/postgres/equalfuncs.switch.c +55 -4
- data/ext/pg_query/include/postgres/executor/execdesc.h +2 -2
- data/ext/pg_query/include/postgres/executor/executor.h +6 -5
- data/ext/pg_query/include/postgres/executor/functions.h +2 -1
- data/ext/pg_query/include/postgres/executor/instrument.h +5 -3
- data/ext/pg_query/include/postgres/executor/spi.h +2 -8
- data/ext/pg_query/include/postgres/executor/tablefunc.h +1 -1
- data/ext/pg_query/include/postgres/executor/tuptable.h +31 -2
- data/ext/pg_query/include/postgres/fmgr.h +2 -2
- data/ext/pg_query/include/postgres/foreign/fdwapi.h +1 -1
- data/ext/pg_query/include/postgres/funcapi.h +2 -2
- data/ext/pg_query/include/postgres/gram.h +871 -830
- data/ext/pg_query/include/postgres/gramparse.h +1 -1
- data/ext/pg_query/include/postgres/jit/jit.h +4 -3
- data/ext/pg_query/include/postgres/kwlist_d.h +511 -466
- data/ext/pg_query/include/postgres/lib/dshash.h +25 -10
- data/ext/pg_query/include/postgres/lib/ilist.h +1 -1
- data/ext/pg_query/include/postgres/lib/pairingheap.h +1 -1
- data/ext/pg_query/include/postgres/lib/simplehash.h +40 -18
- data/ext/pg_query/include/postgres/lib/sort_template.h +14 -1
- data/ext/pg_query/include/postgres/lib/stringinfo.h +93 -11
- data/ext/pg_query/include/postgres/libpq/auth.h +1 -1
- data/ext/pg_query/include/postgres/libpq/crypt.h +2 -2
- data/ext/pg_query/include/postgres/libpq/hba.h +4 -4
- data/ext/pg_query/include/postgres/libpq/libpq-be.h +35 -28
- data/ext/pg_query/include/postgres/libpq/libpq.h +6 -7
- data/ext/pg_query/include/postgres/libpq/pqcomm.h +26 -20
- data/ext/pg_query/include/postgres/libpq/pqformat.h +2 -3
- data/ext/pg_query/include/postgres/libpq/pqsignal.h +1 -1
- data/ext/pg_query/include/postgres/libpq/protocol.h +89 -0
- data/ext/pg_query/include/postgres/libpq/sasl.h +1 -1
- data/ext/pg_query/include/postgres/libpq/scram.h +1 -1
- data/ext/pg_query/include/postgres/mb/pg_wchar.h +103 -82
- data/ext/pg_query/include/postgres/mb/stringinfo_mb.h +1 -1
- data/ext/pg_query/include/postgres/miscadmin.h +72 -52
- data/ext/pg_query/include/postgres/nodes/bitmapset.h +17 -3
- data/ext/pg_query/include/postgres/nodes/execnodes.h +112 -25
- data/ext/pg_query/include/postgres/nodes/extensible.h +1 -1
- data/ext/pg_query/include/postgres/nodes/lockoptions.h +4 -4
- data/ext/pg_query/include/postgres/nodes/makefuncs.h +8 -2
- data/ext/pg_query/include/postgres/nodes/memnodes.h +43 -4
- data/ext/pg_query/include/postgres/nodes/miscnodes.h +1 -1
- data/ext/pg_query/include/postgres/nodes/nodeFuncs.h +1 -1
- data/ext/pg_query/include/postgres/nodes/nodes.h +30 -41
- data/ext/pg_query/include/postgres/nodes/nodetags.h +464 -444
- data/ext/pg_query/include/postgres/nodes/params.h +1 -1
- data/ext/pg_query/include/postgres/nodes/parsenodes.h +358 -175
- data/ext/pg_query/include/postgres/nodes/pathnodes.h +64 -10
- data/ext/pg_query/include/postgres/nodes/pg_list.h +62 -11
- data/ext/pg_query/include/postgres/nodes/plannodes.h +11 -10
- data/ext/pg_query/include/postgres/nodes/primnodes.h +352 -54
- data/ext/pg_query/include/postgres/nodes/print.h +1 -1
- data/ext/pg_query/include/postgres/nodes/queryjumble.h +2 -2
- data/ext/pg_query/include/postgres/nodes/replnodes.h +23 -2
- data/ext/pg_query/include/postgres/nodes/supportnodes.h +1 -1
- data/ext/pg_query/include/postgres/nodes/tidbitmap.h +1 -1
- data/ext/pg_query/include/postgres/nodes/value.h +1 -1
- data/ext/pg_query/include/postgres/optimizer/cost.h +5 -4
- data/ext/pg_query/include/postgres/optimizer/geqo.h +1 -1
- data/ext/pg_query/include/postgres/optimizer/geqo_gene.h +1 -1
- data/ext/pg_query/include/postgres/optimizer/optimizer.h +5 -2
- data/ext/pg_query/include/postgres/optimizer/paths.h +13 -8
- data/ext/pg_query/include/postgres/optimizer/planmain.h +7 -1
- data/ext/pg_query/include/postgres/parser/analyze.h +3 -1
- data/ext/pg_query/include/postgres/parser/kwlist.h +22 -2
- data/ext/pg_query/include/postgres/parser/parse_agg.h +1 -1
- data/ext/pg_query/include/postgres/parser/parse_coerce.h +5 -2
- data/ext/pg_query/include/postgres/parser/parse_expr.h +1 -1
- data/ext/pg_query/include/postgres/parser/parse_func.h +2 -2
- data/ext/pg_query/include/postgres/parser/parse_node.h +3 -2
- data/ext/pg_query/include/postgres/parser/parse_oper.h +4 -1
- data/ext/pg_query/include/postgres/parser/parse_relation.h +1 -1
- data/ext/pg_query/include/postgres/parser/parse_type.h +2 -2
- data/ext/pg_query/include/postgres/parser/parser.h +3 -3
- data/ext/pg_query/include/postgres/parser/parsetree.h +1 -1
- data/ext/pg_query/include/postgres/parser/scanner.h +1 -1
- data/ext/pg_query/include/postgres/parser/scansup.h +1 -1
- data/ext/pg_query/include/postgres/partitioning/partdefs.h +1 -1
- data/ext/pg_query/include/postgres/pg_config.h +53 -45
- data/ext/pg_query/include/postgres/pg_config_manual.h +21 -8
- data/ext/pg_query/include/postgres/pg_getopt.h +1 -1
- data/ext/pg_query/include/postgres/pg_trace.h +1 -1
- data/ext/pg_query/include/postgres/pgstat.h +13 -11
- data/ext/pg_query/include/postgres/pgtime.h +1 -1
- data/ext/pg_query/include/postgres/pl_reserved_kwlist.h +1 -1
- data/ext/pg_query/include/postgres/pl_reserved_kwlist_d.h +1 -1
- data/ext/pg_query/include/postgres/pl_unreserved_kwlist.h +1 -1
- data/ext/pg_query/include/postgres/pl_unreserved_kwlist_d.h +1 -1
- data/ext/pg_query/include/postgres/plerrcodes.h +4 -4
- data/ext/pg_query/include/postgres/plpgsql.h +15 -13
- data/ext/pg_query/include/postgres/port/atomics/arch-arm.h +1 -1
- data/ext/pg_query/include/postgres/port/atomics/arch-hppa.h +1 -1
- data/ext/pg_query/include/postgres/port/atomics/arch-ppc.h +3 -1
- data/ext/pg_query/include/postgres/port/atomics/arch-x86.h +3 -1
- data/ext/pg_query/include/postgres/port/atomics/fallback.h +1 -1
- data/ext/pg_query/include/postgres/port/atomics/generic-gcc.h +38 -1
- data/ext/pg_query/include/postgres/port/atomics/generic-msvc.h +19 -1
- data/ext/pg_query/include/postgres/port/atomics/generic-sunpro.h +16 -1
- data/ext/pg_query/include/postgres/port/atomics/generic.h +38 -2
- data/ext/pg_query/include/postgres/port/atomics.h +93 -6
- data/ext/pg_query/include/postgres/port/pg_bitutils.h +91 -9
- data/ext/pg_query/include/postgres/port/pg_bswap.h +1 -1
- data/ext/pg_query/include/postgres/port/pg_crc32c.h +10 -1
- data/ext/pg_query/include/postgres/port/pg_iovec.h +117 -0
- data/ext/pg_query/include/postgres/port/simd.h +48 -1
- data/ext/pg_query/include/postgres/port/win32/sys/socket.h +8 -0
- data/ext/pg_query/include/postgres/port/win32_port.h +1 -13
- data/ext/pg_query/include/postgres/port.h +39 -4
- data/ext/pg_query/include/postgres/portability/instr_time.h +1 -1
- data/ext/pg_query/include/postgres/postgres.h +1 -1
- data/ext/pg_query/include/postgres/postmaster/autovacuum.h +5 -16
- data/ext/pg_query/include/postgres/postmaster/bgworker.h +8 -6
- data/ext/pg_query/include/postgres/postmaster/bgworker_internals.h +3 -7
- data/ext/pg_query/include/postgres/postmaster/bgwriter.h +3 -3
- data/ext/pg_query/include/postgres/postmaster/interrupt.h +1 -1
- data/ext/pg_query/include/postgres/postmaster/pgarch.h +2 -2
- data/ext/pg_query/include/postgres/postmaster/postmaster.h +25 -5
- data/ext/pg_query/include/postgres/postmaster/startup.h +2 -2
- data/ext/pg_query/include/postgres/postmaster/syslogger.h +2 -4
- data/ext/pg_query/include/postgres/postmaster/walsummarizer.h +35 -0
- data/ext/pg_query/include/postgres/postmaster/walwriter.h +2 -2
- data/ext/pg_query/include/postgres/regex/regex.h +92 -9
- data/ext/pg_query/include/postgres/replication/logicallauncher.h +1 -1
- data/ext/pg_query/include/postgres/replication/logicalproto.h +2 -2
- data/ext/pg_query/include/postgres/replication/logicalworker.h +2 -1
- data/ext/pg_query/include/postgres/replication/origin.h +1 -1
- data/ext/pg_query/include/postgres/replication/reorderbuffer.h +27 -46
- data/ext/pg_query/include/postgres/replication/slot.h +45 -5
- data/ext/pg_query/include/postgres/replication/slotsync.h +38 -0
- data/ext/pg_query/include/postgres/replication/syncrep.h +1 -1
- data/ext/pg_query/include/postgres/replication/walreceiver.h +37 -11
- data/ext/pg_query/include/postgres/replication/walsender.h +5 -3
- data/ext/pg_query/include/postgres/rewrite/prs2lock.h +1 -1
- data/ext/pg_query/include/postgres/rewrite/rewriteHandler.h +7 -1
- data/ext/pg_query/include/postgres/rewrite/rewriteManip.h +2 -2
- data/ext/pg_query/include/postgres/rewrite/rewriteSupport.h +1 -1
- data/ext/pg_query/include/postgres/storage/block.h +1 -1
- data/ext/pg_query/include/postgres/storage/buf.h +1 -1
- data/ext/pg_query/include/postgres/storage/bufmgr.h +59 -41
- data/ext/pg_query/include/postgres/storage/bufpage.h +1 -1
- data/ext/pg_query/include/postgres/storage/condition_variable.h +1 -1
- data/ext/pg_query/include/postgres/storage/dsm.h +1 -1
- data/ext/pg_query/include/postgres/storage/dsm_impl.h +2 -2
- data/ext/pg_query/include/postgres/storage/fd.h +30 -13
- data/ext/pg_query/include/postgres/storage/fileset.h +1 -1
- data/ext/pg_query/include/postgres/storage/ipc.h +4 -1
- data/ext/pg_query/include/postgres/storage/item.h +1 -1
- data/ext/pg_query/include/postgres/storage/itemid.h +1 -1
- data/ext/pg_query/include/postgres/storage/itemptr.h +1 -1
- data/ext/pg_query/include/postgres/storage/large_object.h +1 -1
- data/ext/pg_query/include/postgres/storage/latch.h +4 -2
- data/ext/pg_query/include/postgres/storage/lmgr.h +8 -2
- data/ext/pg_query/include/postgres/storage/lock.h +19 -19
- data/ext/pg_query/include/postgres/storage/lockdefs.h +3 -1
- data/ext/pg_query/include/postgres/storage/lwlock.h +17 -9
- data/ext/pg_query/include/postgres/storage/lwlocknames.h +7 -10
- data/ext/pg_query/include/postgres/storage/off.h +1 -1
- data/ext/pg_query/include/postgres/storage/pg_sema.h +1 -1
- data/ext/pg_query/include/postgres/storage/pg_shmem.h +5 -4
- data/ext/pg_query/include/postgres/storage/pmsignal.h +2 -2
- data/ext/pg_query/include/postgres/storage/predicate.h +1 -5
- data/ext/pg_query/include/postgres/storage/proc.h +48 -26
- data/ext/pg_query/include/postgres/storage/procarray.h +5 -1
- data/ext/pg_query/include/postgres/storage/proclist_types.h +11 -9
- data/ext/pg_query/include/postgres/storage/procnumber.h +43 -0
- data/ext/pg_query/include/postgres/storage/procsignal.h +8 -6
- data/ext/pg_query/include/postgres/storage/read_stream.h +65 -0
- data/ext/pg_query/include/postgres/storage/relfilelocator.h +16 -15
- data/ext/pg_query/include/postgres/storage/s_lock.h +7 -27
- data/ext/pg_query/include/postgres/storage/sharedfileset.h +1 -1
- data/ext/pg_query/include/postgres/storage/shm_mq.h +2 -2
- data/ext/pg_query/include/postgres/storage/shm_toc.h +1 -1
- data/ext/pg_query/include/postgres/storage/shmem.h +1 -1
- data/ext/pg_query/include/postgres/storage/sinval.h +3 -3
- data/ext/pg_query/include/postgres/storage/smgr.h +46 -29
- data/ext/pg_query/include/postgres/storage/spin.h +1 -1
- data/ext/pg_query/include/postgres/storage/standby.h +13 -3
- data/ext/pg_query/include/postgres/storage/standbydefs.h +2 -2
- data/ext/pg_query/include/postgres/storage/sync.h +4 -4
- data/ext/pg_query/include/postgres/tcop/cmdtag.h +1 -2
- data/ext/pg_query/include/postgres/tcop/cmdtaglist.h +3 -2
- data/ext/pg_query/include/postgres/tcop/deparse_utility.h +2 -2
- data/ext/pg_query/include/postgres/tcop/dest.h +3 -2
- data/ext/pg_query/include/postgres/tcop/fastpath.h +1 -1
- data/ext/pg_query/include/postgres/tcop/pquery.h +1 -1
- data/ext/pg_query/include/postgres/tcop/tcopprot.h +9 -5
- data/ext/pg_query/include/postgres/tcop/utility.h +2 -2
- data/ext/pg_query/include/postgres/tsearch/ts_cache.h +1 -1
- data/ext/pg_query/include/postgres/utils/acl.h +19 -7
- data/ext/pg_query/include/postgres/utils/aclchk_internal.h +1 -1
- data/ext/pg_query/include/postgres/utils/array.h +1 -2
- data/ext/pg_query/include/postgres/utils/ascii.h +84 -0
- data/ext/pg_query/include/postgres/utils/backend_progress.h +3 -2
- data/ext/pg_query/include/postgres/utils/backend_status.h +8 -10
- data/ext/pg_query/include/postgres/utils/builtins.h +4 -1
- data/ext/pg_query/include/postgres/utils/bytea.h +2 -2
- data/ext/pg_query/include/postgres/utils/catcache.h +6 -6
- data/ext/pg_query/include/postgres/utils/date.h +1 -1
- data/ext/pg_query/include/postgres/utils/datetime.h +4 -1
- data/ext/pg_query/include/postgres/utils/datum.h +1 -1
- data/ext/pg_query/include/postgres/utils/dsa.h +44 -5
- data/ext/pg_query/include/postgres/utils/elog.h +3 -8
- data/ext/pg_query/include/postgres/utils/errcodes.h +1 -3
- data/ext/pg_query/include/postgres/utils/expandeddatum.h +1 -1
- data/ext/pg_query/include/postgres/utils/expandedrecord.h +1 -1
- data/ext/pg_query/include/postgres/utils/float.h +1 -1
- data/ext/pg_query/include/postgres/utils/fmgroids.h +49 -16
- data/ext/pg_query/include/postgres/utils/fmgrprotos.h +47 -14
- data/ext/pg_query/include/postgres/utils/fmgrtab.h +1 -1
- data/ext/pg_query/include/postgres/utils/guc.h +20 -6
- data/ext/pg_query/include/postgres/utils/guc_hooks.h +23 -2
- data/ext/pg_query/include/postgres/utils/guc_tables.h +6 -5
- data/ext/pg_query/include/postgres/utils/hsearch.h +2 -2
- data/ext/pg_query/include/postgres/utils/injection_point.h +44 -0
- data/ext/pg_query/include/postgres/utils/inval.h +1 -1
- data/ext/pg_query/include/postgres/utils/logtape.h +5 -5
- data/ext/pg_query/include/postgres/utils/lsyscache.h +6 -3
- data/ext/pg_query/include/postgres/utils/memdebug.h +1 -1
- data/ext/pg_query/include/postgres/utils/memutils.h +12 -5
- data/ext/pg_query/include/postgres/utils/memutils_internal.h +53 -13
- data/ext/pg_query/include/postgres/utils/memutils_memorychunk.h +25 -9
- data/ext/pg_query/include/postgres/utils/numeric.h +6 -1
- data/ext/pg_query/include/postgres/utils/palloc.h +1 -15
- data/ext/pg_query/include/postgres/utils/partcache.h +1 -1
- data/ext/pg_query/include/postgres/utils/pg_locale.h +8 -7
- data/ext/pg_query/include/postgres/utils/pgstat_internal.h +30 -17
- data/ext/pg_query/include/postgres/utils/plancache.h +5 -3
- data/ext/pg_query/include/postgres/utils/portal.h +10 -10
- data/ext/pg_query/include/postgres/utils/queryenvironment.h +2 -2
- data/ext/pg_query/include/postgres/utils/regproc.h +1 -1
- data/ext/pg_query/include/postgres/utils/rel.h +14 -15
- data/ext/pg_query/include/postgres/utils/relcache.h +2 -5
- data/ext/pg_query/include/postgres/utils/reltrigger.h +1 -1
- data/ext/pg_query/include/postgres/utils/resowner.h +90 -9
- data/ext/pg_query/include/postgres/utils/ruleutils.h +1 -1
- data/ext/pg_query/include/postgres/utils/sharedtuplestore.h +1 -1
- data/ext/pg_query/include/postgres/utils/snapmgr.h +1 -52
- data/ext/pg_query/include/postgres/utils/snapshot.h +2 -2
- data/ext/pg_query/include/postgres/utils/sortsupport.h +1 -1
- data/ext/pg_query/include/postgres/utils/syscache.h +7 -98
- data/ext/pg_query/include/postgres/utils/timeout.h +3 -2
- data/ext/pg_query/include/postgres/utils/timestamp.h +1 -1
- data/ext/pg_query/include/postgres/utils/tuplesort.h +36 -9
- data/ext/pg_query/include/postgres/utils/tuplestore.h +2 -5
- data/ext/pg_query/include/postgres/utils/typcache.h +2 -1
- data/ext/pg_query/include/postgres/utils/varlena.h +1 -1
- data/ext/pg_query/include/postgres/utils/wait_event.h +28 -214
- data/ext/pg_query/include/postgres/utils/wait_event_types.h +218 -0
- data/ext/pg_query/include/postgres/utils/xml.h +4 -4
- data/ext/pg_query/include/postgres/varatt.h +1 -1
- data/ext/pg_query/include/protobuf/pg_query.pb-c.h +1546 -792
- data/ext/pg_query/include/protobuf/pg_query.pb.h +58365 -46595
- data/ext/pg_query/pg_query.pb-c.c +6598 -3739
- data/ext/pg_query/pg_query_normalize.c +42 -1
- data/ext/pg_query/pg_query_outfuncs_json.c +3 -1
- data/ext/pg_query/pg_query_parse_plpgsql.c +12 -13
- data/ext/pg_query/pg_query_readfuncs_protobuf.c +2 -2
- data/ext/pg_query/pg_query_scan.c +1 -1
- data/ext/pg_query/postgres_deparse.c +601 -172
- data/ext/pg_query/src_backend_catalog_namespace.c +241 -66
- data/ext/pg_query/src_backend_catalog_pg_proc.c +1 -3
- data/ext/pg_query/src_backend_commands_define.c +2 -3
- data/ext/pg_query/src_backend_nodes_bitmapset.c +137 -94
- data/ext/pg_query/src_backend_nodes_copyfuncs.c +1 -1
- data/ext/pg_query/src_backend_nodes_equalfuncs.c +1 -1
- data/ext/pg_query/src_backend_nodes_extensible.c +1 -1
- data/ext/pg_query/src_backend_nodes_list.c +3 -7
- data/ext/pg_query/src_backend_nodes_makefuncs.c +59 -20
- data/ext/pg_query/src_backend_nodes_nodeFuncs.c +109 -2
- data/ext/pg_query/src_backend_nodes_value.c +1 -1
- data/ext/pg_query/src_backend_parser_gram.c +34491 -32136
- data/ext/pg_query/src_backend_parser_parser.c +8 -8
- data/ext/pg_query/src_backend_parser_scan.c +5637 -3028
- data/ext/pg_query/src_backend_parser_scansup.c +2 -1
- data/ext/pg_query/src_backend_storage_ipc_ipc.c +1 -1
- data/ext/pg_query/src_backend_tcop_postgres.c +34 -10
- data/ext/pg_query/src_backend_utils_activity_pgstat_database.c +2 -2
- data/ext/pg_query/src_backend_utils_adt_datum.c +8 -6
- 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 +4 -5
- data/ext/pg_query/src_backend_utils_adt_ruleutils.c +101 -28
- data/ext/pg_query/src_backend_utils_error_assert.c +1 -1
- data/ext/pg_query/src_backend_utils_error_elog.c +47 -42
- data/ext/pg_query/src_backend_utils_fmgr_fmgr.c +4 -2
- data/ext/pg_query/src_backend_utils_init_globals.c +15 -3
- data/ext/pg_query/src_backend_utils_mb_mbutils.c +11 -18
- data/ext/pg_query/src_backend_utils_misc_guc_tables.c +16 -6
- data/ext/pg_query/src_backend_utils_mmgr_alignedalloc.c +8 -5
- data/ext/pg_query/src_backend_utils_mmgr_aset.c +308 -238
- data/ext/pg_query/src_backend_utils_mmgr_bump.c +728 -0
- data/ext/pg_query/src_backend_utils_mmgr_generation.c +273 -197
- data/ext/pg_query/src_backend_utils_mmgr_mcxt.c +270 -215
- data/ext/pg_query/src_backend_utils_mmgr_slab.c +154 -96
- data/ext/pg_query/src_common_encnames.c +43 -44
- data/ext/pg_query/src_common_hashfn.c +1 -1
- data/ext/pg_query/src_common_keywords.c +1 -1
- data/ext/pg_query/src_common_kwlist_d.h +511 -466
- data/ext/pg_query/src_common_kwlookup.c +1 -1
- data/ext/pg_query/src_common_psprintf.c +3 -3
- data/ext/pg_query/src_common_stringinfo.c +18 -1
- data/ext/pg_query/src_common_wchar.c +92 -109
- data/ext/pg_query/src_pl_plpgsql_src_pl_comp.c +99 -5
- data/ext/pg_query/src_pl_plpgsql_src_pl_funcs.c +1 -1
- data/ext/pg_query/src_pl_plpgsql_src_pl_gram.c +242 -143
- data/ext/pg_query/src_pl_plpgsql_src_pl_handler.c +1 -1
- data/ext/pg_query/src_pl_plpgsql_src_pl_reserved_kwlist_d.h +1 -1
- data/ext/pg_query/src_pl_plpgsql_src_pl_scanner.c +19 -1
- data/ext/pg_query/src_pl_plpgsql_src_pl_unreserved_kwlist_d.h +1 -1
- data/ext/pg_query/src_port_pg_bitutils.c +173 -28
- data/ext/pg_query/src_port_pgstrcasecmp.c +29 -1
- data/ext/pg_query/src_port_snprintf.c +15 -18
- data/ext/pg_query/src_port_strerror.c +1 -3
- data/ext/pg_query/src_port_strlcpy.c +1 -1
- data/lib/pg_query/fingerprint.rb +3 -5
- data/lib/pg_query/param_refs.rb +2 -2
- data/lib/pg_query/parse.rb +5 -7
- data/lib/pg_query/parse_error.rb +1 -0
- data/lib/pg_query/pg_query_pb.rb +27 -25
- data/lib/pg_query/scan.rb +1 -0
- data/lib/pg_query/treewalker.rb +38 -15
- data/lib/pg_query/truncate.rb +18 -20
- data/lib/pg_query/version.rb +1 -1
- metadata +31 -82
- data/ext/pg_query/include/postgres/storage/backendid.h +0 -37
- data/ext/pg_query/include/postgres/storage/sinvaladt.h +0 -45
- data/ext/pg_query/pg_query_ruby_freebsd.sym +0 -2
- data/ext/pg_query/src_backend_nodes_nodes.c +0 -38
- /data/ext/pg_query/{pg_query_ruby.sym → ext_symbols.sym} +0 -0
@@ -3,7 +3,7 @@
|
|
3
3
|
* generic-gcc.h
|
4
4
|
* Atomic operations, implemented using gcc (or compatible) intrinsics.
|
5
5
|
*
|
6
|
-
* Portions Copyright (c) 1996-
|
6
|
+
* Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group
|
7
7
|
* Portions Copyright (c) 1994, Regents of the University of California
|
8
8
|
*
|
9
9
|
* NOTES:
|
@@ -176,6 +176,23 @@ pg_atomic_compare_exchange_u32_impl(volatile pg_atomic_uint32 *ptr,
|
|
176
176
|
}
|
177
177
|
#endif
|
178
178
|
|
179
|
+
/*
|
180
|
+
* __sync_lock_test_and_set() only supports setting the value to 1 on some
|
181
|
+
* platforms, so we only provide an __atomic implementation for
|
182
|
+
* pg_atomic_exchange.
|
183
|
+
*
|
184
|
+
* We assume the availability of 32-bit __atomic_compare_exchange_n() implies
|
185
|
+
* the availability of 32-bit __atomic_exchange_n().
|
186
|
+
*/
|
187
|
+
#if !defined(PG_HAVE_ATOMIC_EXCHANGE_U32) && defined(HAVE_GCC__ATOMIC_INT32_CAS)
|
188
|
+
#define PG_HAVE_ATOMIC_EXCHANGE_U32
|
189
|
+
static inline uint32
|
190
|
+
pg_atomic_exchange_u32_impl(volatile pg_atomic_uint32 *ptr, uint32 newval)
|
191
|
+
{
|
192
|
+
return __atomic_exchange_n(&ptr->value, newval, __ATOMIC_SEQ_CST);
|
193
|
+
}
|
194
|
+
#endif
|
195
|
+
|
179
196
|
/* if we have 32-bit __sync_val_compare_and_swap, assume we have these too: */
|
180
197
|
|
181
198
|
#if !defined(PG_HAVE_ATOMIC_FETCH_ADD_U32) && defined(HAVE_GCC__SYNC_INT32_CAS)
|
@@ -223,6 +240,7 @@ static inline bool
|
|
223
240
|
pg_atomic_compare_exchange_u64_impl(volatile pg_atomic_uint64 *ptr,
|
224
241
|
uint64 *expected, uint64 newval)
|
225
242
|
{
|
243
|
+
AssertPointerAlignment(expected, 8);
|
226
244
|
return __atomic_compare_exchange_n(&ptr->value, expected, newval, false,
|
227
245
|
__ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST);
|
228
246
|
}
|
@@ -236,6 +254,8 @@ pg_atomic_compare_exchange_u64_impl(volatile pg_atomic_uint64 *ptr,
|
|
236
254
|
{
|
237
255
|
bool ret;
|
238
256
|
uint64 current;
|
257
|
+
|
258
|
+
AssertPointerAlignment(expected, 8);
|
239
259
|
current = __sync_val_compare_and_swap(&ptr->value, *expected, newval);
|
240
260
|
ret = current == *expected;
|
241
261
|
*expected = current;
|
@@ -243,6 +263,23 @@ pg_atomic_compare_exchange_u64_impl(volatile pg_atomic_uint64 *ptr,
|
|
243
263
|
}
|
244
264
|
#endif
|
245
265
|
|
266
|
+
/*
|
267
|
+
* __sync_lock_test_and_set() only supports setting the value to 1 on some
|
268
|
+
* platforms, so we only provide an __atomic implementation for
|
269
|
+
* pg_atomic_exchange.
|
270
|
+
*
|
271
|
+
* We assume the availability of 64-bit __atomic_compare_exchange_n() implies
|
272
|
+
* the availability of 64-bit __atomic_exchange_n().
|
273
|
+
*/
|
274
|
+
#if !defined(PG_HAVE_ATOMIC_EXCHANGE_U64) && defined(HAVE_GCC__ATOMIC_INT64_CAS)
|
275
|
+
#define PG_HAVE_ATOMIC_EXCHANGE_U64
|
276
|
+
static inline uint64
|
277
|
+
pg_atomic_exchange_u64_impl(volatile pg_atomic_uint64 *ptr, uint64 newval)
|
278
|
+
{
|
279
|
+
return __atomic_exchange_n(&ptr->value, newval, __ATOMIC_SEQ_CST);
|
280
|
+
}
|
281
|
+
#endif
|
282
|
+
|
246
283
|
/* if we have 64-bit __sync_val_compare_and_swap, assume we have these too: */
|
247
284
|
|
248
285
|
#if !defined(PG_HAVE_ATOMIC_FETCH_ADD_U64) && defined(HAVE_GCC__SYNC_INT64_CAS)
|
@@ -3,7 +3,7 @@
|
|
3
3
|
* generic-msvc.h
|
4
4
|
* Atomic operations support when using MSVC
|
5
5
|
*
|
6
|
-
* Portions Copyright (c) 1996-
|
6
|
+
* Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group
|
7
7
|
* Portions Copyright (c) 1994, Regents of the University of California
|
8
8
|
*
|
9
9
|
* NOTES:
|
@@ -58,6 +58,13 @@ pg_atomic_compare_exchange_u32_impl(volatile pg_atomic_uint32 *ptr,
|
|
58
58
|
return ret;
|
59
59
|
}
|
60
60
|
|
61
|
+
#define PG_HAVE_ATOMIC_EXCHANGE_U32
|
62
|
+
static inline uint32
|
63
|
+
pg_atomic_exchange_u32_impl(volatile pg_atomic_uint32 *ptr, uint32 newval)
|
64
|
+
{
|
65
|
+
return InterlockedExchange(&ptr->value, newval);
|
66
|
+
}
|
67
|
+
|
61
68
|
#define PG_HAVE_ATOMIC_FETCH_ADD_U32
|
62
69
|
static inline uint32
|
63
70
|
pg_atomic_fetch_add_u32_impl(volatile pg_atomic_uint32 *ptr, int32 add_)
|
@@ -88,6 +95,16 @@ pg_atomic_compare_exchange_u64_impl(volatile pg_atomic_uint64 *ptr,
|
|
88
95
|
|
89
96
|
/* Only implemented on 64bit builds */
|
90
97
|
#ifdef _WIN64
|
98
|
+
|
99
|
+
#pragma intrinsic(_InterlockedExchange64)
|
100
|
+
|
101
|
+
#define PG_HAVE_ATOMIC_EXCHANGE_U64
|
102
|
+
static inline uint64
|
103
|
+
pg_atomic_exchange_u64_impl(volatile pg_atomic_uint64 *ptr, uint64 newval)
|
104
|
+
{
|
105
|
+
return _InterlockedExchange64(&ptr->value, newval);
|
106
|
+
}
|
107
|
+
|
91
108
|
#pragma intrinsic(_InterlockedExchangeAdd64)
|
92
109
|
|
93
110
|
#define PG_HAVE_ATOMIC_FETCH_ADD_U64
|
@@ -96,6 +113,7 @@ pg_atomic_fetch_add_u64_impl(volatile pg_atomic_uint64 *ptr, int64 add_)
|
|
96
113
|
{
|
97
114
|
return _InterlockedExchangeAdd64(&ptr->value, add_);
|
98
115
|
}
|
116
|
+
|
99
117
|
#endif /* _WIN64 */
|
100
118
|
|
101
119
|
#endif /* HAVE_ATOMICS */
|
@@ -3,7 +3,7 @@
|
|
3
3
|
* generic-sunpro.h
|
4
4
|
* Atomic operations for solaris' CC
|
5
5
|
*
|
6
|
-
* Portions Copyright (c) 2013-
|
6
|
+
* Portions Copyright (c) 2013-2024, PostgreSQL Global Development Group
|
7
7
|
*
|
8
8
|
* NOTES:
|
9
9
|
*
|
@@ -87,6 +87,13 @@ pg_atomic_compare_exchange_u32_impl(volatile pg_atomic_uint32 *ptr,
|
|
87
87
|
return ret;
|
88
88
|
}
|
89
89
|
|
90
|
+
#define PG_HAVE_ATOMIC_EXCHANGE_U32
|
91
|
+
static inline uint32
|
92
|
+
pg_atomic_exchange_u32_impl(volatile pg_atomic_uint32 *ptr, uint32 newval)
|
93
|
+
{
|
94
|
+
return atomic_swap_32(&ptr->value, newval);
|
95
|
+
}
|
96
|
+
|
90
97
|
#define PG_HAVE_ATOMIC_COMPARE_EXCHANGE_U64
|
91
98
|
static inline bool
|
92
99
|
pg_atomic_compare_exchange_u64_impl(volatile pg_atomic_uint64 *ptr,
|
@@ -95,12 +102,20 @@ pg_atomic_compare_exchange_u64_impl(volatile pg_atomic_uint64 *ptr,
|
|
95
102
|
bool ret;
|
96
103
|
uint64 current;
|
97
104
|
|
105
|
+
AssertPointerAlignment(expected, 8);
|
98
106
|
current = atomic_cas_64(&ptr->value, *expected, newval);
|
99
107
|
ret = current == *expected;
|
100
108
|
*expected = current;
|
101
109
|
return ret;
|
102
110
|
}
|
103
111
|
|
112
|
+
#define PG_HAVE_ATOMIC_EXCHANGE_U64
|
113
|
+
static inline uint64
|
114
|
+
pg_atomic_exchange_u64_impl(volatile pg_atomic_uint64 *ptr, uint64 newval)
|
115
|
+
{
|
116
|
+
return atomic_swap_64(&ptr->value, newval);
|
117
|
+
}
|
118
|
+
|
104
119
|
#endif /* HAVE_ATOMIC_H */
|
105
120
|
|
106
121
|
#endif /* defined(HAVE_ATOMICS) */
|
@@ -4,7 +4,7 @@
|
|
4
4
|
* Implement higher level operations based on some lower level atomic
|
5
5
|
* operations.
|
6
6
|
*
|
7
|
-
* Portions Copyright (c) 1996-
|
7
|
+
* Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group
|
8
8
|
* Portions Copyright (c) 1994, Regents of the University of California
|
9
9
|
*
|
10
10
|
* src/include/port/atomics/generic.h
|
@@ -83,7 +83,7 @@ pg_atomic_init_flag_impl(volatile pg_atomic_flag *ptr)
|
|
83
83
|
static inline bool
|
84
84
|
pg_atomic_test_set_flag_impl(volatile pg_atomic_flag *ptr)
|
85
85
|
{
|
86
|
-
return pg_atomic_exchange_u32_impl(ptr,
|
86
|
+
return pg_atomic_exchange_u32_impl(ptr, 1) == 0;
|
87
87
|
}
|
88
88
|
|
89
89
|
#define PG_HAVE_ATOMIC_UNLOCKED_TEST_FLAG
|
@@ -243,6 +243,24 @@ pg_atomic_sub_fetch_u32_impl(volatile pg_atomic_uint32 *ptr, int32 sub_)
|
|
243
243
|
}
|
244
244
|
#endif
|
245
245
|
|
246
|
+
#if !defined(PG_HAVE_ATOMIC_READ_MEMBARRIER_U32) && defined(PG_HAVE_ATOMIC_FETCH_ADD_U32)
|
247
|
+
#define PG_HAVE_ATOMIC_READ_MEMBARRIER_U32
|
248
|
+
static inline uint32
|
249
|
+
pg_atomic_read_membarrier_u32_impl(volatile pg_atomic_uint32 *ptr)
|
250
|
+
{
|
251
|
+
return pg_atomic_fetch_add_u32_impl(ptr, 0);
|
252
|
+
}
|
253
|
+
#endif
|
254
|
+
|
255
|
+
#if !defined(PG_HAVE_ATOMIC_WRITE_MEMBARRIER_U32) && defined(PG_HAVE_ATOMIC_EXCHANGE_U32)
|
256
|
+
#define PG_HAVE_ATOMIC_WRITE_MEMBARRIER_U32
|
257
|
+
static inline void
|
258
|
+
pg_atomic_write_membarrier_u32_impl(volatile pg_atomic_uint32 *ptr, uint32 val)
|
259
|
+
{
|
260
|
+
(void) pg_atomic_exchange_u32_impl(ptr, val);
|
261
|
+
}
|
262
|
+
#endif
|
263
|
+
|
246
264
|
#if !defined(PG_HAVE_ATOMIC_EXCHANGE_U64) && defined(PG_HAVE_ATOMIC_COMPARE_EXCHANGE_U64)
|
247
265
|
#define PG_HAVE_ATOMIC_EXCHANGE_U64
|
248
266
|
static inline uint64
|
@@ -399,3 +417,21 @@ pg_atomic_sub_fetch_u64_impl(volatile pg_atomic_uint64 *ptr, int64 sub_)
|
|
399
417
|
return pg_atomic_fetch_sub_u64_impl(ptr, sub_) - sub_;
|
400
418
|
}
|
401
419
|
#endif
|
420
|
+
|
421
|
+
#if !defined(PG_HAVE_ATOMIC_READ_MEMBARRIER_U64) && defined(PG_HAVE_ATOMIC_FETCH_ADD_U64)
|
422
|
+
#define PG_HAVE_ATOMIC_READ_MEMBARRIER_U64
|
423
|
+
static inline uint64
|
424
|
+
pg_atomic_read_membarrier_u64_impl(volatile pg_atomic_uint64 *ptr)
|
425
|
+
{
|
426
|
+
return pg_atomic_fetch_add_u64_impl(ptr, 0);
|
427
|
+
}
|
428
|
+
#endif
|
429
|
+
|
430
|
+
#if !defined(PG_HAVE_ATOMIC_WRITE_MEMBARRIER_U64) && defined(PG_HAVE_ATOMIC_EXCHANGE_U64)
|
431
|
+
#define PG_HAVE_ATOMIC_WRITE_MEMBARRIER_U64
|
432
|
+
static inline void
|
433
|
+
pg_atomic_write_membarrier_u64_impl(volatile pg_atomic_uint64 *ptr, uint64 val)
|
434
|
+
{
|
435
|
+
(void) pg_atomic_exchange_u64_impl(ptr, val);
|
436
|
+
}
|
437
|
+
#endif
|
@@ -28,7 +28,7 @@
|
|
28
28
|
* For an introduction to using memory barriers within the PostgreSQL backend,
|
29
29
|
* see src/backend/storage/lmgr/README.barrier
|
30
30
|
*
|
31
|
-
* Portions Copyright (c) 1996-
|
31
|
+
* Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group
|
32
32
|
* Portions Copyright (c) 1994, Regents of the University of California
|
33
33
|
*
|
34
34
|
* src/include/port/atomics.h
|
@@ -84,11 +84,9 @@
|
|
84
84
|
* using compiler intrinsics are a good idea.
|
85
85
|
*/
|
86
86
|
/*
|
87
|
-
* gcc or compatible, including clang and icc.
|
88
|
-
* XL C/C++ for Linux, V13.1.2" emulates gcc, but __sync_lock_test_and_set()
|
89
|
-
* of one-byte types elicits SIGSEGV. That bug was gone by V13.1.5 (2016-12).
|
87
|
+
* gcc or compatible, including clang and icc.
|
90
88
|
*/
|
91
|
-
#if
|
89
|
+
#if defined(__GNUC__) || defined(__INTEL_COMPILER)
|
92
90
|
#include "port/atomics/generic-gcc.h"
|
93
91
|
#elif defined(_MSC_VER)
|
94
92
|
#include "port/atomics/generic-msvc.h"
|
@@ -239,6 +237,26 @@ pg_atomic_read_u32(volatile pg_atomic_uint32 *ptr)
|
|
239
237
|
return pg_atomic_read_u32_impl(ptr);
|
240
238
|
}
|
241
239
|
|
240
|
+
/*
|
241
|
+
* pg_atomic_read_membarrier_u32 - read with barrier semantics.
|
242
|
+
*
|
243
|
+
* This read is guaranteed to return the current value, provided that the value
|
244
|
+
* is only ever updated via operations with barrier semantics, such as
|
245
|
+
* pg_atomic_compare_exchange_u32() and pg_atomic_write_membarrier_u32().
|
246
|
+
* While this may be less performant than pg_atomic_read_u32(), it may be
|
247
|
+
* easier to reason about correctness with this function in less performance-
|
248
|
+
* sensitive code.
|
249
|
+
*
|
250
|
+
* Full barrier semantics.
|
251
|
+
*/
|
252
|
+
static inline uint32
|
253
|
+
pg_atomic_read_membarrier_u32(volatile pg_atomic_uint32 *ptr)
|
254
|
+
{
|
255
|
+
AssertPointerAlignment(ptr, 4);
|
256
|
+
|
257
|
+
return pg_atomic_read_membarrier_u32_impl(ptr);
|
258
|
+
}
|
259
|
+
|
242
260
|
/*
|
243
261
|
* pg_atomic_write_u32 - write to atomic variable.
|
244
262
|
*
|
@@ -276,6 +294,26 @@ pg_atomic_unlocked_write_u32(volatile pg_atomic_uint32 *ptr, uint32 val)
|
|
276
294
|
pg_atomic_unlocked_write_u32_impl(ptr, val);
|
277
295
|
}
|
278
296
|
|
297
|
+
/*
|
298
|
+
* pg_atomic_write_membarrier_u32 - write with barrier semantics.
|
299
|
+
*
|
300
|
+
* The write is guaranteed to succeed as a whole, i.e., it's not possible to
|
301
|
+
* observe a partial write for any reader. Note that this correctly interacts
|
302
|
+
* with both pg_atomic_compare_exchange_u32() and
|
303
|
+
* pg_atomic_read_membarrier_u32(). While this may be less performant than
|
304
|
+
* pg_atomic_write_u32(), it may be easier to reason about correctness with
|
305
|
+
* this function in less performance-sensitive code.
|
306
|
+
*
|
307
|
+
* Full barrier semantics.
|
308
|
+
*/
|
309
|
+
static inline void
|
310
|
+
pg_atomic_write_membarrier_u32(volatile pg_atomic_uint32 *ptr, uint32 val)
|
311
|
+
{
|
312
|
+
AssertPointerAlignment(ptr, 4);
|
313
|
+
|
314
|
+
pg_atomic_write_membarrier_u32_impl(ptr, val);
|
315
|
+
}
|
316
|
+
|
279
317
|
/*
|
280
318
|
* pg_atomic_exchange_u32 - exchange newval with current value
|
281
319
|
*
|
@@ -429,6 +467,15 @@ pg_atomic_read_u64(volatile pg_atomic_uint64 *ptr)
|
|
429
467
|
return pg_atomic_read_u64_impl(ptr);
|
430
468
|
}
|
431
469
|
|
470
|
+
static inline uint64
|
471
|
+
pg_atomic_read_membarrier_u64(volatile pg_atomic_uint64 *ptr)
|
472
|
+
{
|
473
|
+
#ifndef PG_HAVE_ATOMIC_U64_SIMULATION
|
474
|
+
AssertPointerAlignment(ptr, 8);
|
475
|
+
#endif
|
476
|
+
return pg_atomic_read_membarrier_u64_impl(ptr);
|
477
|
+
}
|
478
|
+
|
432
479
|
static inline void
|
433
480
|
pg_atomic_write_u64(volatile pg_atomic_uint64 *ptr, uint64 val)
|
434
481
|
{
|
@@ -438,6 +485,15 @@ pg_atomic_write_u64(volatile pg_atomic_uint64 *ptr, uint64 val)
|
|
438
485
|
pg_atomic_write_u64_impl(ptr, val);
|
439
486
|
}
|
440
487
|
|
488
|
+
static inline void
|
489
|
+
pg_atomic_write_membarrier_u64(volatile pg_atomic_uint64 *ptr, uint64 val)
|
490
|
+
{
|
491
|
+
#ifndef PG_HAVE_ATOMIC_U64_SIMULATION
|
492
|
+
AssertPointerAlignment(ptr, 8);
|
493
|
+
#endif
|
494
|
+
pg_atomic_write_membarrier_u64_impl(ptr, val);
|
495
|
+
}
|
496
|
+
|
441
497
|
static inline uint64
|
442
498
|
pg_atomic_exchange_u64(volatile pg_atomic_uint64 *ptr, uint64 newval)
|
443
499
|
{
|
@@ -453,7 +509,6 @@ pg_atomic_compare_exchange_u64(volatile pg_atomic_uint64 *ptr,
|
|
453
509
|
{
|
454
510
|
#ifndef PG_HAVE_ATOMIC_U64_SIMULATION
|
455
511
|
AssertPointerAlignment(ptr, 8);
|
456
|
-
AssertPointerAlignment(expected, 8);
|
457
512
|
#endif
|
458
513
|
return pg_atomic_compare_exchange_u64_impl(ptr, expected, newval);
|
459
514
|
}
|
@@ -514,6 +569,38 @@ pg_atomic_sub_fetch_u64(volatile pg_atomic_uint64 *ptr, int64 sub_)
|
|
514
569
|
return pg_atomic_sub_fetch_u64_impl(ptr, sub_);
|
515
570
|
}
|
516
571
|
|
572
|
+
/*
|
573
|
+
* Monotonically advance the given variable using only atomic operations until
|
574
|
+
* it's at least the target value. Returns the latest value observed, which
|
575
|
+
* may or may not be the target value.
|
576
|
+
*
|
577
|
+
* Full barrier semantics (even when value is unchanged).
|
578
|
+
*/
|
579
|
+
static inline uint64
|
580
|
+
pg_atomic_monotonic_advance_u64(volatile pg_atomic_uint64 *ptr, uint64 target)
|
581
|
+
{
|
582
|
+
uint64 currval;
|
583
|
+
|
584
|
+
#ifndef PG_HAVE_ATOMIC_U64_SIMULATION
|
585
|
+
AssertPointerAlignment(ptr, 8);
|
586
|
+
#endif
|
587
|
+
|
588
|
+
currval = pg_atomic_read_u64_impl(ptr);
|
589
|
+
if (currval >= target)
|
590
|
+
{
|
591
|
+
pg_memory_barrier();
|
592
|
+
return currval;
|
593
|
+
}
|
594
|
+
|
595
|
+
while (currval < target)
|
596
|
+
{
|
597
|
+
if (pg_atomic_compare_exchange_u64(ptr, &currval, target))
|
598
|
+
return target;
|
599
|
+
}
|
600
|
+
|
601
|
+
return currval;
|
602
|
+
}
|
603
|
+
|
517
604
|
#undef INSIDE_ATOMICS_H
|
518
605
|
|
519
606
|
#endif /* ATOMICS_H */
|
@@ -4,7 +4,7 @@
|
|
4
4
|
* Miscellaneous functions for bit-wise operations.
|
5
5
|
*
|
6
6
|
*
|
7
|
-
* Copyright (c) 2019-
|
7
|
+
* Copyright (c) 2019-2024, PostgreSQL Global Development Group
|
8
8
|
*
|
9
9
|
* src/include/port/pg_bitutils.h
|
10
10
|
*
|
@@ -48,8 +48,9 @@ pg_leftmost_one_pos32(uint32 word)
|
|
48
48
|
unsigned long result;
|
49
49
|
bool non_zero;
|
50
50
|
|
51
|
+
Assert(word != 0);
|
52
|
+
|
51
53
|
non_zero = _BitScanReverse(&result, word);
|
52
|
-
Assert(non_zero);
|
53
54
|
return (int) result;
|
54
55
|
#else
|
55
56
|
int shift = 32 - 8;
|
@@ -85,8 +86,9 @@ pg_leftmost_one_pos64(uint64 word)
|
|
85
86
|
unsigned long result;
|
86
87
|
bool non_zero;
|
87
88
|
|
89
|
+
Assert(word != 0);
|
90
|
+
|
88
91
|
non_zero = _BitScanReverse64(&result, word);
|
89
|
-
Assert(non_zero);
|
90
92
|
return (int) result;
|
91
93
|
#else
|
92
94
|
int shift = 64 - 8;
|
@@ -116,8 +118,9 @@ pg_rightmost_one_pos32(uint32 word)
|
|
116
118
|
unsigned long result;
|
117
119
|
bool non_zero;
|
118
120
|
|
121
|
+
Assert(word != 0);
|
122
|
+
|
119
123
|
non_zero = _BitScanForward(&result, word);
|
120
|
-
Assert(non_zero);
|
121
124
|
return (int) result;
|
122
125
|
#else
|
123
126
|
int result = 0;
|
@@ -156,8 +159,9 @@ pg_rightmost_one_pos64(uint64 word)
|
|
156
159
|
unsigned long result;
|
157
160
|
bool non_zero;
|
158
161
|
|
162
|
+
Assert(word != 0);
|
163
|
+
|
159
164
|
non_zero = _BitScanForward64(&result, word);
|
160
|
-
Assert(non_zero);
|
161
165
|
return (int) result;
|
162
166
|
#else
|
163
167
|
int result = 0;
|
@@ -296,18 +300,96 @@ pg_ceil_log2_64(uint64 num)
|
|
296
300
|
|
297
301
|
#ifdef TRY_POPCNT_FAST
|
298
302
|
/* Attempt to use the POPCNT instruction, but perform a runtime check first */
|
299
|
-
extern int
|
300
|
-
extern int
|
303
|
+
extern PGDLLIMPORT int (*pg_popcount32) (uint32 word);
|
304
|
+
extern PGDLLIMPORT int (*pg_popcount64) (uint64 word);
|
305
|
+
extern PGDLLIMPORT uint64 (*pg_popcount_optimized) (const char *buf, int bytes);
|
306
|
+
extern PGDLLIMPORT uint64 (*pg_popcount_masked_optimized) (const char *buf, int bytes, bits8 mask);
|
307
|
+
|
308
|
+
/*
|
309
|
+
* We can also try to use the AVX-512 popcount instruction on some systems.
|
310
|
+
* The implementation of that is located in its own file because it may
|
311
|
+
* require special compiler flags that we don't want to apply to any other
|
312
|
+
* files.
|
313
|
+
*/
|
314
|
+
#ifdef USE_AVX512_POPCNT_WITH_RUNTIME_CHECK
|
315
|
+
extern bool pg_popcount_avx512_available(void);
|
316
|
+
extern uint64 pg_popcount_avx512(const char *buf, int bytes);
|
317
|
+
extern uint64 pg_popcount_masked_avx512(const char *buf, int bytes, bits8 mask);
|
318
|
+
#endif
|
301
319
|
|
302
320
|
#else
|
303
321
|
/* Use a portable implementation -- no need for a function pointer. */
|
304
322
|
extern int pg_popcount32(uint32 word);
|
305
323
|
extern int pg_popcount64(uint64 word);
|
324
|
+
extern uint64 pg_popcount_optimized(const char *buf, int bytes);
|
325
|
+
extern uint64 pg_popcount_masked_optimized(const char *buf, int bytes, bits8 mask);
|
306
326
|
|
307
327
|
#endif /* TRY_POPCNT_FAST */
|
308
328
|
|
309
|
-
/*
|
310
|
-
|
329
|
+
/*
|
330
|
+
* Returns the number of 1-bits in buf.
|
331
|
+
*
|
332
|
+
* If there aren't many bytes to process, the function call overhead of the
|
333
|
+
* optimized versions isn't worth taking, so we inline a loop that consults
|
334
|
+
* pg_number_of_ones in that case. If there are many bytes to process, we
|
335
|
+
* accept the function call overhead because the optimized versions are likely
|
336
|
+
* to be faster.
|
337
|
+
*/
|
338
|
+
static inline uint64
|
339
|
+
pg_popcount(const char *buf, int bytes)
|
340
|
+
{
|
341
|
+
/*
|
342
|
+
* We set the threshold to the point at which we'll first use special
|
343
|
+
* instructions in the optimized version.
|
344
|
+
*/
|
345
|
+
#if SIZEOF_VOID_P >= 8
|
346
|
+
int threshold = 8;
|
347
|
+
#else
|
348
|
+
int threshold = 4;
|
349
|
+
#endif
|
350
|
+
|
351
|
+
if (bytes < threshold)
|
352
|
+
{
|
353
|
+
uint64 popcnt = 0;
|
354
|
+
|
355
|
+
while (bytes--)
|
356
|
+
popcnt += pg_number_of_ones[(unsigned char) *buf++];
|
357
|
+
return popcnt;
|
358
|
+
}
|
359
|
+
|
360
|
+
return pg_popcount_optimized(buf, bytes);
|
361
|
+
}
|
362
|
+
|
363
|
+
/*
|
364
|
+
* Returns the number of 1-bits in buf after applying the mask to each byte.
|
365
|
+
*
|
366
|
+
* Similar to pg_popcount(), we only take on the function pointer overhead when
|
367
|
+
* it's likely to be faster.
|
368
|
+
*/
|
369
|
+
static inline uint64
|
370
|
+
pg_popcount_masked(const char *buf, int bytes, bits8 mask)
|
371
|
+
{
|
372
|
+
/*
|
373
|
+
* We set the threshold to the point at which we'll first use special
|
374
|
+
* instructions in the optimized version.
|
375
|
+
*/
|
376
|
+
#if SIZEOF_VOID_P >= 8
|
377
|
+
int threshold = 8;
|
378
|
+
#else
|
379
|
+
int threshold = 4;
|
380
|
+
#endif
|
381
|
+
|
382
|
+
if (bytes < threshold)
|
383
|
+
{
|
384
|
+
uint64 popcnt = 0;
|
385
|
+
|
386
|
+
while (bytes--)
|
387
|
+
popcnt += pg_number_of_ones[(unsigned char) *buf++ & mask];
|
388
|
+
return popcnt;
|
389
|
+
}
|
390
|
+
|
391
|
+
return pg_popcount_masked_optimized(buf, bytes, mask);
|
392
|
+
}
|
311
393
|
|
312
394
|
/*
|
313
395
|
* Rotate the bits of "word" to the right/left by n bits.
|
@@ -11,7 +11,7 @@
|
|
11
11
|
* return the same. Use caution when using these wrapper macros with signed
|
12
12
|
* integers.
|
13
13
|
*
|
14
|
-
* Copyright (c) 2015-
|
14
|
+
* Copyright (c) 2015-2024, PostgreSQL Global Development Group
|
15
15
|
*
|
16
16
|
* src/include/port/pg_bswap.h
|
17
17
|
*
|
@@ -23,7 +23,7 @@
|
|
23
23
|
* EQ_CRC32C(c1, c2)
|
24
24
|
* Check for equality of two CRCs.
|
25
25
|
*
|
26
|
-
* Portions Copyright (c) 1996-
|
26
|
+
* Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group
|
27
27
|
* Portions Copyright (c) 1994, Regents of the University of California
|
28
28
|
*
|
29
29
|
* src/include/port/pg_crc32c.h
|
@@ -58,6 +58,15 @@ extern pg_crc32c pg_comp_crc32c_sse42(pg_crc32c crc, const void *data, size_t le
|
|
58
58
|
|
59
59
|
extern pg_crc32c pg_comp_crc32c_armv8(pg_crc32c crc, const void *data, size_t len);
|
60
60
|
|
61
|
+
#elif defined(USE_LOONGARCH_CRC32C)
|
62
|
+
/* Use LoongArch CRCC instructions. */
|
63
|
+
|
64
|
+
#define COMP_CRC32C(crc, data, len) \
|
65
|
+
((crc) = pg_comp_crc32c_loongarch((crc), (data), (len)))
|
66
|
+
#define FIN_CRC32C(crc) ((crc) ^= 0xFFFFFFFF)
|
67
|
+
|
68
|
+
extern pg_crc32c pg_comp_crc32c_loongarch(pg_crc32c crc, const void *data, size_t len);
|
69
|
+
|
61
70
|
#elif defined(USE_SSE42_CRC32C_WITH_RUNTIME_CHECK) || defined(USE_ARMV8_CRC32C_WITH_RUNTIME_CHECK)
|
62
71
|
|
63
72
|
/*
|
@@ -0,0 +1,117 @@
|
|
1
|
+
/*-------------------------------------------------------------------------
|
2
|
+
*
|
3
|
+
* pg_iovec.h
|
4
|
+
* Header for vectored I/O functions, to use in place of <sys/uio.h>.
|
5
|
+
*
|
6
|
+
* Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group
|
7
|
+
* Portions Copyright (c) 1994, Regents of the University of California
|
8
|
+
*
|
9
|
+
* src/include/port/pg_iovec.h
|
10
|
+
*
|
11
|
+
*-------------------------------------------------------------------------
|
12
|
+
*/
|
13
|
+
#ifndef PG_IOVEC_H
|
14
|
+
#define PG_IOVEC_H
|
15
|
+
|
16
|
+
#ifndef WIN32
|
17
|
+
|
18
|
+
#include <limits.h>
|
19
|
+
#include <sys/uio.h>
|
20
|
+
#include <unistd.h>
|
21
|
+
|
22
|
+
#else
|
23
|
+
|
24
|
+
/* POSIX requires at least 16 as a maximum iovcnt. */
|
25
|
+
#define IOV_MAX 16
|
26
|
+
|
27
|
+
/* Define our own POSIX-compatible iovec struct. */
|
28
|
+
struct iovec
|
29
|
+
{
|
30
|
+
void *iov_base;
|
31
|
+
size_t iov_len;
|
32
|
+
};
|
33
|
+
|
34
|
+
#endif
|
35
|
+
|
36
|
+
/* Define a reasonable maximum that is safe to use on the stack. */
|
37
|
+
#define PG_IOV_MAX Min(IOV_MAX, 32)
|
38
|
+
|
39
|
+
/*
|
40
|
+
* Like preadv(), but with a prefix to remind us of a side-effect: on Windows
|
41
|
+
* this changes the current file position.
|
42
|
+
*/
|
43
|
+
static inline ssize_t
|
44
|
+
pg_preadv(int fd, const struct iovec *iov, int iovcnt, off_t offset)
|
45
|
+
{
|
46
|
+
#if HAVE_DECL_PREADV
|
47
|
+
/*
|
48
|
+
* Avoid a small amount of argument copying overhead in the kernel if
|
49
|
+
* there is only one iovec.
|
50
|
+
*/
|
51
|
+
if (iovcnt == 1)
|
52
|
+
return pread(fd, iov[0].iov_base, iov[0].iov_len, offset);
|
53
|
+
else
|
54
|
+
return preadv(fd, iov, iovcnt, offset);
|
55
|
+
#else
|
56
|
+
ssize_t sum = 0;
|
57
|
+
ssize_t part;
|
58
|
+
|
59
|
+
for (int i = 0; i < iovcnt; ++i)
|
60
|
+
{
|
61
|
+
part = pg_pread(fd, iov[i].iov_base, iov[i].iov_len, offset);
|
62
|
+
if (part < 0)
|
63
|
+
{
|
64
|
+
if (i == 0)
|
65
|
+
return -1;
|
66
|
+
else
|
67
|
+
return sum;
|
68
|
+
}
|
69
|
+
sum += part;
|
70
|
+
offset += part;
|
71
|
+
if ((size_t) part < iov[i].iov_len)
|
72
|
+
return sum;
|
73
|
+
}
|
74
|
+
return sum;
|
75
|
+
#endif
|
76
|
+
}
|
77
|
+
|
78
|
+
/*
|
79
|
+
* Like pwritev(), but with a prefix to remind us of a side-effect: on Windows
|
80
|
+
* this changes the current file position.
|
81
|
+
*/
|
82
|
+
static inline ssize_t
|
83
|
+
pg_pwritev(int fd, const struct iovec *iov, int iovcnt, off_t offset)
|
84
|
+
{
|
85
|
+
#if HAVE_DECL_PWRITEV
|
86
|
+
/*
|
87
|
+
* Avoid a small amount of argument copying overhead in the kernel if
|
88
|
+
* there is only one iovec.
|
89
|
+
*/
|
90
|
+
if (iovcnt == 1)
|
91
|
+
return pwrite(fd, iov[0].iov_base, iov[0].iov_len, offset);
|
92
|
+
else
|
93
|
+
return pwritev(fd, iov, iovcnt, offset);
|
94
|
+
#else
|
95
|
+
ssize_t sum = 0;
|
96
|
+
ssize_t part;
|
97
|
+
|
98
|
+
for (int i = 0; i < iovcnt; ++i)
|
99
|
+
{
|
100
|
+
part = pg_pwrite(fd, iov[i].iov_base, iov[i].iov_len, offset);
|
101
|
+
if (part < 0)
|
102
|
+
{
|
103
|
+
if (i == 0)
|
104
|
+
return -1;
|
105
|
+
else
|
106
|
+
return sum;
|
107
|
+
}
|
108
|
+
sum += part;
|
109
|
+
offset += part;
|
110
|
+
if ((size_t) part < iov[i].iov_len)
|
111
|
+
return sum;
|
112
|
+
}
|
113
|
+
return sum;
|
114
|
+
#endif
|
115
|
+
}
|
116
|
+
|
117
|
+
#endif /* PG_IOVEC_H */
|