gitlab-pg_query 1.3.1 → 2.0.4
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 +217 -99
- data/README.md +92 -69
- data/Rakefile +85 -5
- data/ext/pg_query/extconf.rb +3 -40
- data/ext/pg_query/guc-file.c +0 -0
- data/ext/pg_query/include/access/amapi.h +246 -0
- data/ext/pg_query/include/access/attmap.h +52 -0
- data/ext/pg_query/include/access/attnum.h +64 -0
- data/ext/pg_query/include/access/clog.h +61 -0
- data/ext/pg_query/include/access/commit_ts.h +77 -0
- data/ext/pg_query/include/access/detoast.h +92 -0
- data/ext/pg_query/include/access/genam.h +228 -0
- data/ext/pg_query/include/access/gin.h +78 -0
- data/ext/pg_query/include/access/htup.h +89 -0
- data/ext/pg_query/include/access/htup_details.h +819 -0
- data/ext/pg_query/include/access/itup.h +161 -0
- data/ext/pg_query/include/access/parallel.h +82 -0
- data/ext/pg_query/include/access/printtup.h +35 -0
- data/ext/pg_query/include/access/relation.h +28 -0
- data/ext/pg_query/include/access/relscan.h +176 -0
- data/ext/pg_query/include/access/rmgr.h +35 -0
- data/ext/pg_query/include/access/rmgrlist.h +49 -0
- data/ext/pg_query/include/access/sdir.h +58 -0
- data/ext/pg_query/include/access/skey.h +151 -0
- data/ext/pg_query/include/access/stratnum.h +83 -0
- data/ext/pg_query/include/access/sysattr.h +29 -0
- data/ext/pg_query/include/access/table.h +27 -0
- data/ext/pg_query/include/access/tableam.h +1825 -0
- data/ext/pg_query/include/access/transam.h +265 -0
- data/ext/pg_query/include/access/tupconvert.h +51 -0
- data/ext/pg_query/include/access/tupdesc.h +154 -0
- data/ext/pg_query/include/access/tupmacs.h +247 -0
- data/ext/pg_query/include/access/twophase.h +61 -0
- data/ext/pg_query/include/access/xact.h +463 -0
- data/ext/pg_query/include/access/xlog.h +398 -0
- data/ext/pg_query/include/access/xlog_internal.h +330 -0
- data/ext/pg_query/include/access/xlogdefs.h +109 -0
- data/ext/pg_query/include/access/xloginsert.h +64 -0
- data/ext/pg_query/include/access/xlogreader.h +327 -0
- data/ext/pg_query/include/access/xlogrecord.h +227 -0
- data/ext/pg_query/include/bootstrap/bootstrap.h +62 -0
- data/ext/pg_query/include/c.h +1322 -0
- data/ext/pg_query/include/catalog/catalog.h +42 -0
- data/ext/pg_query/include/catalog/catversion.h +58 -0
- data/ext/pg_query/include/catalog/dependency.h +275 -0
- data/ext/pg_query/include/catalog/genbki.h +64 -0
- data/ext/pg_query/include/catalog/index.h +199 -0
- data/ext/pg_query/include/catalog/indexing.h +366 -0
- data/ext/pg_query/include/catalog/namespace.h +188 -0
- data/ext/pg_query/include/catalog/objectaccess.h +197 -0
- data/ext/pg_query/include/catalog/objectaddress.h +84 -0
- data/ext/pg_query/include/catalog/pg_aggregate.h +176 -0
- data/ext/pg_query/include/catalog/pg_aggregate_d.h +77 -0
- data/ext/pg_query/include/catalog/pg_am.h +60 -0
- data/ext/pg_query/include/catalog/pg_am_d.h +45 -0
- data/ext/pg_query/include/catalog/pg_attribute.h +204 -0
- data/ext/pg_query/include/catalog/pg_attribute_d.h +59 -0
- data/ext/pg_query/include/catalog/pg_authid.h +58 -0
- data/ext/pg_query/include/catalog/pg_authid_d.h +49 -0
- data/ext/pg_query/include/catalog/pg_class.h +200 -0
- data/ext/pg_query/include/catalog/pg_class_d.h +103 -0
- data/ext/pg_query/include/catalog/pg_collation.h +73 -0
- data/ext/pg_query/include/catalog/pg_collation_d.h +45 -0
- data/ext/pg_query/include/catalog/pg_constraint.h +247 -0
- data/ext/pg_query/include/catalog/pg_constraint_d.h +67 -0
- data/ext/pg_query/include/catalog/pg_control.h +250 -0
- data/ext/pg_query/include/catalog/pg_conversion.h +72 -0
- data/ext/pg_query/include/catalog/pg_conversion_d.h +35 -0
- data/ext/pg_query/include/catalog/pg_depend.h +73 -0
- data/ext/pg_query/include/catalog/pg_depend_d.h +34 -0
- data/ext/pg_query/include/catalog/pg_event_trigger.h +51 -0
- data/ext/pg_query/include/catalog/pg_event_trigger_d.h +34 -0
- data/ext/pg_query/include/catalog/pg_index.h +80 -0
- data/ext/pg_query/include/catalog/pg_index_d.h +56 -0
- data/ext/pg_query/include/catalog/pg_language.h +67 -0
- data/ext/pg_query/include/catalog/pg_language_d.h +39 -0
- data/ext/pg_query/include/catalog/pg_namespace.h +59 -0
- data/ext/pg_query/include/catalog/pg_namespace_d.h +34 -0
- data/ext/pg_query/include/catalog/pg_opclass.h +85 -0
- data/ext/pg_query/include/catalog/pg_opclass_d.h +49 -0
- data/ext/pg_query/include/catalog/pg_operator.h +102 -0
- data/ext/pg_query/include/catalog/pg_operator_d.h +106 -0
- data/ext/pg_query/include/catalog/pg_opfamily.h +60 -0
- data/ext/pg_query/include/catalog/pg_opfamily_d.h +47 -0
- data/ext/pg_query/include/catalog/pg_partitioned_table.h +63 -0
- data/ext/pg_query/include/catalog/pg_partitioned_table_d.h +35 -0
- data/ext/pg_query/include/catalog/pg_proc.h +211 -0
- data/ext/pg_query/include/catalog/pg_proc_d.h +99 -0
- data/ext/pg_query/include/catalog/pg_publication.h +115 -0
- data/ext/pg_query/include/catalog/pg_publication_d.h +36 -0
- data/ext/pg_query/include/catalog/pg_replication_origin.h +57 -0
- data/ext/pg_query/include/catalog/pg_replication_origin_d.h +29 -0
- data/ext/pg_query/include/catalog/pg_statistic.h +275 -0
- data/ext/pg_query/include/catalog/pg_statistic_d.h +194 -0
- data/ext/pg_query/include/catalog/pg_statistic_ext.h +74 -0
- data/ext/pg_query/include/catalog/pg_statistic_ext_d.h +40 -0
- data/ext/pg_query/include/catalog/pg_transform.h +45 -0
- data/ext/pg_query/include/catalog/pg_transform_d.h +32 -0
- data/ext/pg_query/include/catalog/pg_trigger.h +137 -0
- data/ext/pg_query/include/catalog/pg_trigger_d.h +106 -0
- data/ext/pg_query/include/catalog/pg_ts_config.h +50 -0
- data/ext/pg_query/include/catalog/pg_ts_config_d.h +32 -0
- data/ext/pg_query/include/catalog/pg_ts_dict.h +54 -0
- data/ext/pg_query/include/catalog/pg_ts_dict_d.h +33 -0
- data/ext/pg_query/include/catalog/pg_ts_parser.h +57 -0
- data/ext/pg_query/include/catalog/pg_ts_parser_d.h +35 -0
- data/ext/pg_query/include/catalog/pg_ts_template.h +48 -0
- data/ext/pg_query/include/catalog/pg_ts_template_d.h +32 -0
- data/ext/pg_query/include/catalog/pg_type.h +372 -0
- data/ext/pg_query/include/catalog/pg_type_d.h +285 -0
- data/ext/pg_query/include/catalog/storage.h +48 -0
- data/ext/pg_query/include/commands/async.h +54 -0
- data/ext/pg_query/include/commands/dbcommands.h +35 -0
- data/ext/pg_query/include/commands/defrem.h +173 -0
- data/ext/pg_query/include/commands/event_trigger.h +88 -0
- data/ext/pg_query/include/commands/explain.h +127 -0
- data/ext/pg_query/include/commands/prepare.h +61 -0
- data/ext/pg_query/include/commands/tablespace.h +67 -0
- data/ext/pg_query/include/commands/trigger.h +277 -0
- data/ext/pg_query/include/commands/user.h +37 -0
- data/ext/pg_query/include/commands/vacuum.h +293 -0
- data/ext/pg_query/include/commands/variable.h +38 -0
- data/ext/pg_query/include/common/file_perm.h +56 -0
- data/ext/pg_query/include/common/hashfn.h +104 -0
- data/ext/pg_query/include/common/ip.h +37 -0
- data/ext/pg_query/include/common/keywords.h +33 -0
- data/ext/pg_query/include/common/kwlookup.h +44 -0
- data/ext/pg_query/include/common/relpath.h +90 -0
- data/ext/pg_query/include/common/string.h +19 -0
- data/ext/pg_query/include/common/unicode_combining_table.h +196 -0
- data/ext/pg_query/include/datatype/timestamp.h +197 -0
- data/ext/pg_query/include/executor/execdesc.h +70 -0
- data/ext/pg_query/include/executor/executor.h +614 -0
- data/ext/pg_query/include/executor/functions.h +41 -0
- data/ext/pg_query/include/executor/instrument.h +101 -0
- data/ext/pg_query/include/executor/spi.h +175 -0
- data/ext/pg_query/include/executor/tablefunc.h +67 -0
- data/ext/pg_query/include/executor/tuptable.h +487 -0
- data/ext/pg_query/include/fmgr.h +775 -0
- data/ext/pg_query/include/funcapi.h +348 -0
- data/ext/pg_query/include/getaddrinfo.h +162 -0
- data/ext/pg_query/include/jit/jit.h +105 -0
- data/ext/pg_query/include/kwlist_d.h +1072 -0
- data/ext/pg_query/include/lib/ilist.h +727 -0
- data/ext/pg_query/include/lib/pairingheap.h +102 -0
- data/ext/pg_query/include/lib/simplehash.h +1059 -0
- data/ext/pg_query/include/lib/stringinfo.h +161 -0
- data/ext/pg_query/include/libpq/auth.h +29 -0
- data/ext/pg_query/include/libpq/crypt.h +46 -0
- data/ext/pg_query/include/libpq/hba.h +140 -0
- data/ext/pg_query/include/libpq/libpq-be.h +326 -0
- data/ext/pg_query/include/libpq/libpq.h +133 -0
- data/ext/pg_query/include/libpq/pqcomm.h +208 -0
- data/ext/pg_query/include/libpq/pqformat.h +210 -0
- data/ext/pg_query/include/libpq/pqsignal.h +42 -0
- data/ext/pg_query/include/mb/pg_wchar.h +672 -0
- data/ext/pg_query/include/mb/stringinfo_mb.h +24 -0
- data/ext/pg_query/include/miscadmin.h +476 -0
- data/ext/pg_query/include/nodes/bitmapset.h +122 -0
- data/ext/pg_query/include/nodes/execnodes.h +2520 -0
- data/ext/pg_query/include/nodes/extensible.h +160 -0
- data/ext/pg_query/include/nodes/lockoptions.h +61 -0
- data/ext/pg_query/include/nodes/makefuncs.h +108 -0
- data/ext/pg_query/include/nodes/memnodes.h +108 -0
- data/ext/pg_query/include/nodes/nodeFuncs.h +162 -0
- data/ext/pg_query/include/nodes/nodes.h +842 -0
- data/ext/pg_query/include/nodes/params.h +170 -0
- data/ext/pg_query/include/nodes/parsenodes.h +3579 -0
- data/ext/pg_query/include/nodes/pathnodes.h +2556 -0
- data/ext/pg_query/include/nodes/pg_list.h +605 -0
- data/ext/pg_query/include/nodes/plannodes.h +1251 -0
- data/ext/pg_query/include/nodes/primnodes.h +1541 -0
- data/ext/pg_query/include/nodes/print.h +34 -0
- data/ext/pg_query/include/nodes/tidbitmap.h +75 -0
- data/ext/pg_query/include/nodes/value.h +61 -0
- data/ext/pg_query/include/optimizer/cost.h +206 -0
- data/ext/pg_query/include/optimizer/geqo.h +88 -0
- data/ext/pg_query/include/optimizer/geqo_gene.h +45 -0
- data/ext/pg_query/include/optimizer/optimizer.h +199 -0
- data/ext/pg_query/include/optimizer/paths.h +249 -0
- data/ext/pg_query/include/optimizer/planmain.h +119 -0
- data/ext/pg_query/include/parser/analyze.h +49 -0
- data/ext/pg_query/include/parser/gram.h +1067 -0
- data/ext/pg_query/include/parser/gramparse.h +75 -0
- data/ext/pg_query/include/parser/kwlist.h +477 -0
- data/ext/pg_query/include/parser/parse_agg.h +68 -0
- data/ext/pg_query/include/parser/parse_clause.h +54 -0
- data/ext/pg_query/include/parser/parse_coerce.h +97 -0
- data/ext/pg_query/include/parser/parse_collate.h +27 -0
- data/ext/pg_query/include/parser/parse_expr.h +26 -0
- data/ext/pg_query/include/parser/parse_func.h +73 -0
- data/ext/pg_query/include/parser/parse_node.h +327 -0
- data/ext/pg_query/include/parser/parse_oper.h +67 -0
- data/ext/pg_query/include/parser/parse_relation.h +123 -0
- data/ext/pg_query/include/parser/parse_target.h +46 -0
- data/ext/pg_query/include/parser/parse_type.h +60 -0
- data/ext/pg_query/include/parser/parser.h +41 -0
- data/ext/pg_query/include/parser/parsetree.h +61 -0
- data/ext/pg_query/include/parser/scanner.h +152 -0
- data/ext/pg_query/include/parser/scansup.h +30 -0
- data/ext/pg_query/include/partitioning/partdefs.h +26 -0
- data/ext/pg_query/include/pg_config.h +989 -0
- data/ext/pg_query/include/pg_config_ext.h +8 -0
- data/ext/pg_query/include/pg_config_manual.h +350 -0
- data/ext/pg_query/include/pg_config_os.h +8 -0
- data/ext/pg_query/include/pg_getopt.h +56 -0
- data/ext/pg_query/include/pg_query.h +121 -0
- data/ext/pg_query/include/pg_query_enum_defs.c +2454 -0
- data/ext/pg_query/include/pg_query_fingerprint_conds.c +875 -0
- data/ext/pg_query/include/pg_query_fingerprint_defs.c +12413 -0
- data/ext/pg_query/include/pg_query_json_helper.c +61 -0
- data/ext/pg_query/include/pg_query_outfuncs_conds.c +686 -0
- data/ext/pg_query/include/pg_query_outfuncs_defs.c +2437 -0
- data/ext/pg_query/include/pg_query_readfuncs_conds.c +222 -0
- data/ext/pg_query/include/pg_query_readfuncs_defs.c +2878 -0
- data/ext/pg_query/include/pg_trace.h +17 -0
- data/ext/pg_query/include/pgstat.h +1487 -0
- data/ext/pg_query/include/pgtime.h +84 -0
- data/ext/pg_query/include/pl_gram.h +385 -0
- data/ext/pg_query/include/pl_reserved_kwlist.h +52 -0
- data/ext/pg_query/include/pl_reserved_kwlist_d.h +114 -0
- data/ext/pg_query/include/pl_unreserved_kwlist.h +112 -0
- data/ext/pg_query/include/pl_unreserved_kwlist_d.h +246 -0
- data/ext/pg_query/include/plerrcodes.h +990 -0
- data/ext/pg_query/include/plpgsql.h +1347 -0
- data/ext/pg_query/include/port.h +524 -0
- data/ext/pg_query/include/port/atomics.h +524 -0
- data/ext/pg_query/include/port/atomics/arch-arm.h +26 -0
- data/ext/pg_query/include/port/atomics/arch-ppc.h +254 -0
- data/ext/pg_query/include/port/atomics/arch-x86.h +252 -0
- data/ext/pg_query/include/port/atomics/fallback.h +170 -0
- data/ext/pg_query/include/port/atomics/generic-gcc.h +286 -0
- data/ext/pg_query/include/port/atomics/generic.h +401 -0
- data/ext/pg_query/include/port/pg_bitutils.h +226 -0
- data/ext/pg_query/include/port/pg_bswap.h +161 -0
- data/ext/pg_query/include/port/pg_crc32c.h +101 -0
- data/ext/pg_query/include/portability/instr_time.h +256 -0
- data/ext/pg_query/include/postgres.h +764 -0
- data/ext/pg_query/include/postgres_ext.h +74 -0
- data/ext/pg_query/include/postmaster/autovacuum.h +83 -0
- data/ext/pg_query/include/postmaster/bgworker.h +161 -0
- data/ext/pg_query/include/postmaster/bgworker_internals.h +64 -0
- data/ext/pg_query/include/postmaster/bgwriter.h +45 -0
- data/ext/pg_query/include/postmaster/fork_process.h +17 -0
- data/ext/pg_query/include/postmaster/interrupt.h +32 -0
- data/ext/pg_query/include/postmaster/pgarch.h +39 -0
- data/ext/pg_query/include/postmaster/postmaster.h +77 -0
- data/ext/pg_query/include/postmaster/syslogger.h +98 -0
- data/ext/pg_query/include/postmaster/walwriter.h +21 -0
- data/ext/pg_query/include/protobuf-c.h +1106 -0
- data/ext/pg_query/include/protobuf-c/protobuf-c.h +1106 -0
- data/ext/pg_query/include/protobuf/pg_query.pb-c.h +10846 -0
- data/ext/pg_query/include/protobuf/pg_query.pb.h +124718 -0
- data/ext/pg_query/include/regex/regex.h +184 -0
- data/ext/pg_query/include/replication/logicallauncher.h +31 -0
- data/ext/pg_query/include/replication/logicalproto.h +110 -0
- data/ext/pg_query/include/replication/logicalworker.h +19 -0
- data/ext/pg_query/include/replication/origin.h +73 -0
- data/ext/pg_query/include/replication/reorderbuffer.h +467 -0
- data/ext/pg_query/include/replication/slot.h +219 -0
- data/ext/pg_query/include/replication/syncrep.h +115 -0
- data/ext/pg_query/include/replication/walreceiver.h +340 -0
- data/ext/pg_query/include/replication/walsender.h +74 -0
- data/ext/pg_query/include/rewrite/prs2lock.h +46 -0
- data/ext/pg_query/include/rewrite/rewriteHandler.h +40 -0
- data/ext/pg_query/include/rewrite/rewriteManip.h +87 -0
- data/ext/pg_query/include/rewrite/rewriteSupport.h +26 -0
- data/ext/pg_query/include/storage/backendid.h +37 -0
- data/ext/pg_query/include/storage/block.h +121 -0
- data/ext/pg_query/include/storage/buf.h +46 -0
- data/ext/pg_query/include/storage/bufmgr.h +292 -0
- data/ext/pg_query/include/storage/bufpage.h +459 -0
- data/ext/pg_query/include/storage/condition_variable.h +62 -0
- data/ext/pg_query/include/storage/dsm.h +61 -0
- data/ext/pg_query/include/storage/dsm_impl.h +75 -0
- data/ext/pg_query/include/storage/fd.h +168 -0
- data/ext/pg_query/include/storage/ipc.h +81 -0
- data/ext/pg_query/include/storage/item.h +19 -0
- data/ext/pg_query/include/storage/itemid.h +184 -0
- data/ext/pg_query/include/storage/itemptr.h +206 -0
- data/ext/pg_query/include/storage/large_object.h +100 -0
- data/ext/pg_query/include/storage/latch.h +190 -0
- data/ext/pg_query/include/storage/lmgr.h +114 -0
- data/ext/pg_query/include/storage/lock.h +612 -0
- data/ext/pg_query/include/storage/lockdefs.h +59 -0
- data/ext/pg_query/include/storage/lwlock.h +232 -0
- data/ext/pg_query/include/storage/lwlocknames.h +51 -0
- data/ext/pg_query/include/storage/off.h +57 -0
- data/ext/pg_query/include/storage/pg_sema.h +61 -0
- data/ext/pg_query/include/storage/pg_shmem.h +90 -0
- data/ext/pg_query/include/storage/pmsignal.h +94 -0
- data/ext/pg_query/include/storage/predicate.h +87 -0
- data/ext/pg_query/include/storage/proc.h +333 -0
- data/ext/pg_query/include/storage/proclist_types.h +51 -0
- data/ext/pg_query/include/storage/procsignal.h +75 -0
- data/ext/pg_query/include/storage/relfilenode.h +99 -0
- data/ext/pg_query/include/storage/s_lock.h +1047 -0
- data/ext/pg_query/include/storage/sharedfileset.h +45 -0
- data/ext/pg_query/include/storage/shm_mq.h +85 -0
- data/ext/pg_query/include/storage/shm_toc.h +58 -0
- data/ext/pg_query/include/storage/shmem.h +81 -0
- data/ext/pg_query/include/storage/sinval.h +153 -0
- data/ext/pg_query/include/storage/sinvaladt.h +43 -0
- data/ext/pg_query/include/storage/smgr.h +109 -0
- data/ext/pg_query/include/storage/spin.h +77 -0
- data/ext/pg_query/include/storage/standby.h +91 -0
- data/ext/pg_query/include/storage/standbydefs.h +74 -0
- data/ext/pg_query/include/storage/sync.h +62 -0
- data/ext/pg_query/include/tcop/cmdtag.h +58 -0
- data/ext/pg_query/include/tcop/cmdtaglist.h +217 -0
- data/ext/pg_query/include/tcop/deparse_utility.h +108 -0
- data/ext/pg_query/include/tcop/dest.h +149 -0
- data/ext/pg_query/include/tcop/fastpath.h +21 -0
- data/ext/pg_query/include/tcop/pquery.h +45 -0
- data/ext/pg_query/include/tcop/tcopprot.h +89 -0
- data/ext/pg_query/include/tcop/utility.h +108 -0
- data/ext/pg_query/include/tsearch/ts_cache.h +98 -0
- data/ext/pg_query/include/utils/acl.h +312 -0
- data/ext/pg_query/include/utils/aclchk_internal.h +45 -0
- data/ext/pg_query/include/utils/array.h +458 -0
- data/ext/pg_query/include/utils/builtins.h +127 -0
- data/ext/pg_query/include/utils/bytea.h +27 -0
- data/ext/pg_query/include/utils/catcache.h +231 -0
- data/ext/pg_query/include/utils/date.h +90 -0
- data/ext/pg_query/include/utils/datetime.h +343 -0
- data/ext/pg_query/include/utils/datum.h +68 -0
- data/ext/pg_query/include/utils/dsa.h +123 -0
- data/ext/pg_query/include/utils/dynahash.h +19 -0
- data/ext/pg_query/include/utils/elog.h +439 -0
- data/ext/pg_query/include/utils/errcodes.h +352 -0
- data/ext/pg_query/include/utils/expandeddatum.h +159 -0
- data/ext/pg_query/include/utils/expandedrecord.h +231 -0
- data/ext/pg_query/include/utils/float.h +356 -0
- data/ext/pg_query/include/utils/fmgroids.h +2657 -0
- data/ext/pg_query/include/utils/fmgrprotos.h +2646 -0
- data/ext/pg_query/include/utils/fmgrtab.h +48 -0
- data/ext/pg_query/include/utils/guc.h +443 -0
- data/ext/pg_query/include/utils/guc_tables.h +272 -0
- data/ext/pg_query/include/utils/hsearch.h +149 -0
- data/ext/pg_query/include/utils/inval.h +64 -0
- data/ext/pg_query/include/utils/lsyscache.h +197 -0
- data/ext/pg_query/include/utils/memdebug.h +82 -0
- data/ext/pg_query/include/utils/memutils.h +225 -0
- data/ext/pg_query/include/utils/numeric.h +76 -0
- data/ext/pg_query/include/utils/palloc.h +136 -0
- data/ext/pg_query/include/utils/partcache.h +102 -0
- data/ext/pg_query/include/utils/pg_locale.h +119 -0
- data/ext/pg_query/include/utils/pg_lsn.h +29 -0
- data/ext/pg_query/include/utils/pidfile.h +56 -0
- data/ext/pg_query/include/utils/plancache.h +235 -0
- data/ext/pg_query/include/utils/portal.h +241 -0
- data/ext/pg_query/include/utils/probes.h +114 -0
- data/ext/pg_query/include/utils/ps_status.h +25 -0
- data/ext/pg_query/include/utils/queryenvironment.h +74 -0
- data/ext/pg_query/include/utils/regproc.h +28 -0
- data/ext/pg_query/include/utils/rel.h +644 -0
- data/ext/pg_query/include/utils/relcache.h +151 -0
- data/ext/pg_query/include/utils/reltrigger.h +81 -0
- data/ext/pg_query/include/utils/resowner.h +86 -0
- data/ext/pg_query/include/utils/rls.h +50 -0
- data/ext/pg_query/include/utils/ruleutils.h +44 -0
- data/ext/pg_query/include/utils/sharedtuplestore.h +61 -0
- data/ext/pg_query/include/utils/snapmgr.h +158 -0
- data/ext/pg_query/include/utils/snapshot.h +206 -0
- data/ext/pg_query/include/utils/sortsupport.h +276 -0
- data/ext/pg_query/include/utils/syscache.h +219 -0
- data/ext/pg_query/include/utils/timeout.h +88 -0
- data/ext/pg_query/include/utils/timestamp.h +116 -0
- data/ext/pg_query/include/utils/tuplesort.h +277 -0
- data/ext/pg_query/include/utils/tuplestore.h +91 -0
- data/ext/pg_query/include/utils/typcache.h +202 -0
- data/ext/pg_query/include/utils/tzparser.h +39 -0
- data/ext/pg_query/include/utils/varlena.h +39 -0
- data/ext/pg_query/include/utils/xml.h +84 -0
- data/ext/pg_query/include/xxhash.h +5445 -0
- data/ext/pg_query/include/xxhash/xxhash.h +5445 -0
- data/ext/pg_query/pg_query.c +104 -0
- data/ext/pg_query/pg_query.pb-c.c +37628 -0
- data/ext/pg_query/pg_query_deparse.c +9959 -0
- data/ext/pg_query/pg_query_fingerprint.c +295 -0
- data/ext/pg_query/pg_query_fingerprint.h +8 -0
- data/ext/pg_query/pg_query_internal.h +24 -0
- data/ext/pg_query/pg_query_json_plpgsql.c +738 -0
- data/ext/pg_query/pg_query_json_plpgsql.h +9 -0
- data/ext/pg_query/pg_query_normalize.c +439 -0
- data/ext/pg_query/pg_query_outfuncs.h +10 -0
- data/ext/pg_query/pg_query_outfuncs_json.c +297 -0
- data/ext/pg_query/pg_query_outfuncs_protobuf.c +237 -0
- data/ext/pg_query/pg_query_parse.c +148 -0
- data/ext/pg_query/pg_query_parse_plpgsql.c +460 -0
- data/ext/pg_query/pg_query_readfuncs.h +11 -0
- data/ext/pg_query/pg_query_readfuncs_protobuf.c +142 -0
- data/ext/pg_query/pg_query_ruby.c +108 -12
- data/ext/pg_query/pg_query_scan.c +173 -0
- data/ext/pg_query/pg_query_split.c +221 -0
- data/ext/pg_query/protobuf-c.c +3660 -0
- data/ext/pg_query/src_backend_catalog_namespace.c +1051 -0
- data/ext/pg_query/src_backend_catalog_pg_proc.c +142 -0
- data/ext/pg_query/src_backend_commands_define.c +117 -0
- data/ext/pg_query/src_backend_libpq_pqcomm.c +651 -0
- data/ext/pg_query/src_backend_nodes_bitmapset.c +513 -0
- data/ext/pg_query/src_backend_nodes_copyfuncs.c +6013 -0
- data/ext/pg_query/src_backend_nodes_equalfuncs.c +4003 -0
- data/ext/pg_query/src_backend_nodes_extensible.c +99 -0
- data/ext/pg_query/src_backend_nodes_list.c +922 -0
- data/ext/pg_query/src_backend_nodes_makefuncs.c +417 -0
- data/ext/pg_query/src_backend_nodes_nodeFuncs.c +1363 -0
- data/ext/pg_query/src_backend_nodes_value.c +84 -0
- data/ext/pg_query/src_backend_parser_gram.c +47456 -0
- data/ext/pg_query/src_backend_parser_parse_expr.c +313 -0
- data/ext/pg_query/src_backend_parser_parser.c +497 -0
- data/ext/pg_query/src_backend_parser_scan.c +7091 -0
- data/ext/pg_query/src_backend_parser_scansup.c +160 -0
- data/ext/pg_query/src_backend_postmaster_postmaster.c +2230 -0
- data/ext/pg_query/src_backend_storage_ipc_ipc.c +192 -0
- data/ext/pg_query/src_backend_storage_lmgr_s_lock.c +370 -0
- data/ext/pg_query/src_backend_tcop_postgres.c +776 -0
- data/ext/pg_query/src_backend_utils_adt_datum.c +326 -0
- data/ext/pg_query/src_backend_utils_adt_expandeddatum.c +98 -0
- data/ext/pg_query/src_backend_utils_adt_format_type.c +136 -0
- data/ext/pg_query/src_backend_utils_adt_ruleutils.c +1683 -0
- data/ext/pg_query/src_backend_utils_error_assert.c +74 -0
- data/ext/pg_query/src_backend_utils_error_elog.c +1748 -0
- data/ext/pg_query/src_backend_utils_fmgr_fmgr.c +570 -0
- data/ext/pg_query/src_backend_utils_hash_dynahash.c +1086 -0
- data/ext/pg_query/src_backend_utils_init_globals.c +168 -0
- data/ext/pg_query/src_backend_utils_mb_mbutils.c +839 -0
- data/ext/pg_query/src_backend_utils_misc_guc.c +1831 -0
- data/ext/pg_query/src_backend_utils_mmgr_aset.c +1560 -0
- data/ext/pg_query/src_backend_utils_mmgr_mcxt.c +1006 -0
- data/ext/pg_query/src_common_encnames.c +158 -0
- data/ext/pg_query/src_common_keywords.c +39 -0
- data/ext/pg_query/src_common_kwlist_d.h +1081 -0
- data/ext/pg_query/src_common_kwlookup.c +91 -0
- data/ext/pg_query/src_common_psprintf.c +158 -0
- data/ext/pg_query/src_common_string.c +86 -0
- data/ext/pg_query/src_common_stringinfo.c +336 -0
- data/ext/pg_query/src_common_wchar.c +1651 -0
- data/ext/pg_query/src_pl_plpgsql_src_pl_comp.c +1133 -0
- data/ext/pg_query/src_pl_plpgsql_src_pl_funcs.c +877 -0
- data/ext/pg_query/src_pl_plpgsql_src_pl_gram.c +6533 -0
- data/ext/pg_query/src_pl_plpgsql_src_pl_handler.c +107 -0
- data/ext/pg_query/src_pl_plpgsql_src_pl_reserved_kwlist_d.h +123 -0
- data/ext/pg_query/src_pl_plpgsql_src_pl_scanner.c +671 -0
- data/ext/pg_query/src_pl_plpgsql_src_pl_unreserved_kwlist_d.h +255 -0
- data/ext/pg_query/src_port_erand48.c +127 -0
- data/ext/pg_query/src_port_pg_bitutils.c +246 -0
- data/ext/pg_query/src_port_pgsleep.c +69 -0
- data/ext/pg_query/src_port_pgstrcasecmp.c +83 -0
- data/ext/pg_query/src_port_qsort.c +240 -0
- data/ext/pg_query/src_port_random.c +31 -0
- data/ext/pg_query/src_port_snprintf.c +1449 -0
- data/ext/pg_query/src_port_strerror.c +324 -0
- data/ext/pg_query/src_port_strnlen.c +39 -0
- data/ext/pg_query/xxhash.c +43 -0
- data/lib/pg_query.rb +7 -4
- data/lib/pg_query/constants.rb +21 -0
- data/lib/pg_query/deparse.rb +15 -1581
- data/lib/pg_query/filter_columns.rb +88 -85
- data/lib/pg_query/fingerprint.rb +122 -87
- data/lib/pg_query/json_field_names.rb +1402 -0
- data/lib/pg_query/node.rb +31 -0
- data/lib/pg_query/param_refs.rb +42 -37
- data/lib/pg_query/parse.rb +220 -203
- data/lib/pg_query/parse_error.rb +1 -1
- data/lib/pg_query/pg_query_pb.rb +3211 -0
- data/lib/pg_query/scan.rb +23 -0
- data/lib/pg_query/treewalker.rb +24 -40
- data/lib/pg_query/truncate.rb +71 -42
- data/lib/pg_query/version.rb +2 -2
- metadata +472 -11
- data/ext/pg_query/pg_query_ruby.h +0 -10
- data/lib/pg_query/deep_dup.rb +0 -16
- data/lib/pg_query/deparse/alter_table.rb +0 -42
- data/lib/pg_query/deparse/interval.rb +0 -105
- data/lib/pg_query/deparse/keywords.rb +0 -159
- data/lib/pg_query/deparse/rename.rb +0 -41
- data/lib/pg_query/legacy_parsetree.rb +0 -109
- data/lib/pg_query/node_types.rb +0 -296
@@ -0,0 +1,26 @@
|
|
1
|
+
/*-------------------------------------------------------------------------
|
2
|
+
*
|
3
|
+
* arch-arm.h
|
4
|
+
* Atomic operations considerations specific to ARM
|
5
|
+
*
|
6
|
+
* Portions Copyright (c) 2013-2020, PostgreSQL Global Development Group
|
7
|
+
*
|
8
|
+
* NOTES:
|
9
|
+
*
|
10
|
+
* src/include/port/atomics/arch-arm.h
|
11
|
+
*
|
12
|
+
*-------------------------------------------------------------------------
|
13
|
+
*/
|
14
|
+
|
15
|
+
/* intentionally no include guards, should only be included by atomics.h */
|
16
|
+
#ifndef INSIDE_ATOMICS_H
|
17
|
+
#error "should be included via atomics.h"
|
18
|
+
#endif
|
19
|
+
|
20
|
+
/*
|
21
|
+
* 64 bit atomics on ARM32 are implemented using kernel fallbacks and thus
|
22
|
+
* might be slow, so disable entirely. On ARM64 that problem doesn't exist.
|
23
|
+
*/
|
24
|
+
#if !defined(__aarch64__) && !defined(__aarch64)
|
25
|
+
#define PG_DISABLE_64_BIT_ATOMICS
|
26
|
+
#endif /* __aarch64__ || __aarch64 */
|
@@ -0,0 +1,254 @@
|
|
1
|
+
/*-------------------------------------------------------------------------
|
2
|
+
*
|
3
|
+
* arch-ppc.h
|
4
|
+
* Atomic operations considerations specific to PowerPC
|
5
|
+
*
|
6
|
+
* Portions Copyright (c) 1996-2020, PostgreSQL Global Development Group
|
7
|
+
* Portions Copyright (c) 1994, Regents of the University of California
|
8
|
+
*
|
9
|
+
* NOTES:
|
10
|
+
*
|
11
|
+
* src/include/port/atomics/arch-ppc.h
|
12
|
+
*
|
13
|
+
*-------------------------------------------------------------------------
|
14
|
+
*/
|
15
|
+
|
16
|
+
#if defined(__GNUC__)
|
17
|
+
|
18
|
+
/*
|
19
|
+
* lwsync orders loads with respect to each other, and similarly with stores.
|
20
|
+
* But a load can be performed before a subsequent store, so sync must be used
|
21
|
+
* for a full memory barrier.
|
22
|
+
*/
|
23
|
+
#define pg_memory_barrier_impl() __asm__ __volatile__ ("sync" : : : "memory")
|
24
|
+
#define pg_read_barrier_impl() __asm__ __volatile__ ("lwsync" : : : "memory")
|
25
|
+
#define pg_write_barrier_impl() __asm__ __volatile__ ("lwsync" : : : "memory")
|
26
|
+
#endif
|
27
|
+
|
28
|
+
#define PG_HAVE_ATOMIC_U32_SUPPORT
|
29
|
+
typedef struct pg_atomic_uint32
|
30
|
+
{
|
31
|
+
volatile uint32 value;
|
32
|
+
} pg_atomic_uint32;
|
33
|
+
|
34
|
+
/* 64bit atomics are only supported in 64bit mode */
|
35
|
+
#if SIZEOF_VOID_P >= 8
|
36
|
+
#define PG_HAVE_ATOMIC_U64_SUPPORT
|
37
|
+
typedef struct pg_atomic_uint64
|
38
|
+
{
|
39
|
+
volatile uint64 value pg_attribute_aligned(8);
|
40
|
+
} pg_atomic_uint64;
|
41
|
+
|
42
|
+
#endif
|
43
|
+
|
44
|
+
/*
|
45
|
+
* This mimics gcc __atomic_compare_exchange_n(..., __ATOMIC_SEQ_CST), but
|
46
|
+
* code generation differs at the end. __atomic_compare_exchange_n():
|
47
|
+
* 100: isync
|
48
|
+
* 104: mfcr r3
|
49
|
+
* 108: rlwinm r3,r3,3,31,31
|
50
|
+
* 10c: bne 120 <.eb+0x10>
|
51
|
+
* 110: clrldi r3,r3,63
|
52
|
+
* 114: addi r1,r1,112
|
53
|
+
* 118: blr
|
54
|
+
* 11c: nop
|
55
|
+
* 120: clrldi r3,r3,63
|
56
|
+
* 124: stw r9,0(r4)
|
57
|
+
* 128: addi r1,r1,112
|
58
|
+
* 12c: blr
|
59
|
+
*
|
60
|
+
* This:
|
61
|
+
* f0: isync
|
62
|
+
* f4: mfcr r9
|
63
|
+
* f8: rldicl. r3,r9,35,63
|
64
|
+
* fc: bne 104 <.eb>
|
65
|
+
* 100: stw r10,0(r4)
|
66
|
+
* 104: addi r1,r1,112
|
67
|
+
* 108: blr
|
68
|
+
*
|
69
|
+
* This implementation may or may not have materially different performance.
|
70
|
+
* It's not exploiting the fact that cr0 still holds the relevant comparison
|
71
|
+
* bits, set during the __asm__. One could fix that by moving more code into
|
72
|
+
* the __asm__. (That would remove the freedom to eliminate dead stores when
|
73
|
+
* the caller ignores "expected", but few callers do.)
|
74
|
+
*
|
75
|
+
* Recognizing constant "newval" would be superfluous, because there's no
|
76
|
+
* immediate-operand version of stwcx.
|
77
|
+
*/
|
78
|
+
#define PG_HAVE_ATOMIC_COMPARE_EXCHANGE_U32
|
79
|
+
static inline bool
|
80
|
+
pg_atomic_compare_exchange_u32_impl(volatile pg_atomic_uint32 *ptr,
|
81
|
+
uint32 *expected, uint32 newval)
|
82
|
+
{
|
83
|
+
uint32 found;
|
84
|
+
uint32 condition_register;
|
85
|
+
bool ret;
|
86
|
+
|
87
|
+
#ifdef HAVE_I_CONSTRAINT__BUILTIN_CONSTANT_P
|
88
|
+
if (__builtin_constant_p(*expected) &&
|
89
|
+
(int32) *expected <= PG_INT16_MAX &&
|
90
|
+
(int32) *expected >= PG_INT16_MIN)
|
91
|
+
__asm__ __volatile__(
|
92
|
+
" sync \n"
|
93
|
+
" lwarx %0,0,%5 \n"
|
94
|
+
" cmpwi %0,%3 \n"
|
95
|
+
" bne $+12 \n" /* branch to isync */
|
96
|
+
" stwcx. %4,0,%5 \n"
|
97
|
+
" bne $-16 \n" /* branch to lwarx */
|
98
|
+
" isync \n"
|
99
|
+
" mfcr %1 \n"
|
100
|
+
: "=&r"(found), "=r"(condition_register), "+m"(ptr->value)
|
101
|
+
: "i"(*expected), "r"(newval), "r"(&ptr->value)
|
102
|
+
: "memory", "cc");
|
103
|
+
else
|
104
|
+
#endif
|
105
|
+
__asm__ __volatile__(
|
106
|
+
" sync \n"
|
107
|
+
" lwarx %0,0,%5 \n"
|
108
|
+
" cmpw %0,%3 \n"
|
109
|
+
" bne $+12 \n" /* branch to isync */
|
110
|
+
" stwcx. %4,0,%5 \n"
|
111
|
+
" bne $-16 \n" /* branch to lwarx */
|
112
|
+
" isync \n"
|
113
|
+
" mfcr %1 \n"
|
114
|
+
: "=&r"(found), "=r"(condition_register), "+m"(ptr->value)
|
115
|
+
: "r"(*expected), "r"(newval), "r"(&ptr->value)
|
116
|
+
: "memory", "cc");
|
117
|
+
|
118
|
+
ret = (condition_register >> 29) & 1; /* test eq bit of cr0 */
|
119
|
+
if (!ret)
|
120
|
+
*expected = found;
|
121
|
+
return ret;
|
122
|
+
}
|
123
|
+
|
124
|
+
/*
|
125
|
+
* This mirrors gcc __sync_fetch_and_add().
|
126
|
+
*
|
127
|
+
* Like tas(), use constraint "=&b" to avoid allocating r0.
|
128
|
+
*/
|
129
|
+
#define PG_HAVE_ATOMIC_FETCH_ADD_U32
|
130
|
+
static inline uint32
|
131
|
+
pg_atomic_fetch_add_u32_impl(volatile pg_atomic_uint32 *ptr, int32 add_)
|
132
|
+
{
|
133
|
+
uint32 _t;
|
134
|
+
uint32 res;
|
135
|
+
|
136
|
+
#ifdef HAVE_I_CONSTRAINT__BUILTIN_CONSTANT_P
|
137
|
+
if (__builtin_constant_p(add_) &&
|
138
|
+
add_ <= PG_INT16_MAX && add_ >= PG_INT16_MIN)
|
139
|
+
__asm__ __volatile__(
|
140
|
+
" sync \n"
|
141
|
+
" lwarx %1,0,%4 \n"
|
142
|
+
" addi %0,%1,%3 \n"
|
143
|
+
" stwcx. %0,0,%4 \n"
|
144
|
+
" bne $-12 \n" /* branch to lwarx */
|
145
|
+
" isync \n"
|
146
|
+
: "=&r"(_t), "=&b"(res), "+m"(ptr->value)
|
147
|
+
: "i"(add_), "r"(&ptr->value)
|
148
|
+
: "memory", "cc");
|
149
|
+
else
|
150
|
+
#endif
|
151
|
+
__asm__ __volatile__(
|
152
|
+
" sync \n"
|
153
|
+
" lwarx %1,0,%4 \n"
|
154
|
+
" add %0,%1,%3 \n"
|
155
|
+
" stwcx. %0,0,%4 \n"
|
156
|
+
" bne $-12 \n" /* branch to lwarx */
|
157
|
+
" isync \n"
|
158
|
+
: "=&r"(_t), "=&r"(res), "+m"(ptr->value)
|
159
|
+
: "r"(add_), "r"(&ptr->value)
|
160
|
+
: "memory", "cc");
|
161
|
+
|
162
|
+
return res;
|
163
|
+
}
|
164
|
+
|
165
|
+
#ifdef PG_HAVE_ATOMIC_U64_SUPPORT
|
166
|
+
|
167
|
+
#define PG_HAVE_ATOMIC_COMPARE_EXCHANGE_U64
|
168
|
+
static inline bool
|
169
|
+
pg_atomic_compare_exchange_u64_impl(volatile pg_atomic_uint64 *ptr,
|
170
|
+
uint64 *expected, uint64 newval)
|
171
|
+
{
|
172
|
+
uint64 found;
|
173
|
+
uint32 condition_register;
|
174
|
+
bool ret;
|
175
|
+
|
176
|
+
/* Like u32, but s/lwarx/ldarx/; s/stwcx/stdcx/; s/cmpw/cmpd/ */
|
177
|
+
#ifdef HAVE_I_CONSTRAINT__BUILTIN_CONSTANT_P
|
178
|
+
if (__builtin_constant_p(*expected) &&
|
179
|
+
(int64) *expected <= PG_INT16_MAX &&
|
180
|
+
(int64) *expected >= PG_INT16_MIN)
|
181
|
+
__asm__ __volatile__(
|
182
|
+
" sync \n"
|
183
|
+
" ldarx %0,0,%5 \n"
|
184
|
+
" cmpdi %0,%3 \n"
|
185
|
+
" bne $+12 \n" /* branch to isync */
|
186
|
+
" stdcx. %4,0,%5 \n"
|
187
|
+
" bne $-16 \n" /* branch to ldarx */
|
188
|
+
" isync \n"
|
189
|
+
" mfcr %1 \n"
|
190
|
+
: "=&r"(found), "=r"(condition_register), "+m"(ptr->value)
|
191
|
+
: "i"(*expected), "r"(newval), "r"(&ptr->value)
|
192
|
+
: "memory", "cc");
|
193
|
+
else
|
194
|
+
#endif
|
195
|
+
__asm__ __volatile__(
|
196
|
+
" sync \n"
|
197
|
+
" ldarx %0,0,%5 \n"
|
198
|
+
" cmpd %0,%3 \n"
|
199
|
+
" bne $+12 \n" /* branch to isync */
|
200
|
+
" stdcx. %4,0,%5 \n"
|
201
|
+
" bne $-16 \n" /* branch to ldarx */
|
202
|
+
" isync \n"
|
203
|
+
" mfcr %1 \n"
|
204
|
+
: "=&r"(found), "=r"(condition_register), "+m"(ptr->value)
|
205
|
+
: "r"(*expected), "r"(newval), "r"(&ptr->value)
|
206
|
+
: "memory", "cc");
|
207
|
+
|
208
|
+
ret = (condition_register >> 29) & 1; /* test eq bit of cr0 */
|
209
|
+
if (!ret)
|
210
|
+
*expected = found;
|
211
|
+
return ret;
|
212
|
+
}
|
213
|
+
|
214
|
+
#define PG_HAVE_ATOMIC_FETCH_ADD_U64
|
215
|
+
static inline uint64
|
216
|
+
pg_atomic_fetch_add_u64_impl(volatile pg_atomic_uint64 *ptr, int64 add_)
|
217
|
+
{
|
218
|
+
uint64 _t;
|
219
|
+
uint64 res;
|
220
|
+
|
221
|
+
/* Like u32, but s/lwarx/ldarx/; s/stwcx/stdcx/ */
|
222
|
+
#ifdef HAVE_I_CONSTRAINT__BUILTIN_CONSTANT_P
|
223
|
+
if (__builtin_constant_p(add_) &&
|
224
|
+
add_ <= PG_INT16_MAX && add_ >= PG_INT16_MIN)
|
225
|
+
__asm__ __volatile__(
|
226
|
+
" sync \n"
|
227
|
+
" ldarx %1,0,%4 \n"
|
228
|
+
" addi %0,%1,%3 \n"
|
229
|
+
" stdcx. %0,0,%4 \n"
|
230
|
+
" bne $-12 \n" /* branch to ldarx */
|
231
|
+
" isync \n"
|
232
|
+
: "=&r"(_t), "=&b"(res), "+m"(ptr->value)
|
233
|
+
: "i"(add_), "r"(&ptr->value)
|
234
|
+
: "memory", "cc");
|
235
|
+
else
|
236
|
+
#endif
|
237
|
+
__asm__ __volatile__(
|
238
|
+
" sync \n"
|
239
|
+
" ldarx %1,0,%4 \n"
|
240
|
+
" add %0,%1,%3 \n"
|
241
|
+
" stdcx. %0,0,%4 \n"
|
242
|
+
" bne $-12 \n" /* branch to ldarx */
|
243
|
+
" isync \n"
|
244
|
+
: "=&r"(_t), "=&r"(res), "+m"(ptr->value)
|
245
|
+
: "r"(add_), "r"(&ptr->value)
|
246
|
+
: "memory", "cc");
|
247
|
+
|
248
|
+
return res;
|
249
|
+
}
|
250
|
+
|
251
|
+
#endif /* PG_HAVE_ATOMIC_U64_SUPPORT */
|
252
|
+
|
253
|
+
/* per architecture manual doubleword accesses have single copy atomicity */
|
254
|
+
#define PG_HAVE_8BYTE_SINGLE_COPY_ATOMICITY
|
@@ -0,0 +1,252 @@
|
|
1
|
+
/*-------------------------------------------------------------------------
|
2
|
+
*
|
3
|
+
* arch-x86.h
|
4
|
+
* Atomic operations considerations specific to intel x86
|
5
|
+
*
|
6
|
+
* Note that we actually require a 486 upwards because the 386 doesn't have
|
7
|
+
* support for xadd and cmpxchg. Given that the 386 isn't supported anywhere
|
8
|
+
* anymore that's not much of a restriction luckily.
|
9
|
+
*
|
10
|
+
* Portions Copyright (c) 1996-2020, PostgreSQL Global Development Group
|
11
|
+
* Portions Copyright (c) 1994, Regents of the University of California
|
12
|
+
*
|
13
|
+
* NOTES:
|
14
|
+
*
|
15
|
+
* src/include/port/atomics/arch-x86.h
|
16
|
+
*
|
17
|
+
*-------------------------------------------------------------------------
|
18
|
+
*/
|
19
|
+
|
20
|
+
/*
|
21
|
+
* Both 32 and 64 bit x86 do not allow loads to be reordered with other loads,
|
22
|
+
* or stores to be reordered with other stores, but a load can be performed
|
23
|
+
* before a subsequent store.
|
24
|
+
*
|
25
|
+
* Technically, some x86-ish chips support uncached memory access and/or
|
26
|
+
* special instructions that are weakly ordered. In those cases we'd need
|
27
|
+
* the read and write barriers to be lfence and sfence. But since we don't
|
28
|
+
* do those things, a compiler barrier should be enough.
|
29
|
+
*
|
30
|
+
* "lock; addl" has worked for longer than "mfence". It's also rumored to be
|
31
|
+
* faster in many scenarios.
|
32
|
+
*/
|
33
|
+
|
34
|
+
#if defined(__GNUC__) || defined(__INTEL_COMPILER)
|
35
|
+
#if defined(__i386__) || defined(__i386)
|
36
|
+
#define pg_memory_barrier_impl() \
|
37
|
+
__asm__ __volatile__ ("lock; addl $0,0(%%esp)" : : : "memory", "cc")
|
38
|
+
#elif defined(__x86_64__)
|
39
|
+
#define pg_memory_barrier_impl() \
|
40
|
+
__asm__ __volatile__ ("lock; addl $0,0(%%rsp)" : : : "memory", "cc")
|
41
|
+
#endif
|
42
|
+
#endif /* defined(__GNUC__) || defined(__INTEL_COMPILER) */
|
43
|
+
|
44
|
+
#define pg_read_barrier_impl() pg_compiler_barrier_impl()
|
45
|
+
#define pg_write_barrier_impl() pg_compiler_barrier_impl()
|
46
|
+
|
47
|
+
/*
|
48
|
+
* Provide implementation for atomics using inline assembly on x86 gcc. It's
|
49
|
+
* nice to support older gcc's and the compare/exchange implementation here is
|
50
|
+
* actually more efficient than the * __sync variant.
|
51
|
+
*/
|
52
|
+
#if defined(HAVE_ATOMICS)
|
53
|
+
|
54
|
+
#if defined(__GNUC__) || defined(__INTEL_COMPILER)
|
55
|
+
|
56
|
+
#define PG_HAVE_ATOMIC_FLAG_SUPPORT
|
57
|
+
typedef struct pg_atomic_flag
|
58
|
+
{
|
59
|
+
volatile char value;
|
60
|
+
} pg_atomic_flag;
|
61
|
+
|
62
|
+
#define PG_HAVE_ATOMIC_U32_SUPPORT
|
63
|
+
typedef struct pg_atomic_uint32
|
64
|
+
{
|
65
|
+
volatile uint32 value;
|
66
|
+
} pg_atomic_uint32;
|
67
|
+
|
68
|
+
/*
|
69
|
+
* It's too complicated to write inline asm for 64bit types on 32bit and the
|
70
|
+
* 486 can't do it anyway.
|
71
|
+
*/
|
72
|
+
#ifdef __x86_64__
|
73
|
+
#define PG_HAVE_ATOMIC_U64_SUPPORT
|
74
|
+
typedef struct pg_atomic_uint64
|
75
|
+
{
|
76
|
+
/* alignment guaranteed due to being on a 64bit platform */
|
77
|
+
volatile uint64 value;
|
78
|
+
} pg_atomic_uint64;
|
79
|
+
#endif /* __x86_64__ */
|
80
|
+
|
81
|
+
#endif /* defined(__GNUC__) || defined(__INTEL_COMPILER) */
|
82
|
+
|
83
|
+
#endif /* defined(HAVE_ATOMICS) */
|
84
|
+
|
85
|
+
#if !defined(PG_HAVE_SPIN_DELAY)
|
86
|
+
/*
|
87
|
+
* This sequence is equivalent to the PAUSE instruction ("rep" is
|
88
|
+
* ignored by old IA32 processors if the following instruction is
|
89
|
+
* not a string operation); the IA-32 Architecture Software
|
90
|
+
* Developer's Manual, Vol. 3, Section 7.7.2 describes why using
|
91
|
+
* PAUSE in the inner loop of a spin lock is necessary for good
|
92
|
+
* performance:
|
93
|
+
*
|
94
|
+
* The PAUSE instruction improves the performance of IA-32
|
95
|
+
* processors supporting Hyper-Threading Technology when
|
96
|
+
* executing spin-wait loops and other routines where one
|
97
|
+
* thread is accessing a shared lock or semaphore in a tight
|
98
|
+
* polling loop. When executing a spin-wait loop, the
|
99
|
+
* processor can suffer a severe performance penalty when
|
100
|
+
* exiting the loop because it detects a possible memory order
|
101
|
+
* violation and flushes the core processor's pipeline. The
|
102
|
+
* PAUSE instruction provides a hint to the processor that the
|
103
|
+
* code sequence is a spin-wait loop. The processor uses this
|
104
|
+
* hint to avoid the memory order violation and prevent the
|
105
|
+
* pipeline flush. In addition, the PAUSE instruction
|
106
|
+
* de-pipelines the spin-wait loop to prevent it from
|
107
|
+
* consuming execution resources excessively.
|
108
|
+
*/
|
109
|
+
#if defined(__GNUC__) || defined(__INTEL_COMPILER)
|
110
|
+
#define PG_HAVE_SPIN_DELAY
|
111
|
+
static __inline__ void
|
112
|
+
pg_spin_delay_impl(void)
|
113
|
+
{
|
114
|
+
__asm__ __volatile__(" rep; nop \n");
|
115
|
+
}
|
116
|
+
#elif defined(_MSC_VER) && defined(__x86_64__)
|
117
|
+
#define PG_HAVE_SPIN_DELAY
|
118
|
+
static __forceinline void
|
119
|
+
pg_spin_delay_impl(void)
|
120
|
+
{
|
121
|
+
_mm_pause();
|
122
|
+
}
|
123
|
+
#elif defined(_MSC_VER)
|
124
|
+
#define PG_HAVE_SPIN_DELAY
|
125
|
+
static __forceinline void
|
126
|
+
pg_spin_delay_impl(void)
|
127
|
+
{
|
128
|
+
/* See comment for gcc code. Same code, MASM syntax */
|
129
|
+
__asm rep nop;
|
130
|
+
}
|
131
|
+
#endif
|
132
|
+
#endif /* !defined(PG_HAVE_SPIN_DELAY) */
|
133
|
+
|
134
|
+
|
135
|
+
#if defined(HAVE_ATOMICS)
|
136
|
+
|
137
|
+
#if defined(__GNUC__) || defined(__INTEL_COMPILER)
|
138
|
+
|
139
|
+
#define PG_HAVE_ATOMIC_TEST_SET_FLAG
|
140
|
+
static inline bool
|
141
|
+
pg_atomic_test_set_flag_impl(volatile pg_atomic_flag *ptr)
|
142
|
+
{
|
143
|
+
register char _res = 1;
|
144
|
+
|
145
|
+
__asm__ __volatile__(
|
146
|
+
" lock \n"
|
147
|
+
" xchgb %0,%1 \n"
|
148
|
+
: "+q"(_res), "+m"(ptr->value)
|
149
|
+
:
|
150
|
+
: "memory");
|
151
|
+
return _res == 0;
|
152
|
+
}
|
153
|
+
|
154
|
+
#define PG_HAVE_ATOMIC_CLEAR_FLAG
|
155
|
+
static inline void
|
156
|
+
pg_atomic_clear_flag_impl(volatile pg_atomic_flag *ptr)
|
157
|
+
{
|
158
|
+
/*
|
159
|
+
* On a TSO architecture like x86 it's sufficient to use a compiler
|
160
|
+
* barrier to achieve release semantics.
|
161
|
+
*/
|
162
|
+
__asm__ __volatile__("" ::: "memory");
|
163
|
+
ptr->value = 0;
|
164
|
+
}
|
165
|
+
|
166
|
+
#define PG_HAVE_ATOMIC_COMPARE_EXCHANGE_U32
|
167
|
+
static inline bool
|
168
|
+
pg_atomic_compare_exchange_u32_impl(volatile pg_atomic_uint32 *ptr,
|
169
|
+
uint32 *expected, uint32 newval)
|
170
|
+
{
|
171
|
+
char ret;
|
172
|
+
|
173
|
+
/*
|
174
|
+
* Perform cmpxchg and use the zero flag which it implicitly sets when
|
175
|
+
* equal to measure the success.
|
176
|
+
*/
|
177
|
+
__asm__ __volatile__(
|
178
|
+
" lock \n"
|
179
|
+
" cmpxchgl %4,%5 \n"
|
180
|
+
" setz %2 \n"
|
181
|
+
: "=a" (*expected), "=m"(ptr->value), "=q" (ret)
|
182
|
+
: "a" (*expected), "r" (newval), "m"(ptr->value)
|
183
|
+
: "memory", "cc");
|
184
|
+
return (bool) ret;
|
185
|
+
}
|
186
|
+
|
187
|
+
#define PG_HAVE_ATOMIC_FETCH_ADD_U32
|
188
|
+
static inline uint32
|
189
|
+
pg_atomic_fetch_add_u32_impl(volatile pg_atomic_uint32 *ptr, int32 add_)
|
190
|
+
{
|
191
|
+
uint32 res;
|
192
|
+
__asm__ __volatile__(
|
193
|
+
" lock \n"
|
194
|
+
" xaddl %0,%1 \n"
|
195
|
+
: "=q"(res), "=m"(ptr->value)
|
196
|
+
: "0" (add_), "m"(ptr->value)
|
197
|
+
: "memory", "cc");
|
198
|
+
return res;
|
199
|
+
}
|
200
|
+
|
201
|
+
#ifdef __x86_64__
|
202
|
+
|
203
|
+
#define PG_HAVE_ATOMIC_COMPARE_EXCHANGE_U64
|
204
|
+
static inline bool
|
205
|
+
pg_atomic_compare_exchange_u64_impl(volatile pg_atomic_uint64 *ptr,
|
206
|
+
uint64 *expected, uint64 newval)
|
207
|
+
{
|
208
|
+
char ret;
|
209
|
+
|
210
|
+
/*
|
211
|
+
* Perform cmpxchg and use the zero flag which it implicitly sets when
|
212
|
+
* equal to measure the success.
|
213
|
+
*/
|
214
|
+
__asm__ __volatile__(
|
215
|
+
" lock \n"
|
216
|
+
" cmpxchgq %4,%5 \n"
|
217
|
+
" setz %2 \n"
|
218
|
+
: "=a" (*expected), "=m"(ptr->value), "=q" (ret)
|
219
|
+
: "a" (*expected), "r" (newval), "m"(ptr->value)
|
220
|
+
: "memory", "cc");
|
221
|
+
return (bool) ret;
|
222
|
+
}
|
223
|
+
|
224
|
+
#define PG_HAVE_ATOMIC_FETCH_ADD_U64
|
225
|
+
static inline uint64
|
226
|
+
pg_atomic_fetch_add_u64_impl(volatile pg_atomic_uint64 *ptr, int64 add_)
|
227
|
+
{
|
228
|
+
uint64 res;
|
229
|
+
__asm__ __volatile__(
|
230
|
+
" lock \n"
|
231
|
+
" xaddq %0,%1 \n"
|
232
|
+
: "=q"(res), "=m"(ptr->value)
|
233
|
+
: "0" (add_), "m"(ptr->value)
|
234
|
+
: "memory", "cc");
|
235
|
+
return res;
|
236
|
+
}
|
237
|
+
|
238
|
+
#endif /* __x86_64__ */
|
239
|
+
|
240
|
+
#endif /* defined(__GNUC__) || defined(__INTEL_COMPILER) */
|
241
|
+
|
242
|
+
/*
|
243
|
+
* 8 byte reads / writes have single-copy atomicity on 32 bit x86 platforms
|
244
|
+
* since at least the 586. As well as on all x86-64 cpus.
|
245
|
+
*/
|
246
|
+
#if defined(__i568__) || defined(__i668__) || /* gcc i586+ */ \
|
247
|
+
(defined(_M_IX86) && _M_IX86 >= 500) || /* msvc i586+ */ \
|
248
|
+
defined(__x86_64__) || defined(__x86_64) || defined(_M_X64) /* gcc, sunpro, msvc */
|
249
|
+
#define PG_HAVE_8BYTE_SINGLE_COPY_ATOMICITY
|
250
|
+
#endif /* 8 byte single-copy atomicity */
|
251
|
+
|
252
|
+
#endif /* HAVE_ATOMICS */
|