pg_query 2.2.0 → 4.2.1
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 +25 -0
- data/README.md +59 -31
- data/Rakefile +2 -2
- data/ext/pg_query/include/access/amapi.h +45 -1
- data/ext/pg_query/include/access/attmap.h +1 -1
- data/ext/pg_query/include/access/attnum.h +2 -2
- data/ext/pg_query/include/access/clog.h +4 -2
- data/ext/pg_query/include/access/commit_ts.h +6 -9
- data/ext/pg_query/include/access/detoast.h +1 -11
- data/ext/pg_query/include/access/genam.h +15 -12
- data/ext/pg_query/include/access/gin.h +2 -2
- data/ext/pg_query/include/access/htup.h +1 -1
- data/ext/pg_query/include/access/htup_details.h +75 -87
- data/ext/pg_query/include/access/itup.h +7 -1
- data/ext/pg_query/include/access/parallel.h +2 -2
- data/ext/pg_query/include/access/printtup.h +1 -1
- data/ext/pg_query/include/access/relation.h +1 -1
- data/ext/pg_query/include/access/relscan.h +17 -2
- data/ext/pg_query/include/access/rmgr.h +30 -3
- data/ext/pg_query/include/access/rmgrlist.h +23 -23
- data/ext/pg_query/include/access/sdir.h +1 -1
- data/ext/pg_query/include/access/skey.h +1 -1
- data/ext/pg_query/include/access/stratnum.h +4 -2
- data/ext/pg_query/include/access/sysattr.h +1 -1
- data/ext/pg_query/include/access/table.h +2 -1
- data/ext/pg_query/include/access/tableam.h +272 -20
- data/ext/pg_query/include/access/toast_compression.h +73 -0
- data/ext/pg_query/include/access/transam.h +123 -13
- data/ext/pg_query/include/access/tupconvert.h +1 -1
- data/ext/pg_query/include/access/tupdesc.h +1 -1
- data/ext/pg_query/include/access/tupmacs.h +3 -3
- data/ext/pg_query/include/access/twophase.h +3 -1
- data/ext/pg_query/include/access/xact.h +73 -19
- data/ext/pg_query/include/access/xlog.h +60 -155
- data/ext/pg_query/include/access/xlog_internal.h +40 -13
- data/ext/pg_query/include/access/xlogdefs.h +8 -16
- data/ext/pg_query/include/access/xlogprefetcher.h +55 -0
- data/ext/pg_query/include/access/xlogreader.h +145 -39
- data/ext/pg_query/include/access/xlogrecord.h +18 -9
- data/ext/pg_query/include/access/xlogrecovery.h +157 -0
- data/ext/pg_query/include/c.h +101 -44
- data/ext/pg_query/include/catalog/catalog.h +3 -1
- data/ext/pg_query/include/catalog/catversion.h +2 -2
- data/ext/pg_query/include/catalog/dependency.h +8 -16
- data/ext/pg_query/include/catalog/genbki.h +83 -5
- data/ext/pg_query/include/catalog/index.h +18 -3
- data/ext/pg_query/include/catalog/indexing.h +12 -324
- data/ext/pg_query/include/catalog/namespace.h +4 -2
- data/ext/pg_query/include/catalog/objectaccess.h +70 -2
- data/ext/pg_query/include/catalog/objectaddress.h +11 -6
- data/ext/pg_query/include/catalog/pg_aggregate.h +14 -10
- data/ext/pg_query/include/catalog/pg_aggregate_d.h +2 -1
- data/ext/pg_query/include/catalog/pg_am.h +4 -1
- data/ext/pg_query/include/catalog/pg_am_d.h +3 -1
- data/ext/pg_query/include/catalog/pg_attribute.h +27 -10
- data/ext/pg_query/include/catalog/pg_attribute_d.h +21 -18
- data/ext/pg_query/include/catalog/pg_authid.h +7 -2
- data/ext/pg_query/include/catalog/pg_authid_d.h +17 -9
- data/ext/pg_query/include/catalog/pg_class.h +44 -14
- data/ext/pg_query/include/catalog/pg_class_d.h +30 -1
- data/ext/pg_query/include/catalog/pg_collation.h +33 -8
- data/ext/pg_query/include/catalog/pg_collation_d.h +20 -3
- data/ext/pg_query/include/catalog/pg_constraint.h +38 -12
- data/ext/pg_query/include/catalog/pg_constraint_d.h +10 -4
- data/ext/pg_query/include/catalog/pg_control.h +3 -5
- data/ext/pg_query/include/catalog/pg_conversion.h +7 -4
- data/ext/pg_query/include/catalog/pg_conversion_d.h +4 -1
- data/ext/pg_query/include/catalog/pg_depend.h +11 -7
- data/ext/pg_query/include/catalog/pg_depend_d.h +3 -1
- data/ext/pg_query/include/catalog/pg_event_trigger.h +9 -3
- data/ext/pg_query/include/catalog/pg_event_trigger_d.h +3 -1
- data/ext/pg_query/include/catalog/pg_index.h +17 -7
- data/ext/pg_query/include/catalog/pg_index_d.h +20 -17
- data/ext/pg_query/include/catalog/pg_language.h +10 -5
- data/ext/pg_query/include/catalog/pg_language_d.h +3 -1
- data/ext/pg_query/include/catalog/pg_namespace.h +7 -2
- data/ext/pg_query/include/catalog/pg_namespace_d.h +3 -1
- data/ext/pg_query/include/catalog/pg_opclass.h +8 -5
- data/ext/pg_query/include/catalog/pg_opclass_d.h +3 -1
- data/ext/pg_query/include/catalog/pg_operator.h +18 -15
- data/ext/pg_query/include/catalog/pg_operator_d.h +37 -1
- data/ext/pg_query/include/catalog/pg_opfamily.h +6 -3
- data/ext/pg_query/include/catalog/pg_opfamily_d.h +3 -1
- data/ext/pg_query/include/catalog/pg_parameter_acl.h +60 -0
- data/ext/pg_query/include/catalog/pg_parameter_acl_d.h +34 -0
- data/ext/pg_query/include/catalog/pg_partitioned_table.h +20 -9
- data/ext/pg_query/include/catalog/pg_partitioned_table_d.h +2 -1
- data/ext/pg_query/include/catalog/pg_proc.h +20 -11
- data/ext/pg_query/include/catalog/pg_proc_d.h +10 -8
- data/ext/pg_query/include/catalog/pg_publication.h +50 -7
- data/ext/pg_query/include/catalog/pg_publication_d.h +3 -1
- data/ext/pg_query/include/catalog/pg_replication_origin.h +6 -1
- data/ext/pg_query/include/catalog/pg_replication_origin_d.h +5 -1
- data/ext/pg_query/include/catalog/pg_statistic.h +19 -12
- data/ext/pg_query/include/catalog/pg_statistic_d.h +2 -1
- data/ext/pg_query/include/catalog/pg_statistic_ext.h +19 -5
- data/ext/pg_query/include/catalog/pg_statistic_ext_d.h +7 -2
- data/ext/pg_query/include/catalog/pg_transform.h +8 -5
- data/ext/pg_query/include/catalog/pg_transform_d.h +3 -1
- data/ext/pg_query/include/catalog/pg_trigger.h +24 -8
- data/ext/pg_query/include/catalog/pg_trigger_d.h +4 -1
- data/ext/pg_query/include/catalog/pg_ts_config.h +6 -3
- data/ext/pg_query/include/catalog/pg_ts_config_d.h +3 -1
- data/ext/pg_query/include/catalog/pg_ts_dict.h +8 -3
- data/ext/pg_query/include/catalog/pg_ts_dict_d.h +3 -1
- data/ext/pg_query/include/catalog/pg_ts_parser.h +6 -3
- data/ext/pg_query/include/catalog/pg_ts_parser_d.h +3 -1
- data/ext/pg_query/include/catalog/pg_ts_template.h +6 -3
- data/ext/pg_query/include/catalog/pg_ts_template_d.h +3 -1
- data/ext/pg_query/include/catalog/pg_type.h +55 -24
- data/ext/pg_query/include/catalog/pg_type_d.h +70 -31
- data/ext/pg_query/include/catalog/storage.h +5 -3
- data/ext/pg_query/include/commands/async.h +3 -4
- data/ext/pg_query/include/commands/dbcommands.h +2 -1
- data/ext/pg_query/include/commands/defrem.h +11 -24
- data/ext/pg_query/include/commands/event_trigger.h +2 -2
- data/ext/pg_query/include/commands/explain.h +1 -1
- data/ext/pg_query/include/commands/prepare.h +1 -1
- data/ext/pg_query/include/commands/tablespace.h +2 -2
- data/ext/pg_query/include/commands/trigger.h +18 -16
- data/ext/pg_query/include/commands/user.h +2 -2
- data/ext/pg_query/include/commands/vacuum.h +88 -41
- data/ext/pg_query/include/commands/variable.h +1 -1
- data/ext/pg_query/include/common/file_perm.h +4 -4
- data/ext/pg_query/include/common/hashfn.h +1 -1
- data/ext/pg_query/include/common/ip.h +1 -7
- data/ext/pg_query/include/common/keywords.h +2 -6
- data/ext/pg_query/include/common/kwlookup.h +1 -1
- data/ext/pg_query/include/common/pg_prng.h +60 -0
- data/ext/pg_query/include/common/relpath.h +2 -2
- data/ext/pg_query/include/common/string.h +24 -1
- data/ext/pg_query/include/common/unicode_combining_table.h +114 -2
- data/ext/pg_query/include/common/unicode_east_asian_fw_table.h +125 -0
- data/ext/pg_query/include/datatype/timestamp.h +40 -1
- data/ext/pg_query/include/executor/execdesc.h +1 -1
- data/ext/pg_query/include/executor/executor.h +65 -22
- data/ext/pg_query/include/executor/functions.h +17 -3
- data/ext/pg_query/include/executor/instrument.h +33 -16
- data/ext/pg_query/include/executor/spi.h +41 -3
- data/ext/pg_query/include/executor/tablefunc.h +1 -1
- data/ext/pg_query/include/executor/tuptable.h +1 -1
- data/ext/pg_query/include/fmgr.h +13 -7
- data/ext/pg_query/include/funcapi.h +16 -4
- data/ext/pg_query/include/getaddrinfo.h +1 -1
- data/ext/pg_query/include/jit/jit.h +11 -11
- data/ext/pg_query/include/kwlist_d.h +517 -494
- data/ext/pg_query/include/lib/dshash.h +112 -0
- data/ext/pg_query/include/lib/ilist.h +20 -1
- data/ext/pg_query/include/lib/pairingheap.h +1 -1
- data/ext/pg_query/include/lib/simplehash.h +140 -15
- data/ext/pg_query/include/lib/sort_template.h +432 -0
- data/ext/pg_query/include/lib/stringinfo.h +1 -1
- data/ext/pg_query/include/libpq/auth.h +6 -4
- data/ext/pg_query/include/libpq/crypt.h +5 -4
- data/ext/pg_query/include/libpq/hba.h +43 -4
- data/ext/pg_query/include/libpq/libpq-be.h +23 -6
- data/ext/pg_query/include/libpq/libpq.h +30 -20
- data/ext/pg_query/include/libpq/pqcomm.h +17 -31
- data/ext/pg_query/include/libpq/pqformat.h +1 -1
- data/ext/pg_query/include/libpq/pqsignal.h +4 -4
- data/ext/pg_query/include/mb/pg_wchar.h +105 -23
- data/ext/pg_query/include/mb/stringinfo_mb.h +1 -1
- data/ext/pg_query/include/miscadmin.h +47 -41
- data/ext/pg_query/include/nodes/bitmapset.h +1 -1
- data/ext/pg_query/include/nodes/execnodes.h +270 -78
- data/ext/pg_query/include/nodes/extensible.h +4 -2
- data/ext/pg_query/include/nodes/lockoptions.h +1 -1
- data/ext/pg_query/include/nodes/makefuncs.h +7 -6
- data/ext/pg_query/include/nodes/memnodes.h +5 -3
- data/ext/pg_query/include/nodes/nodeFuncs.h +1 -1
- data/ext/pg_query/include/nodes/nodes.h +30 -11
- data/ext/pg_query/include/nodes/params.h +1 -1
- data/ext/pg_query/include/nodes/parsenodes.h +322 -90
- data/ext/pg_query/include/nodes/pathnodes.h +243 -66
- data/ext/pg_query/include/nodes/pg_list.h +75 -69
- data/ext/pg_query/include/nodes/plannodes.h +111 -28
- data/ext/pg_query/include/nodes/primnodes.h +99 -47
- data/ext/pg_query/include/nodes/print.h +1 -1
- data/ext/pg_query/include/nodes/tidbitmap.h +1 -1
- data/ext/pg_query/include/nodes/value.h +58 -39
- data/ext/pg_query/include/optimizer/cost.h +9 -2
- data/ext/pg_query/include/optimizer/geqo.h +9 -7
- data/ext/pg_query/include/optimizer/geqo_gene.h +1 -1
- data/ext/pg_query/include/optimizer/optimizer.h +25 -17
- data/ext/pg_query/include/optimizer/paths.h +6 -6
- data/ext/pg_query/include/optimizer/planmain.h +15 -14
- data/ext/pg_query/include/parser/analyze.h +19 -5
- data/ext/pg_query/include/parser/gram.h +947 -913
- data/ext/pg_query/include/parser/gramparse.h +1 -1
- data/ext/pg_query/include/parser/kwlist.h +463 -453
- data/ext/pg_query/include/parser/parse_agg.h +2 -7
- data/ext/pg_query/include/parser/parse_coerce.h +3 -1
- data/ext/pg_query/include/parser/parse_expr.h +2 -3
- data/ext/pg_query/include/parser/parse_func.h +2 -1
- data/ext/pg_query/include/parser/parse_node.h +21 -9
- data/ext/pg_query/include/parser/parse_oper.h +1 -3
- data/ext/pg_query/include/parser/parse_relation.h +5 -4
- data/ext/pg_query/include/parser/parse_type.h +1 -1
- data/ext/pg_query/include/parser/parser.h +31 -4
- data/ext/pg_query/include/parser/parsetree.h +1 -1
- data/ext/pg_query/include/parser/scanner.h +1 -1
- data/ext/pg_query/include/parser/scansup.h +2 -5
- data/ext/pg_query/include/partitioning/partdefs.h +1 -1
- data/ext/pg_query/include/pg_config.h +83 -41
- data/ext/pg_query/include/pg_config_manual.h +74 -21
- data/ext/pg_query/include/pg_getopt.h +6 -6
- data/ext/pg_query/include/pg_query.h +5 -4
- data/ext/pg_query/include/pg_query_enum_defs.c +358 -241
- data/ext/pg_query/include/pg_query_fingerprint_conds.c +44 -7
- data/ext/pg_query/include/pg_query_fingerprint_defs.c +939 -113
- data/ext/pg_query/include/pg_query_outfuncs_conds.c +43 -13
- data/ext/pg_query/include/pg_query_outfuncs_defs.c +151 -26
- data/ext/pg_query/include/pg_query_readfuncs_conds.c +11 -2
- data/ext/pg_query/include/pg_query_readfuncs_defs.c +173 -30
- data/ext/pg_query/include/pg_trace.h +1 -1
- data/ext/pg_query/include/pgstat.h +449 -1238
- data/ext/pg_query/include/pgtime.h +14 -4
- data/ext/pg_query/include/pl_gram.h +126 -128
- data/ext/pg_query/include/pl_reserved_kwlist.h +1 -1
- data/ext/pg_query/include/pl_reserved_kwlist_d.h +10 -10
- data/ext/pg_query/include/pl_unreserved_kwlist.h +2 -3
- data/ext/pg_query/include/pl_unreserved_kwlist_d.h +54 -56
- data/ext/pg_query/include/plerrcodes.h +9 -1
- data/ext/pg_query/include/plpgsql.h +52 -54
- data/ext/pg_query/include/port/atomics/arch-arm.h +7 -1
- data/ext/pg_query/include/port/atomics/arch-ppc.h +1 -1
- data/ext/pg_query/include/port/atomics/arch-x86.h +1 -1
- data/ext/pg_query/include/port/atomics/fallback.h +1 -1
- data/ext/pg_query/include/port/atomics/generic-gcc.h +3 -3
- data/ext/pg_query/include/port/atomics/generic.h +1 -1
- data/ext/pg_query/include/port/atomics.h +1 -1
- data/ext/pg_query/include/port/pg_bitutils.h +40 -10
- data/ext/pg_query/include/port/pg_bswap.h +1 -1
- data/ext/pg_query/include/port/pg_crc32c.h +1 -1
- data/ext/pg_query/include/port.h +71 -46
- data/ext/pg_query/include/portability/instr_time.h +1 -1
- data/ext/pg_query/include/postgres.h +60 -16
- data/ext/pg_query/include/postmaster/autovacuum.h +17 -17
- data/ext/pg_query/include/postmaster/auxprocess.h +20 -0
- data/ext/pg_query/include/postmaster/bgworker.h +2 -1
- data/ext/pg_query/include/postmaster/bgworker_internals.h +2 -2
- data/ext/pg_query/include/postmaster/bgwriter.h +5 -5
- data/ext/pg_query/include/postmaster/fork_process.h +1 -1
- data/ext/pg_query/include/postmaster/interrupt.h +1 -1
- data/ext/pg_query/include/postmaster/pgarch.h +42 -8
- data/ext/pg_query/include/postmaster/postmaster.h +18 -17
- data/ext/pg_query/include/postmaster/startup.h +39 -0
- data/ext/pg_query/include/postmaster/syslogger.h +15 -10
- data/ext/pg_query/include/postmaster/walwriter.h +3 -3
- data/ext/pg_query/include/protobuf/pg_query.pb-c.h +1419 -914
- data/ext/pg_query/include/protobuf/pg_query.pb.h +43678 -32769
- data/ext/pg_query/include/regex/regex.h +18 -16
- data/ext/pg_query/include/replication/logicallauncher.h +3 -5
- data/ext/pg_query/include/replication/logicalproto.h +161 -17
- data/ext/pg_query/include/replication/logicalworker.h +1 -1
- data/ext/pg_query/include/replication/origin.h +7 -7
- data/ext/pg_query/include/replication/reorderbuffer.h +259 -42
- data/ext/pg_query/include/replication/slot.h +22 -11
- data/ext/pg_query/include/replication/syncrep.h +5 -5
- data/ext/pg_query/include/replication/walreceiver.h +145 -13
- data/ext/pg_query/include/replication/walsender.h +8 -8
- data/ext/pg_query/include/rewrite/prs2lock.h +1 -1
- data/ext/pg_query/include/rewrite/rewriteHandler.h +1 -3
- data/ext/pg_query/include/rewrite/rewriteManip.h +1 -1
- data/ext/pg_query/include/rewrite/rewriteSupport.h +1 -1
- data/ext/pg_query/include/storage/backendid.h +3 -3
- data/ext/pg_query/include/storage/block.h +4 -10
- data/ext/pg_query/include/storage/buf.h +1 -1
- data/ext/pg_query/include/storage/bufmgr.h +19 -14
- data/ext/pg_query/include/storage/bufpage.h +6 -8
- data/ext/pg_query/include/storage/condition_variable.h +13 -2
- data/ext/pg_query/include/storage/dsm.h +4 -1
- data/ext/pg_query/include/storage/dsm_impl.h +3 -2
- data/ext/pg_query/include/storage/fd.h +33 -3
- data/ext/pg_query/include/storage/fileset.h +40 -0
- data/ext/pg_query/include/storage/ipc.h +4 -1
- data/ext/pg_query/include/storage/item.h +1 -1
- data/ext/pg_query/include/storage/itemid.h +1 -1
- data/ext/pg_query/include/storage/itemptr.h +3 -1
- data/ext/pg_query/include/storage/large_object.h +2 -2
- data/ext/pg_query/include/storage/latch.h +9 -13
- data/ext/pg_query/include/storage/lmgr.h +2 -1
- data/ext/pg_query/include/storage/lock.h +11 -8
- data/ext/pg_query/include/storage/lockdefs.h +2 -2
- data/ext/pg_query/include/storage/lwlock.h +5 -32
- data/ext/pg_query/include/storage/lwlocknames.h +0 -1
- data/ext/pg_query/include/storage/off.h +1 -1
- data/ext/pg_query/include/storage/pg_sema.h +1 -1
- data/ext/pg_query/include/storage/pg_shmem.h +9 -7
- data/ext/pg_query/include/storage/pmsignal.h +15 -4
- data/ext/pg_query/include/storage/predicate.h +4 -4
- data/ext/pg_query/include/storage/proc.h +173 -59
- data/ext/pg_query/include/storage/procarray.h +98 -0
- data/ext/pg_query/include/storage/proclist_types.h +1 -1
- data/ext/pg_query/include/storage/procsignal.h +3 -7
- data/ext/pg_query/include/storage/relfilenode.h +1 -1
- data/ext/pg_query/include/storage/s_lock.h +60 -21
- data/ext/pg_query/include/storage/sharedfileset.h +3 -11
- data/ext/pg_query/include/storage/shm_mq.h +5 -4
- data/ext/pg_query/include/storage/shm_toc.h +1 -1
- data/ext/pg_query/include/storage/shmem.h +1 -1
- data/ext/pg_query/include/storage/sinval.h +3 -3
- data/ext/pg_query/include/storage/sinvaladt.h +1 -1
- data/ext/pg_query/include/storage/smgr.h +10 -8
- data/ext/pg_query/include/storage/spin.h +2 -2
- data/ext/pg_query/include/storage/standby.h +13 -6
- data/ext/pg_query/include/storage/standbydefs.h +2 -2
- data/ext/pg_query/include/storage/sync.h +7 -3
- data/ext/pg_query/include/tcop/cmdtag.h +1 -1
- data/ext/pg_query/include/tcop/cmdtaglist.h +3 -2
- data/ext/pg_query/include/tcop/deparse_utility.h +1 -1
- data/ext/pg_query/include/tcop/dest.h +1 -1
- data/ext/pg_query/include/tcop/fastpath.h +1 -2
- data/ext/pg_query/include/tcop/pquery.h +1 -1
- data/ext/pg_query/include/tcop/tcopprot.h +19 -11
- data/ext/pg_query/include/tcop/utility.h +7 -3
- data/ext/pg_query/include/tsearch/ts_cache.h +2 -2
- data/ext/pg_query/include/utils/acl.h +24 -3
- data/ext/pg_query/include/utils/aclchk_internal.h +1 -1
- data/ext/pg_query/include/utils/array.h +7 -2
- data/ext/pg_query/include/utils/backend_progress.h +44 -0
- data/ext/pg_query/include/utils/backend_status.h +321 -0
- data/ext/pg_query/include/utils/builtins.h +10 -11
- data/ext/pg_query/include/utils/bytea.h +3 -2
- data/ext/pg_query/include/utils/catcache.h +1 -1
- data/ext/pg_query/include/utils/date.h +1 -1
- data/ext/pg_query/include/utils/datetime.h +8 -7
- data/ext/pg_query/include/utils/datum.h +9 -1
- data/ext/pg_query/include/utils/dsa.h +1 -1
- data/ext/pg_query/include/utils/dynahash.h +4 -3
- data/ext/pg_query/include/utils/elog.h +52 -21
- data/ext/pg_query/include/utils/errcodes.h +2 -0
- data/ext/pg_query/include/utils/expandeddatum.h +1 -1
- data/ext/pg_query/include/utils/expandedrecord.h +1 -1
- data/ext/pg_query/include/utils/float.h +7 -7
- data/ext/pg_query/include/utils/fmgroids.h +1300 -696
- data/ext/pg_query/include/utils/fmgrprotos.h +199 -16
- data/ext/pg_query/include/utils/fmgrtab.h +6 -5
- data/ext/pg_query/include/utils/guc.h +69 -43
- data/ext/pg_query/include/utils/guc_tables.h +23 -19
- data/ext/pg_query/include/utils/hsearch.h +15 -11
- data/ext/pg_query/include/utils/inval.h +4 -1
- data/ext/pg_query/include/utils/lsyscache.h +11 -1
- data/ext/pg_query/include/utils/memdebug.h +1 -1
- data/ext/pg_query/include/utils/memutils.h +8 -3
- data/ext/pg_query/include/utils/numeric.h +19 -5
- data/ext/pg_query/include/utils/palloc.h +25 -3
- data/ext/pg_query/include/utils/partcache.h +1 -1
- data/ext/pg_query/include/utils/pg_locale.h +17 -9
- data/ext/pg_query/include/utils/pg_lsn.h +1 -1
- data/ext/pg_query/include/utils/pgstat_internal.h +784 -0
- data/ext/pg_query/include/utils/pidfile.h +1 -1
- data/ext/pg_query/include/utils/plancache.h +6 -5
- data/ext/pg_query/include/utils/portal.h +10 -12
- data/ext/pg_query/include/utils/ps_status.h +1 -1
- data/ext/pg_query/include/utils/queryenvironment.h +1 -1
- data/ext/pg_query/include/utils/queryjumble.h +88 -0
- data/ext/pg_query/include/utils/regproc.h +14 -3
- data/ext/pg_query/include/utils/rel.h +71 -19
- data/ext/pg_query/include/utils/relcache.h +8 -5
- data/ext/pg_query/include/utils/reltrigger.h +1 -1
- data/ext/pg_query/include/utils/resowner.h +1 -1
- data/ext/pg_query/include/utils/rls.h +2 -2
- data/ext/pg_query/include/utils/ruleutils.h +4 -1
- data/ext/pg_query/include/utils/sharedtuplestore.h +1 -1
- data/ext/pg_query/include/utils/snapmgr.h +34 -14
- data/ext/pg_query/include/utils/snapshot.h +14 -1
- data/ext/pg_query/include/utils/sortsupport.h +117 -2
- data/ext/pg_query/include/utils/syscache.h +6 -1
- data/ext/pg_query/include/utils/timeout.h +11 -4
- data/ext/pg_query/include/utils/timestamp.h +6 -5
- data/ext/pg_query/include/utils/tuplesort.h +25 -11
- data/ext/pg_query/include/utils/tuplestore.h +2 -2
- data/ext/pg_query/include/utils/typcache.h +24 -17
- data/ext/pg_query/include/utils/tzparser.h +1 -1
- data/ext/pg_query/include/utils/varlena.h +5 -3
- data/ext/pg_query/include/utils/wait_event.h +289 -0
- data/ext/pg_query/include/utils/xml.h +4 -4
- data/ext/pg_query/pg_query.pb-c.c +4302 -2304
- data/ext/pg_query/pg_query_deparse.c +1106 -373
- data/ext/pg_query/pg_query_fingerprint.c +30 -10
- data/ext/pg_query/pg_query_json_plpgsql.c +0 -25
- data/ext/pg_query/pg_query_normalize.c +1 -1
- data/ext/pg_query/pg_query_outfuncs_json.c +54 -16
- data/ext/pg_query/pg_query_outfuncs_protobuf.c +70 -10
- data/ext/pg_query/pg_query_parse.c +1 -1
- data/ext/pg_query/pg_query_readfuncs_protobuf.c +42 -8
- data/ext/pg_query/pg_query_scan.c +2 -1
- data/ext/pg_query/pg_query_split.c +3 -2
- data/ext/pg_query/src_backend_catalog_namespace.c +20 -9
- 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 +3 -1
- data/ext/pg_query/src_backend_nodes_copyfuncs.c +401 -76
- data/ext/pg_query/src_backend_nodes_equalfuncs.c +290 -46
- data/ext/pg_query/src_backend_nodes_extensible.c +1 -1
- data/ext/pg_query/src_backend_nodes_list.c +74 -11
- data/ext/pg_query/src_backend_nodes_makefuncs.c +5 -4
- data/ext/pg_query/src_backend_nodes_nodeFuncs.c +55 -12
- data/ext/pg_query/src_backend_nodes_value.c +28 -19
- data/ext/pg_query/src_backend_parser_gram.c +33874 -31261
- data/ext/pg_query/src_backend_parser_parser.c +26 -7
- data/ext/pg_query/src_backend_parser_scan.c +172 -209
- data/ext/pg_query/src_backend_parser_scansup.c +4 -28
- data/ext/pg_query/src_backend_postmaster_postmaster.c +77 -106
- data/ext/pg_query/src_backend_storage_ipc_ipc.c +13 -4
- data/ext/pg_query/src_backend_storage_lmgr_s_lock.c +5 -4
- data/ext/pg_query/src_backend_tcop_postgres.c +62 -23
- data/ext/pg_query/src_backend_utils_activity_pgstat_database.c +140 -0
- data/ext/pg_query/src_backend_utils_adt_datum.c +13 -1
- 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_ruleutils.c +71 -5
- data/ext/pg_query/src_backend_utils_error_assert.c +16 -14
- data/ext/pg_query/src_backend_utils_error_elog.c +172 -99
- data/ext/pg_query/src_backend_utils_fmgr_fmgr.c +12 -17
- data/ext/pg_query/src_backend_utils_hash_dynahash.c +40 -10
- data/ext/pg_query/src_backend_utils_init_globals.c +5 -5
- data/ext/pg_query/src_backend_utils_mb_mbutils.c +55 -66
- data/ext/pg_query/src_backend_utils_misc_guc.c +206 -45
- data/ext/pg_query/src_backend_utils_mmgr_aset.c +7 -5
- data/ext/pg_query/src_backend_utils_mmgr_mcxt.c +123 -35
- data/ext/pg_query/src_common_encnames.c +1 -1
- data/ext/pg_query/src_common_hashfn.c +3 -3
- data/ext/pg_query/src_common_keywords.c +15 -2
- data/ext/pg_query/src_common_kwlist_d.h +517 -494
- data/ext/pg_query/src_common_kwlookup.c +1 -1
- data/ext/pg_query/src_common_pg_prng.c +152 -0
- data/ext/pg_query/src_common_psprintf.c +1 -1
- data/ext/pg_query/src_common_string.c +7 -1
- data/ext/pg_query/src_common_stringinfo.c +1 -1
- data/ext/pg_query/src_common_wchar.c +701 -109
- data/ext/pg_query/src_pl_plpgsql_src_pl_comp.c +45 -20
- data/ext/pg_query/src_pl_plpgsql_src_pl_funcs.c +1 -18
- data/ext/pg_query/src_pl_plpgsql_src_pl_gram.c +1233 -1259
- 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 +54 -56
- data/ext/pg_query/src_port_pg_bitutils.c +41 -31
- data/ext/pg_query/src_port_pgsleep.c +1 -1
- data/ext/pg_query/src_port_pgstrcasecmp.c +1 -1
- data/ext/pg_query/src_port_qsort.c +12 -224
- data/ext/pg_query/src_port_snprintf.c +37 -13
- data/ext/pg_query/src_port_strerror.c +9 -19
- data/ext/pg_query/src_port_strnlen.c +1 -1
- data/lib/pg_query/filter_columns.rb +1 -1
- data/lib/pg_query/fingerprint.rb +5 -1
- data/lib/pg_query/node.rb +2 -2
- data/lib/pg_query/param_refs.rb +1 -1
- data/lib/pg_query/parse.rb +20 -8
- data/lib/pg_query/pg_query_pb.rb +1108 -942
- data/lib/pg_query/treewalker.rb +6 -0
- data/lib/pg_query/truncate.rb +1 -1
- data/lib/pg_query/version.rb +1 -1
- metadata +27 -17
- 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/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/pg_query_ruby_freebsd.sym +0 -2
- data/ext/pg_query/src_backend_libpq_pqcomm.c +0 -659
- data/ext/pg_query/src_backend_parser_parse_expr.c +0 -313
- data/ext/pg_query/src_port_erand48.c +0 -127
- data/ext/pg_query/src_port_random.c +0 -31
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
* pl_handler.c - Handler for the PL/pgSQL
|
|
11
11
|
* procedural language
|
|
12
12
|
*
|
|
13
|
-
* Portions Copyright (c) 1996-
|
|
13
|
+
* Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
|
|
14
14
|
* Portions Copyright (c) 1994, Regents of the University of California
|
|
15
15
|
*
|
|
16
16
|
*
|
|
@@ -12,7 +12,7 @@
|
|
|
12
12
|
* pl_reserved_kwlist_d.h
|
|
13
13
|
* List of keywords represented as a ScanKeywordList.
|
|
14
14
|
*
|
|
15
|
-
* Portions Copyright (c) 1996-
|
|
15
|
+
* Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
|
|
16
16
|
* Portions Copyright (c) 1994, Regents of the University of California
|
|
17
17
|
*
|
|
18
18
|
* NOTES
|
|
@@ -89,13 +89,13 @@ static int
|
|
|
89
89
|
ReservedPLKeywords_hash_func(const void *key, size_t keylen)
|
|
90
90
|
{
|
|
91
91
|
static const int8 h[49] = {
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
92
|
+
127, 7, 127, 127, -2, 127, 13, 127,
|
|
93
|
+
127, 5, 0, 23, 0, 2, 127, 0,
|
|
94
|
+
17, 0, 127, 19, 5, 127, 6, 2,
|
|
95
|
+
-3, 17, 0, 6, 127, 8, 18, 127,
|
|
96
|
+
-6, 3, -5, 0, 127, 0, 0, 11,
|
|
97
|
+
15, 127, 127, 127, 13, 127, 0, 17,
|
|
98
|
+
127
|
|
99
99
|
};
|
|
100
100
|
|
|
101
101
|
const unsigned char *k = (const unsigned char *) key;
|
|
@@ -106,8 +106,8 @@ ReservedPLKeywords_hash_func(const void *key, size_t keylen)
|
|
|
106
106
|
{
|
|
107
107
|
unsigned char c = *k++ | 0x20;
|
|
108
108
|
|
|
109
|
-
a = a *
|
|
110
|
-
b = b *
|
|
109
|
+
a = a * 257 + c;
|
|
110
|
+
b = b * 8191 + c;
|
|
111
111
|
}
|
|
112
112
|
return h[a % 49] + h[b % 49];
|
|
113
113
|
}
|
|
@@ -23,8 +23,8 @@
|
|
|
23
23
|
* - plpgsql_scanner_errposition
|
|
24
24
|
* - plpgsql_yyerror
|
|
25
25
|
* - plpgsql_push_back_token
|
|
26
|
-
* - plpgsql_token_is_unreserved_keyword
|
|
27
26
|
* - plpgsql_peek
|
|
27
|
+
* - plpgsql_token_is_unreserved_keyword
|
|
28
28
|
* - plpgsql_append_source_text
|
|
29
29
|
* - plpgsql_peek2
|
|
30
30
|
* - plpgsql_scanner_finish
|
|
@@ -38,7 +38,7 @@
|
|
|
38
38
|
* lexical scanning for PL/pgSQL
|
|
39
39
|
*
|
|
40
40
|
*
|
|
41
|
-
* Portions Copyright (c) 1996-
|
|
41
|
+
* Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
|
|
42
42
|
* Portions Copyright (c) 1994, Regents of the University of California
|
|
43
43
|
*
|
|
44
44
|
*
|
|
@@ -12,7 +12,7 @@
|
|
|
12
12
|
* pl_unreserved_kwlist_d.h
|
|
13
13
|
* List of keywords represented as a ScanKeywordList.
|
|
14
14
|
*
|
|
15
|
-
* Portions Copyright (c) 1996-
|
|
15
|
+
* Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
|
|
16
16
|
* Portions Copyright (c) 1994, Regents of the University of California
|
|
17
17
|
*
|
|
18
18
|
* NOTES
|
|
@@ -74,6 +74,7 @@ static const char UnreservedPLKeywords_kw_string[] =
|
|
|
74
74
|
"is\0"
|
|
75
75
|
"last\0"
|
|
76
76
|
"log\0"
|
|
77
|
+
"merge\0"
|
|
77
78
|
"message\0"
|
|
78
79
|
"message_text\0"
|
|
79
80
|
"move\0"
|
|
@@ -93,7 +94,6 @@ static const char UnreservedPLKeywords_kw_string[] =
|
|
|
93
94
|
"query\0"
|
|
94
95
|
"raise\0"
|
|
95
96
|
"relative\0"
|
|
96
|
-
"reset\0"
|
|
97
97
|
"return\0"
|
|
98
98
|
"returned_sqlstate\0"
|
|
99
99
|
"reverse\0"
|
|
@@ -103,7 +103,6 @@ static const char UnreservedPLKeywords_kw_string[] =
|
|
|
103
103
|
"schema\0"
|
|
104
104
|
"schema_name\0"
|
|
105
105
|
"scroll\0"
|
|
106
|
-
"set\0"
|
|
107
106
|
"slice\0"
|
|
108
107
|
"sqlstate\0"
|
|
109
108
|
"stacked\0"
|
|
@@ -160,25 +159,25 @@ static const uint16 UnreservedPLKeywords_kw_offsets[] = {
|
|
|
160
159
|
295,
|
|
161
160
|
300,
|
|
162
161
|
304,
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
162
|
+
310,
|
|
163
|
+
318,
|
|
164
|
+
331,
|
|
165
|
+
336,
|
|
166
|
+
341,
|
|
167
|
+
344,
|
|
168
|
+
351,
|
|
169
|
+
356,
|
|
170
|
+
363,
|
|
171
|
+
371,
|
|
172
|
+
382,
|
|
173
|
+
399,
|
|
174
|
+
420,
|
|
175
|
+
440,
|
|
176
|
+
458,
|
|
178
177
|
478,
|
|
179
178
|
484,
|
|
180
179
|
490,
|
|
181
|
-
|
|
180
|
+
496,
|
|
182
181
|
505,
|
|
183
182
|
512,
|
|
184
183
|
530,
|
|
@@ -189,59 +188,58 @@ static const uint16 UnreservedPLKeywords_kw_offsets[] = {
|
|
|
189
188
|
572,
|
|
190
189
|
584,
|
|
191
190
|
591,
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
682,
|
|
191
|
+
597,
|
|
192
|
+
606,
|
|
193
|
+
614,
|
|
194
|
+
620,
|
|
195
|
+
631,
|
|
196
|
+
636,
|
|
197
|
+
647,
|
|
198
|
+
660,
|
|
199
|
+
678,
|
|
202
200
|
};
|
|
203
201
|
|
|
204
|
-
#define UNRESERVEDPLKEYWORDS_NUM_KEYWORDS
|
|
202
|
+
#define UNRESERVEDPLKEYWORDS_NUM_KEYWORDS 82
|
|
205
203
|
|
|
206
204
|
static int
|
|
207
205
|
UnreservedPLKeywords_hash_func(const void *key, size_t keylen)
|
|
208
206
|
{
|
|
209
|
-
static const int16 h[
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
207
|
+
static const int16 h[165] = {
|
|
208
|
+
58, 0, 26, 32767, 0, 0, 9, 32767,
|
|
209
|
+
0, 32767, 37, 74, 32767, -7, 32767, 39,
|
|
210
|
+
58, -5, 32767, 31, 32767, 32767, 75, -23,
|
|
211
|
+
32767, 0, 32767, 32767, 32767, -14, 32767, 81,
|
|
212
|
+
32767, 32767, 32767, -36, -9, 32767, 32767, 32767,
|
|
213
|
+
40, 32767, 54, 10, 11, 43, 32767, 0,
|
|
214
|
+
52, 105, -22, 15, 32767, -33, 49, -65,
|
|
215
|
+
48, 32767, 32767, 32767, 25, 49, -47, 37,
|
|
216
|
+
21, 32767, 32767, -15, 70, 32767, 32767, 64,
|
|
217
|
+
-10, 126, 32767, 51, 0, 36, 32767, -55,
|
|
218
|
+
-22, 32767, 32767, 32767, 32767, 32767, -26, -35,
|
|
219
|
+
32767, 61, 32767, 32767, 32767, -23, 98, 48,
|
|
220
|
+
23, 19, 32767, 7, 35, 5, -18, 71,
|
|
221
|
+
28, 5, 32767, 32767, 32767, 74, 32767, 82,
|
|
222
|
+
32767, 0, 32767, 32767, 66, 0, 0, 50,
|
|
223
|
+
32767, 32767, 5, 2, 0, 32767, 55, 32767,
|
|
224
|
+
32767, 45, 79, 32767, 32767, 73, 22, 0,
|
|
225
|
+
103, 32767, -20, 72, 32767, 0, 29, 32767,
|
|
226
|
+
0, 32767, 32767, 0, 50, 28, 32767, -40,
|
|
227
|
+
32767, 32767, 34, 56, 32767, 32767, 32767, 17,
|
|
228
|
+
-36, 32767, 67, 32767, 0
|
|
231
229
|
};
|
|
232
230
|
|
|
233
231
|
const unsigned char *k = (const unsigned char *) key;
|
|
234
232
|
uint32 a = 0;
|
|
235
|
-
uint32 b =
|
|
233
|
+
uint32 b = 0;
|
|
236
234
|
|
|
237
235
|
while (keylen--)
|
|
238
236
|
{
|
|
239
237
|
unsigned char c = *k++ | 0x20;
|
|
240
238
|
|
|
241
|
-
a = a *
|
|
242
|
-
b = b *
|
|
239
|
+
a = a * 257 + c;
|
|
240
|
+
b = b * 8191 + c;
|
|
243
241
|
}
|
|
244
|
-
return h[a %
|
|
242
|
+
return h[a % 165] + h[b % 165];
|
|
245
243
|
}
|
|
246
244
|
|
|
247
245
|
static const ScanKeywordList UnreservedPLKeywords = {
|
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
* pg_bitutils.c
|
|
11
11
|
* Miscellaneous functions for bit-wise operations.
|
|
12
12
|
*
|
|
13
|
-
* Copyright (c) 2019-
|
|
13
|
+
* Copyright (c) 2019-2022, PostgreSQL Global Development Group
|
|
14
14
|
*
|
|
15
15
|
* IDENTIFICATION
|
|
16
16
|
* src/port/pg_bitutils.c
|
|
@@ -59,37 +59,21 @@
|
|
|
59
59
|
*/
|
|
60
60
|
|
|
61
61
|
|
|
62
|
-
/*
|
|
63
|
-
* On x86_64, we can use the hardware popcount instruction, but only if
|
|
64
|
-
* we can verify that the CPU supports it via the cpuid instruction.
|
|
65
|
-
*
|
|
66
|
-
* Otherwise, we fall back to __builtin_popcount if the compiler has that,
|
|
67
|
-
* or a hand-rolled implementation if not.
|
|
68
|
-
*/
|
|
69
|
-
#ifdef HAVE_X86_64_POPCNTQ
|
|
70
|
-
#if defined(HAVE__GET_CPUID) || defined(HAVE__CPUID)
|
|
71
|
-
#define USE_POPCNT_ASM 1
|
|
72
|
-
#endif
|
|
73
|
-
#endif
|
|
74
|
-
|
|
75
62
|
static int pg_popcount32_slow(uint32 word);
|
|
76
63
|
static int pg_popcount64_slow(uint64 word);
|
|
77
64
|
|
|
78
|
-
#ifdef
|
|
65
|
+
#ifdef TRY_POPCNT_FAST
|
|
79
66
|
static bool pg_popcount_available(void);
|
|
80
67
|
static int pg_popcount32_choose(uint32 word);
|
|
81
68
|
static int pg_popcount64_choose(uint64 word);
|
|
82
|
-
static int
|
|
83
|
-
static int
|
|
69
|
+
static int pg_popcount32_fast(uint32 word);
|
|
70
|
+
static int pg_popcount64_fast(uint64 word);
|
|
84
71
|
|
|
85
72
|
int (*pg_popcount32) (uint32 word) = pg_popcount32_choose;
|
|
86
73
|
int (*pg_popcount64) (uint64 word) = pg_popcount64_choose;
|
|
87
|
-
#
|
|
88
|
-
|
|
89
|
-
int (*pg_popcount64) (uint64 word) = pg_popcount64_slow;
|
|
90
|
-
#endif /* USE_POPCNT_ASM */
|
|
74
|
+
#endif /* TRY_POPCNT_FAST */
|
|
91
75
|
|
|
92
|
-
#ifdef
|
|
76
|
+
#ifdef TRY_POPCNT_FAST
|
|
93
77
|
|
|
94
78
|
/*
|
|
95
79
|
* Return true if CPUID indicates that the POPCNT instruction is available.
|
|
@@ -121,8 +105,8 @@ pg_popcount32_choose(uint32 word)
|
|
|
121
105
|
{
|
|
122
106
|
if (pg_popcount_available())
|
|
123
107
|
{
|
|
124
|
-
pg_popcount32 =
|
|
125
|
-
pg_popcount64 =
|
|
108
|
+
pg_popcount32 = pg_popcount32_fast;
|
|
109
|
+
pg_popcount64 = pg_popcount64_fast;
|
|
126
110
|
}
|
|
127
111
|
else
|
|
128
112
|
{
|
|
@@ -138,8 +122,8 @@ pg_popcount64_choose(uint64 word)
|
|
|
138
122
|
{
|
|
139
123
|
if (pg_popcount_available())
|
|
140
124
|
{
|
|
141
|
-
pg_popcount32 =
|
|
142
|
-
pg_popcount64 =
|
|
125
|
+
pg_popcount32 = pg_popcount32_fast;
|
|
126
|
+
pg_popcount64 = pg_popcount64_fast;
|
|
143
127
|
}
|
|
144
128
|
else
|
|
145
129
|
{
|
|
@@ -151,32 +135,40 @@ pg_popcount64_choose(uint64 word)
|
|
|
151
135
|
}
|
|
152
136
|
|
|
153
137
|
/*
|
|
154
|
-
*
|
|
138
|
+
* pg_popcount32_fast
|
|
155
139
|
* Return the number of 1 bits set in word
|
|
156
140
|
*/
|
|
157
141
|
static int
|
|
158
|
-
|
|
142
|
+
pg_popcount32_fast(uint32 word)
|
|
159
143
|
{
|
|
144
|
+
#ifdef _MSC_VER
|
|
145
|
+
return __popcnt(word);
|
|
146
|
+
#else
|
|
160
147
|
uint32 res;
|
|
161
148
|
|
|
162
149
|
__asm__ __volatile__(" popcntl %1,%0\n":"=q"(res):"rm"(word):"cc");
|
|
163
150
|
return (int) res;
|
|
151
|
+
#endif
|
|
164
152
|
}
|
|
165
153
|
|
|
166
154
|
/*
|
|
167
|
-
*
|
|
155
|
+
* pg_popcount64_fast
|
|
168
156
|
* Return the number of 1 bits set in word
|
|
169
157
|
*/
|
|
170
158
|
static int
|
|
171
|
-
|
|
159
|
+
pg_popcount64_fast(uint64 word)
|
|
172
160
|
{
|
|
161
|
+
#ifdef _MSC_VER
|
|
162
|
+
return __popcnt64(word);
|
|
163
|
+
#else
|
|
173
164
|
uint64 res;
|
|
174
165
|
|
|
175
166
|
__asm__ __volatile__(" popcntq %1,%0\n":"=q"(res):"rm"(word):"cc");
|
|
176
167
|
return (int) res;
|
|
168
|
+
#endif
|
|
177
169
|
}
|
|
178
170
|
|
|
179
|
-
#endif /*
|
|
171
|
+
#endif /* TRY_POPCNT_FAST */
|
|
180
172
|
|
|
181
173
|
|
|
182
174
|
/*
|
|
@@ -215,6 +207,24 @@ pg_popcount64_slow(uint64 word)
|
|
|
215
207
|
#endif /* HAVE__BUILTIN_POPCOUNT */
|
|
216
208
|
}
|
|
217
209
|
|
|
210
|
+
#ifndef TRY_POPCNT_FAST
|
|
211
|
+
|
|
212
|
+
/*
|
|
213
|
+
* When the POPCNT instruction is not available, there's no point in using
|
|
214
|
+
* function pointers to vary the implementation between the fast and slow
|
|
215
|
+
* method. We instead just make these actual external functions when
|
|
216
|
+
* TRY_POPCNT_FAST is not defined. The compiler should be able to inline
|
|
217
|
+
* the slow versions here.
|
|
218
|
+
*/
|
|
219
|
+
|
|
220
|
+
|
|
221
|
+
int
|
|
222
|
+
pg_popcount64(uint64 word)
|
|
223
|
+
{
|
|
224
|
+
return pg_popcount64_slow(word);
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
#endif /* !TRY_POPCNT_FAST */
|
|
218
228
|
|
|
219
229
|
/*
|
|
220
230
|
* pg_popcount
|
|
@@ -1,240 +1,28 @@
|
|
|
1
1
|
/*--------------------------------------------------------------------
|
|
2
2
|
* Symbols referenced in this file:
|
|
3
|
-
* -
|
|
4
|
-
* - pg_qsort
|
|
5
|
-
* - swapfunc
|
|
6
|
-
* - med3
|
|
3
|
+
* - pg_qsort_strcmp
|
|
7
4
|
*--------------------------------------------------------------------
|
|
8
5
|
*/
|
|
9
6
|
|
|
10
7
|
/*
|
|
11
8
|
* qsort.c: standard quicksort algorithm
|
|
12
|
-
*
|
|
13
|
-
* Modifications from vanilla NetBSD source:
|
|
14
|
-
* Add do ... while() macro fix
|
|
15
|
-
* Remove __inline, _DIAGASSERTs, __P
|
|
16
|
-
* Remove ill-considered "swap_cnt" switch to insertion sort,
|
|
17
|
-
* in favor of a simple check for presorted input.
|
|
18
|
-
* Take care to recurse on the smaller partition, to bound stack usage.
|
|
19
|
-
*
|
|
20
|
-
* CAUTION: if you change this file, see also qsort_arg.c, gen_qsort_tuple.pl
|
|
21
|
-
*
|
|
22
|
-
* src/port/qsort.c
|
|
23
|
-
*/
|
|
24
|
-
|
|
25
|
-
/* $NetBSD: qsort.c,v 1.13 2003/08/07 16:43:42 agc Exp $ */
|
|
26
|
-
|
|
27
|
-
/*-
|
|
28
|
-
* Copyright (c) 1992, 1993
|
|
29
|
-
* The Regents of the University of California. All rights reserved.
|
|
30
|
-
*
|
|
31
|
-
* Redistribution and use in source and binary forms, with or without
|
|
32
|
-
* modification, are permitted provided that the following conditions
|
|
33
|
-
* are met:
|
|
34
|
-
* 1. Redistributions of source code must retain the above copyright
|
|
35
|
-
* notice, this list of conditions and the following disclaimer.
|
|
36
|
-
* 2. Redistributions in binary form must reproduce the above copyright
|
|
37
|
-
* notice, this list of conditions and the following disclaimer in the
|
|
38
|
-
* documentation and/or other materials provided with the distribution.
|
|
39
|
-
* 3. Neither the name of the University nor the names of its contributors
|
|
40
|
-
* may be used to endorse or promote products derived from this software
|
|
41
|
-
* without specific prior written permission.
|
|
42
|
-
*
|
|
43
|
-
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
|
|
44
|
-
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
45
|
-
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
|
46
|
-
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
|
|
47
|
-
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
|
48
|
-
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
|
49
|
-
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
|
50
|
-
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
|
51
|
-
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
|
52
|
-
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
|
53
|
-
* SUCH DAMAGE.
|
|
54
9
|
*/
|
|
55
10
|
|
|
56
11
|
#include "c.h"
|
|
57
12
|
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
13
|
+
#define ST_SORT pg_qsort
|
|
14
|
+
#define ST_ELEMENT_TYPE_VOID
|
|
15
|
+
#define ST_COMPARE_RUNTIME_POINTER
|
|
16
|
+
#define ST_SCOPE
|
|
17
|
+
#define ST_DECLARE
|
|
18
|
+
#define ST_DEFINE
|
|
19
|
+
#include "lib/sort_template.h"
|
|
62
20
|
|
|
63
21
|
/*
|
|
64
|
-
*
|
|
65
|
-
* "Engineering a sort function",
|
|
66
|
-
* Software--Practice and Experience 23 (1993) 1249-1265.
|
|
67
|
-
*
|
|
68
|
-
* We have modified their original by adding a check for already-sorted input,
|
|
69
|
-
* which seems to be a win per discussions on pgsql-hackers around 2006-03-21.
|
|
70
|
-
*
|
|
71
|
-
* Also, we recurse on the smaller partition and iterate on the larger one,
|
|
72
|
-
* which ensures we cannot recurse more than log(N) levels (since the
|
|
73
|
-
* partition recursed to is surely no more than half of the input). Bentley
|
|
74
|
-
* and McIlroy explicitly rejected doing this on the grounds that it's "not
|
|
75
|
-
* worth the effort", but we have seen crashes in the field due to stack
|
|
76
|
-
* overrun, so that judgment seems wrong.
|
|
22
|
+
* qsort comparator wrapper for strcmp.
|
|
77
23
|
*/
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
do { \
|
|
81
|
-
size_t i = (n) / sizeof (TYPE); \
|
|
82
|
-
TYPE *pi = (TYPE *)(void *)(parmi); \
|
|
83
|
-
TYPE *pj = (TYPE *)(void *)(parmj); \
|
|
84
|
-
do { \
|
|
85
|
-
TYPE t = *pi; \
|
|
86
|
-
*pi++ = *pj; \
|
|
87
|
-
*pj++ = t; \
|
|
88
|
-
} while (--i > 0); \
|
|
89
|
-
} while (0)
|
|
90
|
-
|
|
91
|
-
#define SWAPINIT(a, es) swaptype = ((char *)(a) - (char *)0) % sizeof(long) || \
|
|
92
|
-
(es) % sizeof(long) ? 2 : (es) == sizeof(long)? 0 : 1
|
|
93
|
-
|
|
94
|
-
static void
|
|
95
|
-
swapfunc(char *a, char *b, size_t n, int swaptype)
|
|
24
|
+
int
|
|
25
|
+
pg_qsort_strcmp(const void *a, const void *b)
|
|
96
26
|
{
|
|
97
|
-
|
|
98
|
-
swapcode(long, a, b, n);
|
|
99
|
-
else
|
|
100
|
-
swapcode(char, a, b, n);
|
|
27
|
+
return strcmp(*(const char *const *) a, *(const char *const *) b);
|
|
101
28
|
}
|
|
102
|
-
|
|
103
|
-
#define swap(a, b) \
|
|
104
|
-
if (swaptype == 0) { \
|
|
105
|
-
long t = *(long *)(void *)(a); \
|
|
106
|
-
*(long *)(void *)(a) = *(long *)(void *)(b); \
|
|
107
|
-
*(long *)(void *)(b) = t; \
|
|
108
|
-
} else \
|
|
109
|
-
swapfunc(a, b, es, swaptype)
|
|
110
|
-
|
|
111
|
-
#define vecswap(a, b, n) if ((n) > 0) swapfunc(a, b, n, swaptype)
|
|
112
|
-
|
|
113
|
-
static char *
|
|
114
|
-
med3(char *a, char *b, char *c, int (*cmp) (const void *, const void *))
|
|
115
|
-
{
|
|
116
|
-
return cmp(a, b) < 0 ?
|
|
117
|
-
(cmp(b, c) < 0 ? b : (cmp(a, c) < 0 ? c : a))
|
|
118
|
-
: (cmp(b, c) > 0 ? b : (cmp(a, c) < 0 ? a : c));
|
|
119
|
-
}
|
|
120
|
-
|
|
121
|
-
void
|
|
122
|
-
pg_qsort(void *a, size_t n, size_t es, int (*cmp) (const void *, const void *))
|
|
123
|
-
{
|
|
124
|
-
char *pa,
|
|
125
|
-
*pb,
|
|
126
|
-
*pc,
|
|
127
|
-
*pd,
|
|
128
|
-
*pl,
|
|
129
|
-
*pm,
|
|
130
|
-
*pn;
|
|
131
|
-
size_t d1,
|
|
132
|
-
d2;
|
|
133
|
-
int r,
|
|
134
|
-
swaptype,
|
|
135
|
-
presorted;
|
|
136
|
-
|
|
137
|
-
loop:SWAPINIT(a, es);
|
|
138
|
-
if (n < 7)
|
|
139
|
-
{
|
|
140
|
-
for (pm = (char *) a + es; pm < (char *) a + n * es; pm += es)
|
|
141
|
-
for (pl = pm; pl > (char *) a && cmp(pl - es, pl) > 0;
|
|
142
|
-
pl -= es)
|
|
143
|
-
swap(pl, pl - es);
|
|
144
|
-
return;
|
|
145
|
-
}
|
|
146
|
-
presorted = 1;
|
|
147
|
-
for (pm = (char *) a + es; pm < (char *) a + n * es; pm += es)
|
|
148
|
-
{
|
|
149
|
-
if (cmp(pm - es, pm) > 0)
|
|
150
|
-
{
|
|
151
|
-
presorted = 0;
|
|
152
|
-
break;
|
|
153
|
-
}
|
|
154
|
-
}
|
|
155
|
-
if (presorted)
|
|
156
|
-
return;
|
|
157
|
-
pm = (char *) a + (n / 2) * es;
|
|
158
|
-
if (n > 7)
|
|
159
|
-
{
|
|
160
|
-
pl = (char *) a;
|
|
161
|
-
pn = (char *) a + (n - 1) * es;
|
|
162
|
-
if (n > 40)
|
|
163
|
-
{
|
|
164
|
-
size_t d = (n / 8) * es;
|
|
165
|
-
|
|
166
|
-
pl = med3(pl, pl + d, pl + 2 * d, cmp);
|
|
167
|
-
pm = med3(pm - d, pm, pm + d, cmp);
|
|
168
|
-
pn = med3(pn - 2 * d, pn - d, pn, cmp);
|
|
169
|
-
}
|
|
170
|
-
pm = med3(pl, pm, pn, cmp);
|
|
171
|
-
}
|
|
172
|
-
swap(a, pm);
|
|
173
|
-
pa = pb = (char *) a + es;
|
|
174
|
-
pc = pd = (char *) a + (n - 1) * es;
|
|
175
|
-
for (;;)
|
|
176
|
-
{
|
|
177
|
-
while (pb <= pc && (r = cmp(pb, a)) <= 0)
|
|
178
|
-
{
|
|
179
|
-
if (r == 0)
|
|
180
|
-
{
|
|
181
|
-
swap(pa, pb);
|
|
182
|
-
pa += es;
|
|
183
|
-
}
|
|
184
|
-
pb += es;
|
|
185
|
-
}
|
|
186
|
-
while (pb <= pc && (r = cmp(pc, a)) >= 0)
|
|
187
|
-
{
|
|
188
|
-
if (r == 0)
|
|
189
|
-
{
|
|
190
|
-
swap(pc, pd);
|
|
191
|
-
pd -= es;
|
|
192
|
-
}
|
|
193
|
-
pc -= es;
|
|
194
|
-
}
|
|
195
|
-
if (pb > pc)
|
|
196
|
-
break;
|
|
197
|
-
swap(pb, pc);
|
|
198
|
-
pb += es;
|
|
199
|
-
pc -= es;
|
|
200
|
-
}
|
|
201
|
-
pn = (char *) a + n * es;
|
|
202
|
-
d1 = Min(pa - (char *) a, pb - pa);
|
|
203
|
-
vecswap(a, pb - d1, d1);
|
|
204
|
-
d1 = Min(pd - pc, pn - pd - es);
|
|
205
|
-
vecswap(pb, pn - d1, d1);
|
|
206
|
-
d1 = pb - pa;
|
|
207
|
-
d2 = pd - pc;
|
|
208
|
-
if (d1 <= d2)
|
|
209
|
-
{
|
|
210
|
-
/* Recurse on left partition, then iterate on right partition */
|
|
211
|
-
if (d1 > es)
|
|
212
|
-
pg_qsort(a, d1 / es, es, cmp);
|
|
213
|
-
if (d2 > es)
|
|
214
|
-
{
|
|
215
|
-
/* Iterate rather than recurse to save stack space */
|
|
216
|
-
/* pg_qsort(pn - d2, d2 / es, es, cmp); */
|
|
217
|
-
a = pn - d2;
|
|
218
|
-
n = d2 / es;
|
|
219
|
-
goto loop;
|
|
220
|
-
}
|
|
221
|
-
}
|
|
222
|
-
else
|
|
223
|
-
{
|
|
224
|
-
/* Recurse on right partition, then iterate on left partition */
|
|
225
|
-
if (d2 > es)
|
|
226
|
-
pg_qsort(pn - d2, d2 / es, es, cmp);
|
|
227
|
-
if (d1 > es)
|
|
228
|
-
{
|
|
229
|
-
/* Iterate rather than recurse to save stack space */
|
|
230
|
-
/* pg_qsort(a, d1 / es, es, cmp); */
|
|
231
|
-
n = d1 / es;
|
|
232
|
-
goto loop;
|
|
233
|
-
}
|
|
234
|
-
}
|
|
235
|
-
}
|
|
236
|
-
|
|
237
|
-
/*
|
|
238
|
-
* qsort comparator wrapper for strcmp.
|
|
239
|
-
*/
|
|
240
|
-
|