pg_query 2.1.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 +104 -0
- data/README.md +59 -31
- data/Rakefile +2 -2
- data/ext/pg_query/extconf.rb +8 -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 +5 -1
- data/ext/pg_query/include/access/xact.h +79 -19
- data/ext/pg_query/include/access/xlog.h +60 -155
- data/ext/pg_query/include/access/xlog_internal.h +50 -14
- 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 +148 -32
- 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 +10 -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 +45 -15
- data/ext/pg_query/include/catalog/pg_class_d.h +31 -2
- 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 +5 -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 +21 -16
- 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 -4
- 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 +56 -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 +4 -5
- 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 +3 -1
- data/ext/pg_query/include/commands/trigger.h +27 -17
- 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 +150 -25
- 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 +31 -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 +106 -23
- data/ext/pg_query/include/mb/stringinfo_mb.h +1 -1
- data/ext/pg_query/include/miscadmin.h +71 -52
- data/ext/pg_query/include/nodes/bitmapset.h +1 -1
- data/ext/pg_query/include/nodes/execnodes.h +272 -80
- 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 +327 -94
- data/ext/pg_query/include/nodes/pathnodes.h +245 -67
- data/ext/pg_query/include/nodes/pg_list.h +75 -68
- data/ext/pg_query/include/nodes/plannodes.h +128 -30
- 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 -22
- 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 +4 -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 +94 -46
- 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 +1220 -422
- data/ext/pg_query/include/pg_query_outfuncs_conds.c +43 -13
- data/ext/pg_query/include/pg_query_outfuncs_defs.c +152 -26
- data/ext/pg_query/include/pg_query_readfuncs_conds.c +11 -2
- data/ext/pg_query/include/pg_query_readfuncs_defs.c +174 -30
- data/ext/pg_query/include/pg_trace.h +1 -1
- data/ext/pg_query/include/pgstat.h +449 -1237
- 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 +88 -12
- 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 +72 -43
- 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 +1422 -916
- 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 +262 -44
- data/ext/pg_query/include/replication/slot.h +23 -12
- 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 +17 -13
- data/ext/pg_query/include/storage/lockdefs.h +2 -2
- data/ext/pg_query/include/storage/lwlock.h +6 -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 +183 -55
- 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 +67 -4
- 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 +7 -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 +11 -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 +5 -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 +12 -1
- 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 -20
- data/ext/pg_query/include/utils/relcache.h +9 -7
- 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 +35 -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 +4318 -2307
- data/ext/pg_query/pg_query_deparse.c +1114 -381
- data/ext/pg_query/pg_query_fingerprint.c +46 -10
- data/ext/pg_query/pg_query_fingerprint.h +3 -1
- data/ext/pg_query/pg_query_json_plpgsql.c +55 -12
- data/ext/pg_query/pg_query_normalize.c +163 -20
- data/ext/pg_query/pg_query_outfuncs.h +1 -0
- data/ext/pg_query/pg_query_outfuncs_json.c +65 -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_parse_plpgsql.c +79 -16
- data/ext/pg_query/pg_query_readfuncs_protobuf.c +42 -8
- data/ext/pg_query/pg_query_ruby.c +1 -1
- 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 +21 -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 +424 -109
- data/ext/pg_query/src_backend_nodes_equalfuncs.c +291 -46
- data/ext/pg_query/src_backend_nodes_extensible.c +1 -1
- data/ext/pg_query/src_backend_nodes_list.c +86 -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 +33890 -31262
- data/ext/pg_query/src_backend_parser_parser.c +26 -7
- data/ext/pg_query/src_backend_parser_scan.c +644 -441
- 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 +73 -24
- 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 +109 -15
- 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 +207 -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 +712 -109
- data/ext/pg_query/src_pl_plpgsql_src_pl_comp.c +49 -22
- data/ext/pg_query/src_pl_plpgsql_src_pl_funcs.c +1 -18
- data/ext/pg_query/src_pl_plpgsql_src_pl_gram.c +1235 -1261
- 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 -52
- 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 +46 -20
- data/ext/pg_query/src_port_strerror.c +9 -19
- data/ext/pg_query/src_port_strnlen.c +1 -1
- data/lib/pg_query/deparse.rb +7 -1
- data/lib/pg_query/filter_columns.rb +6 -4
- data/lib/pg_query/fingerprint.rb +18 -3
- data/lib/pg_query/node.rb +2 -2
- data/lib/pg_query/param_refs.rb +1 -1
- data/lib/pg_query/parse.rb +87 -51
- data/lib/pg_query/pg_query_pb.rb +1109 -942
- data/lib/pg_query/treewalker.rb +6 -0
- data/lib/pg_query/truncate.rb +54 -8
- data/lib/pg_query/version.rb +1 -1
- metadata +29 -18
- 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/src_backend_libpq_pqcomm.c +0 -651
- 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 = {
|
|
@@ -1,13 +1,6 @@
|
|
|
1
1
|
/*--------------------------------------------------------------------
|
|
2
2
|
* Symbols referenced in this file:
|
|
3
3
|
* - pg_popcount64
|
|
4
|
-
* - pg_popcount64_choose
|
|
5
|
-
* - pg_popcount32
|
|
6
|
-
* - pg_popcount32_choose
|
|
7
|
-
* - pg_popcount_available
|
|
8
|
-
* - pg_popcount32_asm
|
|
9
|
-
* - pg_popcount64_asm
|
|
10
|
-
* - pg_popcount32_slow
|
|
11
4
|
* - pg_popcount64_slow
|
|
12
5
|
*--------------------------------------------------------------------
|
|
13
6
|
*/
|
|
@@ -17,7 +10,7 @@
|
|
|
17
10
|
* pg_bitutils.c
|
|
18
11
|
* Miscellaneous functions for bit-wise operations.
|
|
19
12
|
*
|
|
20
|
-
* Copyright (c) 2019-
|
|
13
|
+
* Copyright (c) 2019-2022, PostgreSQL Global Development Group
|
|
21
14
|
*
|
|
22
15
|
* IDENTIFICATION
|
|
23
16
|
* src/port/pg_bitutils.c
|
|
@@ -66,37 +59,21 @@
|
|
|
66
59
|
*/
|
|
67
60
|
|
|
68
61
|
|
|
69
|
-
/*
|
|
70
|
-
* On x86_64, we can use the hardware popcount instruction, but only if
|
|
71
|
-
* we can verify that the CPU supports it via the cpuid instruction.
|
|
72
|
-
*
|
|
73
|
-
* Otherwise, we fall back to __builtin_popcount if the compiler has that,
|
|
74
|
-
* or a hand-rolled implementation if not.
|
|
75
|
-
*/
|
|
76
|
-
#ifdef HAVE_X86_64_POPCNTQ
|
|
77
|
-
#if defined(HAVE__GET_CPUID) || defined(HAVE__CPUID)
|
|
78
|
-
#define USE_POPCNT_ASM 1
|
|
79
|
-
#endif
|
|
80
|
-
#endif
|
|
81
|
-
|
|
82
62
|
static int pg_popcount32_slow(uint32 word);
|
|
83
63
|
static int pg_popcount64_slow(uint64 word);
|
|
84
64
|
|
|
85
|
-
#ifdef
|
|
65
|
+
#ifdef TRY_POPCNT_FAST
|
|
86
66
|
static bool pg_popcount_available(void);
|
|
87
67
|
static int pg_popcount32_choose(uint32 word);
|
|
88
68
|
static int pg_popcount64_choose(uint64 word);
|
|
89
|
-
static int
|
|
90
|
-
static int
|
|
69
|
+
static int pg_popcount32_fast(uint32 word);
|
|
70
|
+
static int pg_popcount64_fast(uint64 word);
|
|
91
71
|
|
|
92
72
|
int (*pg_popcount32) (uint32 word) = pg_popcount32_choose;
|
|
93
73
|
int (*pg_popcount64) (uint64 word) = pg_popcount64_choose;
|
|
94
|
-
#
|
|
95
|
-
int (*pg_popcount32) (uint32 word) = pg_popcount32_slow;
|
|
96
|
-
int (*pg_popcount64) (uint64 word) = pg_popcount64_slow;
|
|
97
|
-
#endif /* USE_POPCNT_ASM */
|
|
74
|
+
#endif /* TRY_POPCNT_FAST */
|
|
98
75
|
|
|
99
|
-
#ifdef
|
|
76
|
+
#ifdef TRY_POPCNT_FAST
|
|
100
77
|
|
|
101
78
|
/*
|
|
102
79
|
* Return true if CPUID indicates that the POPCNT instruction is available.
|
|
@@ -128,8 +105,8 @@ pg_popcount32_choose(uint32 word)
|
|
|
128
105
|
{
|
|
129
106
|
if (pg_popcount_available())
|
|
130
107
|
{
|
|
131
|
-
pg_popcount32 =
|
|
132
|
-
pg_popcount64 =
|
|
108
|
+
pg_popcount32 = pg_popcount32_fast;
|
|
109
|
+
pg_popcount64 = pg_popcount64_fast;
|
|
133
110
|
}
|
|
134
111
|
else
|
|
135
112
|
{
|
|
@@ -145,8 +122,8 @@ pg_popcount64_choose(uint64 word)
|
|
|
145
122
|
{
|
|
146
123
|
if (pg_popcount_available())
|
|
147
124
|
{
|
|
148
|
-
pg_popcount32 =
|
|
149
|
-
pg_popcount64 =
|
|
125
|
+
pg_popcount32 = pg_popcount32_fast;
|
|
126
|
+
pg_popcount64 = pg_popcount64_fast;
|
|
150
127
|
}
|
|
151
128
|
else
|
|
152
129
|
{
|
|
@@ -158,55 +135,49 @@ pg_popcount64_choose(uint64 word)
|
|
|
158
135
|
}
|
|
159
136
|
|
|
160
137
|
/*
|
|
161
|
-
*
|
|
138
|
+
* pg_popcount32_fast
|
|
162
139
|
* Return the number of 1 bits set in word
|
|
163
140
|
*/
|
|
164
141
|
static int
|
|
165
|
-
|
|
142
|
+
pg_popcount32_fast(uint32 word)
|
|
166
143
|
{
|
|
144
|
+
#ifdef _MSC_VER
|
|
145
|
+
return __popcnt(word);
|
|
146
|
+
#else
|
|
167
147
|
uint32 res;
|
|
168
148
|
|
|
169
149
|
__asm__ __volatile__(" popcntl %1,%0\n":"=q"(res):"rm"(word):"cc");
|
|
170
150
|
return (int) res;
|
|
151
|
+
#endif
|
|
171
152
|
}
|
|
172
153
|
|
|
173
154
|
/*
|
|
174
|
-
*
|
|
155
|
+
* pg_popcount64_fast
|
|
175
156
|
* Return the number of 1 bits set in word
|
|
176
157
|
*/
|
|
177
158
|
static int
|
|
178
|
-
|
|
159
|
+
pg_popcount64_fast(uint64 word)
|
|
179
160
|
{
|
|
161
|
+
#ifdef _MSC_VER
|
|
162
|
+
return __popcnt64(word);
|
|
163
|
+
#else
|
|
180
164
|
uint64 res;
|
|
181
165
|
|
|
182
166
|
__asm__ __volatile__(" popcntq %1,%0\n":"=q"(res):"rm"(word):"cc");
|
|
183
167
|
return (int) res;
|
|
168
|
+
#endif
|
|
184
169
|
}
|
|
185
170
|
|
|
186
|
-
#endif /*
|
|
171
|
+
#endif /* TRY_POPCNT_FAST */
|
|
187
172
|
|
|
188
173
|
|
|
189
174
|
/*
|
|
190
175
|
* pg_popcount32_slow
|
|
191
176
|
* Return the number of 1 bits set in word
|
|
192
177
|
*/
|
|
193
|
-
static int
|
|
194
|
-
pg_popcount32_slow(uint32 word)
|
|
195
|
-
{
|
|
196
178
|
#ifdef HAVE__BUILTIN_POPCOUNT
|
|
197
|
-
return __builtin_popcount(word);
|
|
198
179
|
#else /* !HAVE__BUILTIN_POPCOUNT */
|
|
199
|
-
int result = 0;
|
|
200
|
-
|
|
201
|
-
while (word != 0)
|
|
202
|
-
{
|
|
203
|
-
result += pg_number_of_ones[word & 255];
|
|
204
|
-
word >>= 8;
|
|
205
|
-
}
|
|
206
|
-
|
|
207
|
-
return result;
|
|
208
180
|
#endif /* HAVE__BUILTIN_POPCOUNT */
|
|
209
|
-
}
|
|
210
181
|
|
|
211
182
|
/*
|
|
212
183
|
* pg_popcount64_slow
|
|
@@ -236,6 +207,24 @@ pg_popcount64_slow(uint64 word)
|
|
|
236
207
|
#endif /* HAVE__BUILTIN_POPCOUNT */
|
|
237
208
|
}
|
|
238
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 */
|
|
239
228
|
|
|
240
229
|
/*
|
|
241
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
|
-
|